geotools实现多边形的合并&缓冲区
这算是第一次接触开源工具包,说实话刚开始有点不知所措,中途遇到很多问题的时候也感觉头皮发麻,不过很高兴自己还是坚持下来了。
geotools就不做过多的介绍了,想总结一下如何根据开源内容做自己的项目。整个过程中技术相关的内容学到了不少,但要是都写出来篇幅就太长了,所以这篇主要是写一些自己总结的开发流程上的东西。
一、 对要参考的开源项目有一个宏观的把握
geotools是一个 GIS 开源工具包,官网有入门教程和一系列的参考文档,这些东西是非常关键的,要想把geotools里面的各个jar包的作用弄明白,就要仔细的阅读这些文档。geotools的 Quickstart 讲的是如何打开一个.shp文件, eclipse版本、IDEA版本的都有。Document有Featur(要素)教程,Geometry(几何)教程,Query(查询)教程等,要注意的是最的新版本可能不支持旧版里的一些内容。
有篇博客讲了geotools的体系,非常值得参考:http://blog.csdn.net/anglestar2012/article/details/42555819
由于我要做的与几何内容联系比较大,所以着重参考了JTS Topology Suite(拓扑套件)类库,这里面的类主要是用来实现具体的几何操作,主要用到了以下三个包:
org.locationtech.jts.operation.union
org.locationtech.jts.operation.buffer
org.locationtech.jts.algorithm (PointLocator)
附上JTS的文档地址:http://locationtech.github.io/jts/javadoc/overview-summary.html
二、多看例子
一周多的时间,我几乎翻遍了网上所有与geotools有关的博客,之后试着对里面的代码进行理解和仿写。这个阶段获取的信息量非常大,有很多重复的内容,关键是要从中提取出有用的信息点。
三、分析自己项目的具体需求
刚开始领导布置任务的时候是说要导入JSON格式的数据,所以又看了相关的一些知识,包括JSON格式的特点、使用范围以及如何通过Java与javascript对它进行解析与生成。
三、下载、导入jar包,配置maven
这个项目对我来讲非常重要的一点就是学会了maven工具的使用,这个构建工具非常强大,geotools就是默认使用maven来做的。maven重点在于对pom.xml文件的配置,导入jar包后就要添加依赖。
这里附一个讲解地址:http://blog.csdn.net/u012152619/article/category/6239920
下面是我配置的pom文件:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>org.geotools</groupId>
<artifactId>buffer</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>buffer</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<geotools.version>19-SNAPSHOT</geotools.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-main</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-shapefile</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-swing</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-api</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-epsg-hsql</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-geometry</artifactId>
<version>${geotools.version}</version>
</dependency> <dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-jts-wrapper</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-geojson</artifactId>
<version>${geotools.version}</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>maven2-repository.dev.java.net</id>
<name>Java.net repository</name>
<url>http://download.java.net/maven/2</url>
</repository>
<repository>
<id>osgeo</id>
<name>Open Source Geospatial Foundation Repository</name>
<url>http://download.osgeo.org/webdav/geotools/</url>
</repository>
<repository>
<snapshots>
<enabled>true</enabled>
</snapshots>
<id>boundless</id>
<name>Boundless Maven Repository</name>
<url>http://repo.boundlessgeo.com/main</url>
</repository>
</repositories> <build>
<plugins>
<plugin>
<inherited>true</inherited>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
四、具体实现代码
以前一直在用eclipse,这次做完之后把所有内容都迁到了IDEA,熟悉新IDE也花费了不少时间。二者我觉得都很好,目前的水平也感觉不出来IDEA有网上说的那么神奇,从体验来讲只是UI上的差异,不过有一点很重要,就是IDEA的结构,它没有eclipse中Workspace的概念,在IDEA中,Project是最顶级的结构单元,然后是Module,这类项目一般按照功能划分。
这里有相关的介绍:http://blog.csdn.net/qq_35246620/article/details/65448689
package org.geotools; import java.util.ArrayList;
import java.util.List;
import org.geotools.geometry.jts.JTSFactoryFinder;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.io.WKTReader;
import com.vividsolutions.jts.algorithm.PointLocator; public class UnionPolygon {
public static void main(String[] args) {
//创建4个多边形
Coordinate[] coordinates1 = new Coordinate[] {
new Coordinate(0, 0),
new Coordinate(0, 1),
new Coordinate(1, 2),
new Coordinate(2, 1), //该点在union后会被消去
new Coordinate(2, 0),
new Coordinate(0, 0), };
Coordinate[] coordinates2 = new Coordinate[] {
new Coordinate(1, 0),
new Coordinate(1, 1), //该点在union后会被消去
new Coordinate(2, 2),
new Coordinate(3, 1),
new Coordinate(3, 0),
new Coordinate(1, 0)};
Coordinate[] coordinates3 = new Coordinate[] {
new Coordinate(0, 0),
new Coordinate(1, 0),
new Coordinate(2, 0),
new Coordinate(2, -1),
new Coordinate(0, -1),
new Coordinate(0, 0), };
Coordinate[] coordinates4 = new Coordinate[] {
new Coordinate(1, 0),
new Coordinate(2, 0),
new Coordinate(3, 0),
new Coordinate(3, -1),
new Coordinate(1, -1),
new Coordinate(1, 0)}; GeometryFactory gf=new GeometryFactory();
Geometry g1 = gf.createPolygon(coordinates1);
Geometry g2 = gf.createPolygon(coordinates2);
Geometry g3 = gf.createPolygon(coordinates3);
Geometry g4 = gf.createPolygon(coordinates4);
//两个合并
Geometry union = g1.union(g2);
Geometry union2 = union.union(g3);
//多个合并,设置多边形数组,再通过循环依次叠加各个多边形
Geometry[] geos=new Geometry[] {g1,g2,g3,g4};
Geometry allunion = geos[0];
for(int i=1; i<geos.length; i++) {
allunion=allunion.union(geos[i]);
}
System.out.println(union);
System.out.println(union2);
System.out.println(allunion); //缓冲区建立
Geometry g3buffer=g3.buffer(1); //对第三个多边形加缓冲区
Geometry allunionbuffer=allunion.buffer(1); //对全部合并后的多边形加缓冲区
System.out.println(g3buffer);
System.out.println(allunionbuffer); //点是否在多边形内判断
Coordinate point1 = new Coordinate(1, 1);
PointLocator a=new PointLocator();
boolean p1=a.intersects(point1, allunion);
if(p1)
System.out.println("point1:"+"该点在多边形内");
else
System.out.println("point1:"+"该点不在多边形内"); Coordinate point2 = new Coordinate(5, 5);
PointLocator b=new PointLocator();
boolean p2=b.intersects(point2, allunion);
if(p2)
System.out.println("point2:"+"该点在多边形内");
else
System.out.println("point2:"+"该点不在多边形内");
}
}
五、小总结
做项目的提升速度其实比纯看书是快很多的,因为会碰到很多问题。我的方法是把一天遇到的与内容相关的问题点都记下来,然后再看它们分别属于什么知识范畴,最后安排时间去查阅相关的知识,重要的(比如maven)就按照体系来学习,进行宏观把握,其他的达到能看懂、能理解、会基础操作的水平就行。还有就是多交流吧,能解决很多问题。
说到底,学习就是一个发现问题解决问题的过程,只不过这中间不同人选取的手段方法有一些差异而已。
附 shp转geojson网址:http://mapshaper.org/
地图数据:http://www.osgeo.cn/filter/2102
https://www.hcharts.cn/mapdata
geotools实现多边形的合并&缓冲区的更多相关文章
- [Boost::Polygon]多边形相减得到新的多边形序列
#include <iostream> #include <boost/polygon/polygon.hpp> #include <cassert> namesp ...
- PIE SDK缓冲区分析算法
1.算法功能简介 缓冲区分析是指有点.线.面实体为基础,自动建立其周围一定宽度范围内的缓冲区多边形图层,然后建立该图层与目标图层的叠加,进行分析而得到的所需的结果.他是用来解决邻近度问题的控件分析工具 ...
- (数据科学学习手札84)基于geopandas的空间数据分析——空间计算篇(上)
本文示例代码.数据及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在本系列之前的文章中我们主要讨论了g ...
- 细说WebSocket - Node篇
在上一篇提高到了 web 通信的各种方式,包括 轮询.长连接 以及各种 HTML5 中提到的手段.本文将详细描述 WebSocket协议 在 web通讯 中的实现. 一.WebSocket 协议 1. ...
- 新手入门:史上最全Web端即时通讯技术原理详解
前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...
- Web端即时通讯技术原理详解
前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...
- 基于web的IM软件通信原理分析
关于IM(InstantMessaging)即时通信类软件(如微信,QQ),大多数都是桌面应用程序或者native应用较为流行,而网上关于原生IM或桌面IM软件类的通信原理介绍也较多,此处不再赘述.而 ...
- i3D的一篇Unity教程中的笔记
原地址:http://blog.sina.com.cn/s/blog_72b936d80100wwej.html 以下是i3D的一篇Unity教程中的笔记. i3D的这篇教程是[i3D.Next-Ge ...
- Unity3d 经验小结
Unity3d 经验小结 文本教程 你是第2541个围观者 0条评论 供稿者:Jamesgary 标签:unity3d教程 Fbx.贴图导入Unity时的注意事项: 在导出Fbx之前,Maya中已 ...
随机推荐
- 一图看懂java内存模型
熟话说一张好图胜过千言万语,在此便将java内存模型重新整理了一次,将细节标注到图中献给需要的同学:
- centos6快速搭建nginx
step1:配置本地 yum库,保存 $vi /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=http://ngin ...
- Python爬虫知识点二
一.request库 import json import requests from io import BytesIO #显示各种函数相当于api # print(dir(requests)) u ...
- android自定义文本框,后面带清空按钮
android常见的带清空按钮的文本框,获得焦点时如果有内容则显示,否则不显示 package com.qc.health.weight; import com.qc.health.R; import ...
- Android CoordinatorLayout、AppBarLayout、DrawerLayout、NavigationView 的使用及问题小结
这里只对Material Design中这几种组件使用的重要部分以及容易出现问题的地方进行汇总(遇坑请直接看最后常见问题部分),详细用法请自行查阅官方文档 一.CoordinatorLayout 介绍 ...
- java String 不可变
关于String不可变的问题也看了很多,最近看了一篇讲的非常好的文章,总结如下 所谓的不可变,并非真的不可变String s = "123"; s = "456" ...
- select模型
在Windows中所有的socket函数都是阻塞类型的,也就是说只有网络中有特定的事件发生时才会返回,在没有发生事件时会一直等待,虽说我们将它们设置为非阻塞状态,但是在对于服务器段而言,肯定会一直等待 ...
- Java8函数式接口以及lambda表达式实践
罗列一下遇到可以转换成lamada表达式的场景,仅供参考,如有更好的方式,欢迎在评论区留言. 1.计算订单总金额 订单总金额一般是在后台循环叠加每个购买商品的金额已获取到,通常的方式如下 BigDec ...
- java.lang.Class类中的某些方法
反射的代码会经常遇到,Class类中方法真的多,且用的少,大多用在底层源码这块,既然看到了,就记录一下吧,说不定以后厉害了,自己封装框架,haha getComponentType()方法: Syst ...
- 【转载】从头编写 asp.net core 2.0 web api 基础框架 (5) EF CRUD
Github源码地址:https://github.com/solenovex/Building-asp.net-core-2-web-api-starter-template-from-scratc ...