Geotools
简介
Geotools是一个符合OGC标准(也称为OpenGIS标准)的Java类库,它提供了很多的标准类来处理空间数据。OpenGIS标准是一个空间数据处理的国际标准。目前的大部分基于Java的开源GIS软件,如udig,geoserver等,都是调用GeoTools库来进行空间数据的处理。简单的说GeoTools由GeoAPI,JTS(Java Topology Suite)
1、JTS-Geometry
JTS是用来做空间图形的拓扑关系判断的一个Java类库。它在GeoTools出现之前就已经存在了,所以GeoTools项目在解决空间对象拓扑判定问题的时候,就没有自己重新开发,而是直接采用了JTS,将JTS作为自己的一部分,纳入自己的体系中了。JTS解决了对象与对象之间拓扑关系的判定和计算,所以,它提供了很多算法来解决对象之间包含关系、相交关系等的拓扑关系判定问题。

1. 创建geometry
常见的geometry包括:Point、LineString、Polygon、MultiPoint、MultiLineString、MultiPolygon。
1.1 创建点
//通过 coordinate创建
GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();
Coordinate coord = new Coordinate(1, 1);
Point point = geometryFactory.createPoint(coord);
//通过wkt 创建
GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();
WKTReader reader = new WKTReader(geometryFactory);
Point point = (Point) reader.read("POINT (1 1)");1.2 创建线
GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();
Coordinate[] coords =
new Coordinate[] {new Coordinate(0, 2), new Coordinate(2, 0), new Coordinate(8, 6) };
LineString line = geometryFactory.createLineString(coordinates);
//wkt方式
GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();
WKTReader reader = new WKTReader( geometryFactory );
LineString line = (LineString) reader.read("LINESTRING(0 2, 2 0, 8 6)");1.3 创建多边形
GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();
Coordinate[] coords =
new Coordinate[] {new Coordinate(4, 0), new Coordinate(2, 2),
new Coordinate(4, 4), new Coordinate(6, 2), new Coordinate(4, 0) };
LinearRing ring = geometryFactory.createLinearRing( coords );
LinearRing holes[] = null; // use LinearRing[] to represent holes
Polygon polygon = geometryFactory.createPolygon(ring, holes );
//wkt方式
GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory( null );
WKTReader reader = new WKTReader( geometryFactory );
Polygon polygon = (Polygon) reader.read("POLYGON((20 10, 30 0, 40 10, 30 20, 20 10))");2. 基础方法
getLength:获取长度,线几何返回点与点之间的长度之和;闭合几何返回周长;其它返回0getSRID:获取sridisEmpty:判读几何是否是空,判断几何的 point.size == 0 ; 或者几何包含 empty: reader.read(“POINT EMPTY”)isRectangle:判断几何是否是PolygonisValid:判断几何是否符合OGC SFS规格(OGC SFS specification),例如:Polygon是否自相交等getCentroid: 获取中心点getCoordinates:获取coordinate数据getEnvelope:获取边界toText: 返回WKT格式数据
3. 比较和关系判断
3.1 equals
equals(Geometry g): 判断两个几何是否相等,不用于GeometryCollection。
3.2 disjoint
disjoint(Geometry g): 判断几何是否是不相交(脱节)的。
3.3 intersects
intersects(Geometry g): 判断几何是否相交。
3.4 touches
touches(Geometry g): 判断几何是否接触。
3.5 crosses
crosses(Geometry g): 判断几何是否交叉
3.6 within
within(Geometry g): 判断当前几何是否在指定的几何内部.
3.7 contains
contains(Geometry g): 判断当前几何包含g几何.
3.8 overlaps
overlaps(Geometry g): 判断当前几何与参数g几何是否部分重叠
3.9 relate
relate(Geometry g, String intersectionPattern): 判断当前几何与参数几何是否符合输入的 DE-9IM.
4. 空间关系计算
4.1 intersection
intersection(Geometry other): 返回当前几何与输入几何相交的几何数据。
4.2 difference
difference(Geometry other): 计算差异几何,差异分析,返回other与当前几何不同的几何数据
4.3 union
union(Geometry other): 合并几何
4.4 symDifference
symDifference(Geometry other): 对称差异分析,排除一样(重叠)的几何,将当前与other不一样的几何合集返回
4.5 buffer
buffer(double distance): 计算缓冲区
buffer(double distance, int quadrantSegments): 加buffer,边界样式 
