项目地址: https://github.com/locationtech/jts
Maven Central: org.locationtech.jts:jts-core
许可证: Eclipse Public License 2.0 / Eclipse Distribution License 1.0(BSD 风格)
Javadoc: https://locationtech.github.io/jts/javadoc
概述
JTS Topology Suite(简称 JTS)是 LocationTech 项目组下的开源 Java 二维矢量几何库,是 GeoTools、GeoServer 等众多开源 GIS 项目的几何计算核心。它提供:
- 几何对象模型:Point、LineString、Polygon、MultiPoint、MultiLineString、MultiPolygon、GeometryCollection
- 空间关系判断:equals、contains、within、intersects、touches、crosses、overlaps、disjoint、relate(DE-9IM)
- 集合运算:intersection、union、difference、symDifference、buffer
- 几何分析:convexHull、centroid、area、length、distance、isValid、simplify
- 线性参考:沿线距离定位、线上插值
- 空间索引:STRtree、Quadtree,加速批量空间查询
- 格式读写:WKT、WKB、GeoJSON
环境要求: JDK 8+
快速集成
Maven
<properties>
<jts.version><!-- 请查看 Maven Central 获取最新版:https://central.sonatype.com/artifact/org.locationtech.jts/jts-core --></jts.version>
</properties>
<dependency>
<groupId>org.locationtech.jts</groupId>
<artifactId>jts-core</artifactId>
<version>${jts.version}</version>
</dependency>
如需 GeoJSON 等 I/O 支持:
<dependency>
<groupId>org.locationtech.jts.io</groupId>
<artifactId>jts-io-common</artifactId>
<version>${jts.version}</version>
</dependency>
Gradle
implementation 'org.locationtech.jts:jts-core:1.20.0'
implementation 'org.locationtech.jts.io:jts-io-common:1.20.0'
项目模块一览
| 模块 |
artifactId |
用途 |
| jts-core |
jts-core |
★ 核心——几何模型、算法、空间操作、索引 |
| jts-io-common |
jts-io-common |
通用 I/O:WKT、WKB、GeoJSON 读写 |
| jts-io-ora |
jts-io-ora |
Oracle Spatial SDO_GEOMETRY 读写 |
| jts-io-sde |
jts-io-sde |
ArcSDE 几何读写 |
核心类一览
| 类 |
包 |
用途 |
GeometryFactory |
org.locationtech.jts.geom |
★ 推荐入口——创建所有几何对象的工厂 |
Geometry |
org.locationtech.jts.geom |
几何抽象基类,提供空间操作与关系判断方法 |
Point |
org.locationtech.jts.geom |
点(0 维) |
LineString |
org.locationtech.jts.geom |
线串(1 维) |
LinearRing |
org.locationtech.jts.geom |
闭合线环(用于构建 Polygon) |
Polygon |
org.locationtech.jts.geom |
面(2 维,含外环与可选内环) |
MultiPoint |
org.locationtech.jts.geom |
多点集合 |
MultiLineString |
org.locationtech.jts.geom |
多线集合 |
MultiPolygon |
org.locationtech.jts.geom |
多面集合 |
GeometryCollection |
org.locationtech.jts.geom |
任意几何集合 |
Coordinate |
org.locationtech.jts.geom |
坐标值(x, y, z) |
Envelope |
org.locationtech.jts.geom |
外接矩形(MBR) |
PrecisionModel |
org.locationtech.jts.geom |
坐标精度模型 |
WKTReader |
org.locationtech.jts.io |
WKT 格式解析 |
WKTWriter |
org.locationtech.jts.io |
WKT 格式输出 |
WKBReader |
org.locationtech.jts.io |
WKB 格式解析 |
WKBWriter |
org.locationtech.jts.io |
WKB 格式输出 |
GeoJsonReader |
org.locationtech.jts.io.geojson |
GeoJSON 解析 |
GeoJsonWriter |
org.locationtech.jts.io.geojson |
GeoJSON 输出 |
STRtree |
org.locationtech.jts.index.strtree |
R-tree 空间索引(批量加载,查询高效) |
Quadtree |
org.locationtech.jts.index.quadtree |
四叉树空间索引(支持动态插入删除) |
PreparedGeometry |
org.locationtech.jts.geom.prep |
预处理几何,加速重复空间关系判断 |
PreparedGeometryFactory |
org.locationtech.jts.geom.prep |
创建 PreparedGeometry 的工厂 |
BufferOp |
org.locationtech.jts.operation.buffer |
缓冲区运算(可精细控制端头、连接样式) |
OverlayNGRobust |
org.locationtech.jts.operation.overlayng |
鲁棒叠加运算(推荐使用的新一代叠加引擎) |
TopologyPreservingSimplifier |
org.locationtech.jts.simplify |
保持拓扑的几何简化 |
DouglasPeuckerSimplifier |
org.locationtech.jts.simplify |
Douglas-Peucker 几何简化 |
IsValidOp |
org.locationtech.jts.operation.valid |
几何有效性检测 |
LengthIndexedLine |
org.locationtech.jts.linearref |
按长度进行线性参考 |
LocationIndexedLine |
org.locationtech.jts.linearref |
按位置进行线性参考 |
几何对象创建
import org.locationtech.jts.geom.*;
GeometryFactory gf = new GeometryFactory();
// 点
Point point = gf.createPoint(new Coordinate(116.4, 39.9));
// 带 Z 值的点
Point point3d = gf.createPoint(new Coordinate(116.4, 39.9, 50.0));
// 线串
LineString line = gf.createLineString(new Coordinate[]{
new Coordinate(0, 0),
new Coordinate(10, 10),
new Coordinate(20, 0)
});
// 线环(必须闭合)
LinearRing ring = gf.createLinearRing(new Coordinate[]{
new Coordinate(0, 0), new Coordinate(10, 0),
new Coordinate(10, 10), new Coordinate(0, 10),
new Coordinate(0, 0) // 首尾相同
});
// 面(无洞)
Polygon polygon = gf.createPolygon(new Coordinate[]{
new Coordinate(0, 0), new Coordinate(10, 0),
new Coordinate(10, 10), new Coordinate(0, 10),
new Coordinate(0, 0)
});
// 面(带洞)
LinearRing shell = gf.createLinearRing(new Coordinate[]{
new Coordinate(0, 0), new Coordinate(20, 0),
new Coordinate(20, 20), new Coordinate(0, 20),
new Coordinate(0, 0)
});
LinearRing hole = gf.createLinearRing(new Coordinate[]{
new Coordinate(5, 5), new Coordinate(15, 5),
new Coordinate(15, 15), new Coordinate(5, 15),
new Coordinate(5, 5)
});
Polygon polygonWithHole = gf.createPolygon(shell, new LinearRing[]{hole});
// 多点
MultiPoint multiPoint = gf.createMultiPointFromCoords(new Coordinate[]{
new Coordinate(1, 2), new Coordinate(3, 4)
});
// 多线
MultiLineString multiLine = gf.createMultiLineString(new LineString[]{line});
// 多面
MultiPolygon multiPolygon = gf.createMultiPolygon(new Polygon[]{polygon});
// 几何集合
GeometryCollection gc = gf.createGeometryCollection(new Geometry[]{point, line, polygon});
空间关系、集合运算、几何分析、格式读写与空间索引的完整参考见 reference/geometry-operations.md
典型应用场景
| 场景 |
关键类 / 方法 |
| 创建几何对象 |
GeometryFactory.createPoint() / createLineString() / createPolygon() |
| 地理围栏 / 点在面内判断 |
Geometry.contains() / within(),高频场景用 PreparedGeometry |
| 计算两个几何的距离 |
Geometry.distance() |
| 缓冲区分析 |
Geometry.buffer() 或 BufferOp |
| 面叠加分析(交并差) |
Geometry.intersection() / union() / difference() |
| 鲁棒叠加运算 |
OverlayNGRobust.overlay() |
| 几何格式互转 |
WKTReader / WKTWriter / WKBReader / WKBWriter / GeoJsonReader / GeoJsonWriter |
| 批量空间查询加速 |
STRtree / Quadtree |
| 最近邻搜索 |
STRtree.nearestNeighbour() |
| 几何简化(抽稀) |
TopologyPreservingSimplifier / DouglasPeuckerSimplifier |
| 几何有效性校验与修复 |
IsValidOp / GeometryFixer |
| 线性参考 / 沿线定位 |
LengthIndexedLine / LocationIndexedLine |
| 凸包计算 |
Geometry.convexHull() |
| 几何仿射变换 |
AffineTransformation |
| 数据库 WKB 交互 |
WKBReader.hexToBytes() / WKBWriter.toHex() |
常见问题
- 使用 GeometryFactory 创建几何:不要直接
new Point(),始终通过 GeometryFactory 的工厂方法创建几何对象。
- 面必须闭合:Polygon 的外环和内环坐标数组的首尾坐标必须相同。
- 坐标顺序:JTS 使用
(x, y) 即 (经度, 纬度) 的顺序,注意与某些 GIS 系统的 (纬度, 经度) 区分。
- 几何有效性:从外部导入的几何数据应使用
geometry.isValid() 检查有效性,无效几何可用 GeometryFixer.fix() 修复。
- SRID 不参与计算:JTS 的 SRID 仅作为元数据标记,不影响空间运算;JTS 所有计算都在笛卡尔平面上进行,不处理投影。
- 性能优化:批量空间查询使用
STRtree;重复空间关系判断使用 PreparedGeometry;大量几何合并使用 UnaryUnionOp。
- 线程安全:
GeometryFactory 是线程安全的;Geometry 对象本身不可变,可安全共享;但 Reader/Writer 实例非线程安全,需为每个线程创建独立实例。
- 包名迁移:JTS 1.15+ 包名由
com.vividsolutions.jts 迁移为 org.locationtech.jts,注意旧代码升级。
- OverlayNG:对于叠加运算(intersection / union / difference),推荐使用
OverlayNGRobust,它比传统叠加引擎更加鲁棒,能处理更多边界情况。
AI 使用建议
推荐工作流
- 创建几何对象:始终通过
GeometryFactory 工厂方法创建,不要直接 new
- 格式解析:从 WKT/WKB/GeoJSON 读入外部数据,使用对应的 Reader
- 空间运算:用
PreparedGeometry 加速批量 contains/intersects 判断
- 批量查询:用
STRtree 建空间索引后查询
- 结果导出:用 Writer 输出为 WKT/WKB/GeoJSON
关键注意事项
- 坐标顺序:JTS 使用
(x, y) 即 (经度, 纬度),注意与部分 GIS 系统的 (y, x) 区分
- SRID 不参与计算:JTS 所有计算在笛卡尔平面进行,不处理地球曲率
- OverlayNG 优先:叠加运算优先使用
OverlayNGRobust.overlay(),比传统方法更鲁棒
- 线程安全:
GeometryFactory 和 Geometry 线程安全;Reader/Writer 非线程安全
- 有效性检查:外部导入的几何用
isValid() 检查后用 GeometryFixer.fix() 修复
相关技能
参考资源
1---2name: jts3description: Use when performing precise 2D computational geometry in Java — spatial predicates (contains, intersects), overlay operations, buffering, triangulation. JTS (Java Topology Suite): the canonical geometry engine used as blueprint for GEOS, Shapely, and NetTopologySuite.4---56> **项目地址:** <https://github.com/locationtech/jts>7>8> **Maven Central:** `org.locationtech.jts:jts-core`9>10> **许可证:** Eclipse Public License 2.0 / Eclipse Distribution License 1.0(BSD 风格)11>12> **Javadoc:** <https://locationtech.github.io/jts/javadoc>1314## 概述1516JTS Topology Suite(简称 JTS)是 LocationTech 项目组下的开源 Java 二维矢量几何库,是 GeoTools、GeoServer 等众多开源 GIS 项目的几何计算核心。它提供:1718- **几何对象模型**:Point、LineString、Polygon、MultiPoint、MultiLineString、MultiPolygon、GeometryCollection19- **空间关系判断**:equals、contains、within、intersects、touches、crosses、overlaps、disjoint、relate(DE-9IM)20- **集合运算**:intersection、union、difference、symDifference、buffer21- **几何分析**:convexHull、centroid、area、length、distance、isValid、simplify22- **线性参考**:沿线距离定位、线上插值23- **空间索引**:STRtree、Quadtree,加速批量空间查询24- **格式读写**:WKT、WKB、GeoJSON2526**环境要求:** JDK 8+2728---2930## 快速集成3132### Maven3334```xml35<properties>36 <jts.version><!-- 请查看 Maven Central 获取最新版:https://central.sonatype.com/artifact/org.locationtech.jts/jts-core --></jts.version>37</properties>3839<dependency>40 <groupId>org.locationtech.jts</groupId>41 <artifactId>jts-core</artifactId>42 <version>${jts.version}</version>43</dependency>44```4546如需 GeoJSON 等 I/O 支持:4748```xml49<dependency>50 <groupId>org.locationtech.jts.io</groupId>51 <artifactId>jts-io-common</artifactId>52 <version>${jts.version}</version>53</dependency>54```5556### Gradle5758```groovy59implementation 'org.locationtech.jts:jts-core:1.20.0'60implementation 'org.locationtech.jts.io:jts-io-common:1.20.0'61```6263---6465## 项目模块一览6667| 模块 | artifactId | 用途 |68|---|---|---|69| jts-core | `jts-core` | ★ 核心——几何模型、算法、空间操作、索引 |70| jts-io-common | `jts-io-common` | 通用 I/O:WKT、WKB、GeoJSON 读写 |71| jts-io-ora | `jts-io-ora` | Oracle Spatial SDO_GEOMETRY 读写 |72| jts-io-sde | `jts-io-sde` | ArcSDE 几何读写 |7374---7576## 核心类一览7778| 类 | 包 | 用途 |79|---|---|---|80| `GeometryFactory` | `org.locationtech.jts.geom` | ★ **推荐入口**——创建所有几何对象的工厂 |81| `Geometry` | `org.locationtech.jts.geom` | 几何抽象基类,提供空间操作与关系判断方法 |82| `Point` | `org.locationtech.jts.geom` | 点(0 维) |83| `LineString` | `org.locationtech.jts.geom` | 线串(1 维) |84| `LinearRing` | `org.locationtech.jts.geom` | 闭合线环(用于构建 Polygon) |85| `Polygon` | `org.locationtech.jts.geom` | 面(2 维,含外环与可选内环) |86| `MultiPoint` | `org.locationtech.jts.geom` | 多点集合 |87| `MultiLineString` | `org.locationtech.jts.geom` | 多线集合 |88| `MultiPolygon` | `org.locationtech.jts.geom` | 多面集合 |89| `GeometryCollection` | `org.locationtech.jts.geom` | 任意几何集合 |90| `Coordinate` | `org.locationtech.jts.geom` | 坐标值(x, y, z) |91| `Envelope` | `org.locationtech.jts.geom` | 外接矩形(MBR) |92| `PrecisionModel` | `org.locationtech.jts.geom` | 坐标精度模型 |93| `WKTReader` | `org.locationtech.jts.io` | WKT 格式解析 |94| `WKTWriter` | `org.locationtech.jts.io` | WKT 格式输出 |95| `WKBReader` | `org.locationtech.jts.io` | WKB 格式解析 |96| `WKBWriter` | `org.locationtech.jts.io` | WKB 格式输出 |97| `GeoJsonReader` | `org.locationtech.jts.io.geojson` | GeoJSON 解析 |98| `GeoJsonWriter` | `org.locationtech.jts.io.geojson` | GeoJSON 输出 |99| `STRtree` | `org.locationtech.jts.index.strtree` | R-tree 空间索引(批量加载,查询高效) |100| `Quadtree` | `org.locationtech.jts.index.quadtree` | 四叉树空间索引(支持动态插入删除) |101| `PreparedGeometry` | `org.locationtech.jts.geom.prep` | 预处理几何,加速重复空间关系判断 |102| `PreparedGeometryFactory` | `org.locationtech.jts.geom.prep` | 创建 PreparedGeometry 的工厂 |103| `BufferOp` | `org.locationtech.jts.operation.buffer` | 缓冲区运算(可精细控制端头、连接样式) |104| `OverlayNGRobust` | `org.locationtech.jts.operation.overlayng` | 鲁棒叠加运算(推荐使用的新一代叠加引擎) |105| `TopologyPreservingSimplifier` | `org.locationtech.jts.simplify` | 保持拓扑的几何简化 |106| `DouglasPeuckerSimplifier` | `org.locationtech.jts.simplify` | Douglas-Peucker 几何简化 |107| `IsValidOp` | `org.locationtech.jts.operation.valid` | 几何有效性检测 |108| `LengthIndexedLine` | `org.locationtech.jts.linearref` | 按长度进行线性参考 |109| `LocationIndexedLine` | `org.locationtech.jts.linearref` | 按位置进行线性参考 |110111---112113## 几何对象创建114115```java116import org.locationtech.jts.geom.*;117118GeometryFactory gf = new GeometryFactory();119120// 点121Point point = gf.createPoint(new Coordinate(116.4, 39.9));122123// 带 Z 值的点124Point point3d = gf.createPoint(new Coordinate(116.4, 39.9, 50.0));125126// 线串127LineString line = gf.createLineString(new Coordinate[]{128 new Coordinate(0, 0),129 new Coordinate(10, 10),130 new Coordinate(20, 0)131});132133// 线环(必须闭合)134LinearRing ring = gf.createLinearRing(new Coordinate[]{135 new Coordinate(0, 0), new Coordinate(10, 0),136 new Coordinate(10, 10), new Coordinate(0, 10),137 new Coordinate(0, 0) // 首尾相同138});139140// 面(无洞)141Polygon polygon = gf.createPolygon(new Coordinate[]{142 new Coordinate(0, 0), new Coordinate(10, 0),143 new Coordinate(10, 10), new Coordinate(0, 10),144 new Coordinate(0, 0)145});146147// 面(带洞)148LinearRing shell = gf.createLinearRing(new Coordinate[]{149 new Coordinate(0, 0), new Coordinate(20, 0),150 new Coordinate(20, 20), new Coordinate(0, 20),151 new Coordinate(0, 0)152});153LinearRing hole = gf.createLinearRing(new Coordinate[]{154 new Coordinate(5, 5), new Coordinate(15, 5),155 new Coordinate(15, 15), new Coordinate(5, 15),156 new Coordinate(5, 5)157});158Polygon polygonWithHole = gf.createPolygon(shell, new LinearRing[]{hole});159160// 多点161MultiPoint multiPoint = gf.createMultiPointFromCoords(new Coordinate[]{162 new Coordinate(1, 2), new Coordinate(3, 4)163});164165// 多线166MultiLineString multiLine = gf.createMultiLineString(new LineString[]{line});167168// 多面169MultiPolygon multiPolygon = gf.createMultiPolygon(new Polygon[]{polygon});170171// 几何集合172GeometryCollection gc = gf.createGeometryCollection(new Geometry[]{point, line, polygon});173```174175---176177> 空间关系、集合运算、几何分析、格式读写与空间索引的完整参考见 [reference/geometry-operations.md](reference/geometry-operations.md)178179## 典型应用场景180181| 场景 | 关键类 / 方法 |182|---|---|183| 创建几何对象 | `GeometryFactory.createPoint()` / `createLineString()` / `createPolygon()` |184| 地理围栏 / 点在面内判断 | `Geometry.contains()` / `within()`,高频场景用 `PreparedGeometry` |185| 计算两个几何的距离 | `Geometry.distance()` |186| 缓冲区分析 | `Geometry.buffer()` 或 `BufferOp` |187| 面叠加分析(交并差) | `Geometry.intersection()` / `union()` / `difference()` |188| 鲁棒叠加运算 | `OverlayNGRobust.overlay()` |189| 几何格式互转 | `WKTReader` / `WKTWriter` / `WKBReader` / `WKBWriter` / `GeoJsonReader` / `GeoJsonWriter` |190| 批量空间查询加速 | `STRtree` / `Quadtree` |191| 最近邻搜索 | `STRtree.nearestNeighbour()` |192| 几何简化(抽稀) | `TopologyPreservingSimplifier` / `DouglasPeuckerSimplifier` |193| 几何有效性校验与修复 | `IsValidOp` / `GeometryFixer` |194| 线性参考 / 沿线定位 | `LengthIndexedLine` / `LocationIndexedLine` |195| 凸包计算 | `Geometry.convexHull()` |196| 几何仿射变换 | `AffineTransformation` |197| 数据库 WKB 交互 | `WKBReader.hexToBytes()` / `WKBWriter.toHex()` |198199---200201## 常见问题2022031. **使用 GeometryFactory 创建几何**:不要直接 `new Point()`,始终通过 `GeometryFactory` 的工厂方法创建几何对象。2042. **面必须闭合**:Polygon 的外环和内环坐标数组的首尾坐标必须相同。2053. **坐标顺序**:JTS 使用 `(x, y)` 即 `(经度, 纬度)` 的顺序,注意与某些 GIS 系统的 `(纬度, 经度)` 区分。2064. **几何有效性**:从外部导入的几何数据应使用 `geometry.isValid()` 检查有效性,无效几何可用 `GeometryFixer.fix()` 修复。2075. **SRID 不参与计算**:JTS 的 SRID 仅作为元数据标记,不影响空间运算;JTS 所有计算都在笛卡尔平面上进行,不处理投影。2086. **性能优化**:批量空间查询使用 `STRtree`;重复空间关系判断使用 `PreparedGeometry`;大量几何合并使用 `UnaryUnionOp`。2097. **线程安全**:`GeometryFactory` 是线程安全的;`Geometry` 对象本身不可变,可安全共享;但 Reader/Writer 实例非线程安全,需为每个线程创建独立实例。2108. **包名迁移**:JTS 1.15+ 包名由 `com.vividsolutions.jts` 迁移为 `org.locationtech.jts`,注意旧代码升级。2119. **OverlayNG**:对于叠加运算(intersection / union / difference),推荐使用 `OverlayNGRobust`,它比传统叠加引擎更加鲁棒,能处理更多边界情况。212213---214215## AI 使用建议216217### 推荐工作流2182191. **创建几何对象**:始终通过 `GeometryFactory` 工厂方法创建,不要直接 `new`2202. **格式解析**:从 WKT/WKB/GeoJSON 读入外部数据,使用对应的 Reader2213. **空间运算**:用 `PreparedGeometry` 加速批量 contains/intersects 判断2224. **批量查询**:用 `STRtree` 建空间索引后查询2235. **结果导出**:用 Writer 输出为 WKT/WKB/GeoJSON224225### 关键注意事项226227- **坐标顺序**:JTS 使用 `(x, y)` 即 `(经度, 纬度)`,注意与部分 GIS 系统的 `(y, x)` 区分228- **SRID 不参与计算**:JTS 所有计算在笛卡尔平面进行,不处理地球曲率229- **OverlayNG 优先**:叠加运算优先使用 `OverlayNGRobust.overlay()`,比传统方法更鲁棒230- **线程安全**:`GeometryFactory` 和 `Geometry` 线程安全;Reader/Writer 非线程安全231- **有效性检查**:外部导入的几何用 `isValid()` 检查后用 `GeometryFixer.fix()` 修复232233## 相关技能234235- **nettopologysuite** — JTS 的 .NET 移植:[../nettopologysuite/SKILL.md](../nettopologysuite/SKILL.md)236- **shapely** — Python 几何运算库(GEOS 绑定):[../shapely/SKILL.md](../shapely/SKILL.md)237- **geotools** — Java GIS 工具集(基于 JTS):[../geotools/SKILL.md](../geotools/SKILL.md)238- **geometry-api-java** — Esri Geometry API for Java:[../geometry-api-java/SKILL.md](../geometry-api-java/SKILL.md)239- **geoserver** — 基于 JTS 的地图服务器:[../geoserver/SKILL.md](../geoserver/SKILL.md)240241## 参考资源242243- **GitHub 仓库:** <https://github.com/locationtech/jts>244- **Javadoc:** <https://locationtech.github.io/jts/javadoc>245- **用户指南:** <https://github.com/locationtech/jts/blob/master/USING.md>246- **FAQ:** <https://locationtech.github.io/jts/jts-faq.html>247- **Maven Central:** <https://mvnrepository.com/artifact/org.locationtech.jts>248- **LocationTech 主页:** <https://locationtech.org/projects/technology.jts>249- **版本历史:** <https://github.com/locationtech/jts/blob/master/doc/JTS_Version_History.md>250- **衍生项目 — GEOS(C++ 移植):** <https://trac.osgeo.org/geos>251- **衍生项目 — NetTopologySuite(.NET 移植):** <https://github.com/NetTopologySuite/NetTopologySuite>252- **衍生项目 — JSTS(JavaScript 移植):** <https://github.com/bjornharrtell/jsts>