Skip to content

Geotools

2023-04-06
Author:lzugis

简介

Geotools是一个符合OGC标准(也称为OpenGIS标准)的Java类库,它提供了很多的标准类来处理空间数据。OpenGIS标准是一个空间数据处理的国际标准。目前的大部分基于Java的开源GIS软件,如udig,geoserver等,都是调用GeoTools库来进行空间数据的处理。简单的说GeoTools由GeoAPIJTS(Java Topology Suite)

1、JTS-Geometry

JTS是用来做空间图形的拓扑关系判断的一个Java类库。它在GeoTools出现之前就已经存在了,所以GeoTools项目在解决空间对象拓扑判定问题的时候,就没有自己重新开发,而是直接采用了JTS,将JTS作为自己的一部分,纳入自己的体系中了。JTS解决了对象与对象之间拓扑关系的判定和计算,所以,它提供了很多算法来解决对象之间包含关系、相交关系等的拓扑关系判定问题。

1.png

1. 创建geometry

常见的geometry包括:PointLineStringPolygonMultiPointMultiLineStringMultiPolygon

1.1 创建点

java
 //通过 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 创建线

java
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 创建多边形

java
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:获取长度,线几何返回点与点之间的长度之和;闭合几何返回周长;其它返回0
  • getSRID:获取srid
  • isEmpty:判读几何是否是空,判断几何的 point.size == 0 ; 或者几何包含 empty: reader.read(“POINT EMPTY”)
  • isRectangle:判断几何是否是Polygon
  • isValid:判断几何是否符合OGC SFS规格(OGC SFS specification),例如:Polygon是否自相交等
  • getCentroid: 获取中心点
  • getCoordinates:获取coordinate数据
  • getEnvelope:获取边界
  • toText: 返回WKT格式数据

3. 比较和关系判断

3.1 equals

equals(Geometry g): 判断两个几何是否相等,不用于GeometryCollection。 2.jfif

3.2 disjoint

disjoint(Geometry g): 判断几何是否是不相交(脱节)的。 1.jfif

3.3 intersects

intersects(Geometry g): 判断几何是否相交。

3.4 touches

touches(Geometry g): 判断几何是否接触。 3.jfif

3.5 crosses

crosses(Geometry g): 判断几何是否交叉 4.jfif

3.6 within

within(Geometry g): 判断当前几何是否在指定的几何内部. 5.jfif

3.7 contains

contains(Geometry g): 判断当前几何包含g几何. 6.jfif

3.8 overlaps

overlaps(Geometry g): 判断当前几何与参数g几何是否部分重叠 7.jfif

3.9 relate

relate(Geometry g, String intersectionPattern): 判断当前几何与参数几何是否符合输入的 DE-9IM.

4. 空间关系计算

4.1 intersection

intersection(Geometry other): 返回当前几何与输入几何相交的几何数据。 8.jfif

4.2 difference

difference(Geometry other): 计算差异几何,差异分析,返回other与当前几何不同的几何数据 9.jfif

4.3 union

union(Geometry other): 合并几何 10.jfif

4.4 symDifference

symDifference(Geometry other): 对称差异分析,排除一样(重叠)的几何,将当前与other不一样的几何合集返回 11.jfif

4.5 buffer

buffer(double distance): 计算缓冲区 12.jfif

buffer(double distance, int quadrantSegments): 加buffer,边界样式 2.jfif