ワンクリックで
geometry-api-java
Esri Geometry API for Java 是一个自包含的空间几何计算库,提供对二维和三维几何对象的创建、解析、序列化以及空间关系运算能力。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Esri Geometry API for Java 是一个自包含的空间几何计算库,提供对二维和三维几何对象的创建、解析、序列化以及空间关系运算能力。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
面向 AI 编程助手的开源 GIS、CAD、C#、AI、IoT、3D 技能集合。覆盖 65 个开源项目,提供一站式技能索引、标签搜索、按需加载指南,让 AI 助手在 GIS/CAD/C#/AI/3D 领域获得更准确的代码生成与问题排查能力。
DocuTranslate(xunbu/docutranslate)是基于大语言模型的轻量级本地文件翻译工具,支持 PDF/Word/Excel/Markdown/EPUB/字幕/JSON 等多格式翻译,内置 MinerU PDF 解析、术语表自动生成、Web UI、REST API、Client SDK 与 MCP 接入。
AI/LLM 技能分类索引,覆盖 LLM 应用开发平台、自学习智能体、个人 AI 助手 Gateway、终端编码代理、多模型编排插件、文件翻译工具、AI 编程方法论等领域共 8 个开源项目,按需加载即可获得 Dify、Hermes Agent、OpenClaw、OpenCode、DocuTranslate 等工具的精准 AI 辅助。
geometry-api-net 是一个 .NET Standard 2.0 的空间几何计算库,提供对二维和三维几何对象的创建、解析、序列化以及空间关系运算能力。
GIS(地理信息系统)技能分类索引,覆盖空间数据处理、地图服务、几何运算、Web 可视化等领域共 23 个开源工具,按需加载即可获得 GDAL、QGIS、GeoServer、PostGIS、JTS 等工具的精准 AI 辅助。
robotgo-flow(znlgis/robotgo-flow)是基于 go-vgo/robotgo 构建的 Windows 桌面 RPA 自动化框架,通过声明式 YAML 定义工作流,利用图像模板匹配定位屏幕 UI 元素,自动执行鼠标/键盘/浏览器操作,内置人类行为模拟、交互式录制器与 .NET 10 WPF 托盘应用。
| name | geometry-api-java |
| description | Esri Geometry API for Java 是一个自包含的空间几何计算库,提供对二维和三维几何对象的创建、解析、序列化以及空间关系运算能力。 |
| tags | ["java","geometry","esri","spatial","wkt","wkb","geojson","geodesic"] |
项目地址: https://github.com/Esri/geometry-api-java
Maven Central:
com.esri.geometry:esri-geometry-api许可证: Apache License 2.0
Esri Geometry API for Java 是一个自包含的空间几何计算库,提供对二维和三维几何对象的创建、解析、序列化以及空间关系运算能力。它无需任何外部 GIS 依赖,可直接嵌入 Java 应用、Hadoop MapReduce、Hive UDF、Spark 等大数据处理框架中。
<dependency>
<groupId>com.esri.geometry</groupId>
<artifactId>esri-geometry-api</artifactId>
<version>2.2.4</version>
</dependency>
implementation 'com.esri.geometry:esri-geometry-api:2.2.4'
环境要求: JDK 1.7+;运行时依赖 jackson-core(JSON 处理)。
维护状态提示:
esri-geometry-api最新版本仍为 2.2.4(2020-09),已多年未更新。若需活跃维护的几何库,新项目建议优先选用 JTS(Java)或 NetTopologySuite(.NET)。
| 类 | 包 | 用途 |
|---|---|---|
GeometryEngine | com.esri.core.geometry | 推荐入口——提供几何操作的静态便捷方法 |
OperatorFactoryLocal | com.esri.core.geometry | 算子工厂,适用于高性能批量处理 |
SpatialReference | com.esri.core.geometry | 空间参考 / 坐标系(通过 WKID 或 WKT 创建) |
MapGeometry | com.esri.core.geometry | 将 Geometry 与 SpatialReference 打包在一起 |
Point | com.esri.core.geometry | 点(0 维) |
MultiPoint | com.esri.core.geometry | 多点集合(0 维) |
Polyline | com.esri.core.geometry | 折线 / 路径集合(1 维) |
Polygon | com.esri.core.geometry | 面 / 环集合(2 维) |
Envelope | com.esri.core.geometry | 外接矩形(2 维) |
import com.esri.core.geometry.*;
// 点
Point pt = new Point(116.4, 39.9); // 2D
Point pt3d = new Point(116.4, 39.9, 50.0); // 3D
// 折线
Polyline line = new Polyline();
line.startPath(0, 0);
line.lineTo(10, 10);
line.lineTo(20, 0);
// 面
Polygon polygon = new Polygon();
polygon.startPath(0, 0);
polygon.lineTo(10, 0);
polygon.lineTo(10, 10);
polygon.lineTo(0, 10);
// 自动闭合
// 外接矩形
Envelope env = new Envelope(0, 0, 10, 10);
// 多点
MultiPoint mp = new MultiPoint();
mp.add(1, 2);
mp.add(3, 4);
// 按 WKID 创建(WGS 84 = 4326)
SpatialReference srWGS84 = SpatialReference.create(4326);
// 按 WKT 字符串创建
SpatialReference srCustom = SpatialReference.create("GEOGCS[\"GCS_WGS_1984\",...]]");
// 与几何对象绑定
MapGeometry mapGeom = new MapGeometry(pt, srWGS84);
SpatialReference sr = SpatialReference.create(4326);
// 缓冲区
Geometry buffered = GeometryEngine.buffer(point, sr, 100.0);
// 交集
Geometry inter = GeometryEngine.intersect(polygon1, polygon2, sr);
// 合并
Geometry united = GeometryEngine.union(new Geometry[]{poly1, poly2, poly3}, sr);
// 差集
Geometry diff = GeometryEngine.difference(polygon1, polygon2, sr);
// 对称差
Geometry symDiff = GeometryEngine.symmetricDifference(geom1, geom2, sr);
// 裁剪(按矩形)
Geometry clipped = GeometryEngine.clip(geometry, envelope, sr);
// 切割(用折线切割面或线)
Geometry[] parts = GeometryEngine.cut(polygon, cuttingLine, sr);
double dist = GeometryEngine.distance(geom1, geom2, sr);
boolean eq = GeometryEngine.equals(g1, g2, sr);
boolean wn = GeometryEngine.within(point, polygon, sr);
boolean ct = GeometryEngine.contains(polygon, point, sr);
boolean ix = GeometryEngine.intersects(g1, g2, sr);
boolean dj = GeometryEngine.disjoint(g1, g2, sr);
boolean tc = GeometryEngine.touches(g1, g2, sr);
boolean cr = GeometryEngine.crosses(line, polygon, sr);
boolean ol = GeometryEngine.overlaps(poly1, poly2, sr);
// DE-9IM 关系矩阵
boolean rel = GeometryEngine.relate(g1, g2, sr, "T*F**FFF*");
// 凸包
Geometry hull = GeometryEngine.convexHull(geometry);
// 简化
Geometry simplified = GeometryEngine.simplify(geometry, sr);
// 泛化(简化顶点)
Geometry generalized = GeometryEngine.generalize(geometry, maxDeviation, true, sr);
// 质心 / 标注点
Point centroid = GeometryEngine.getLabelPoint(polygon, sr);
// 大地测量缓冲区(结果更精确,适用于地理坐标系)
Geometry geoBuffer = GeometryEngine.geodesicBuffer(geometry, sr, 1000.0);
// 大地测量长度
double geoLen = GeometryEngine.geodesicLength(polyline, sr, null);
// 大地测量面积
double geoArea = GeometryEngine.geodesicArea(polygon, sr, null);
// 导入
MapGeometry mg = GeometryEngine.jsonToGeometry(jsonString);
Geometry geom = mg.getGeometry();
SpatialReference sr = mg.getSpatialReference();
// 导出(附带 WKID)
String json = GeometryEngine.geometryToJson(4326, geometry);
// 导入
MapGeometry mg = GeometryEngine.geoJsonToGeometry(geoJsonString, 0, Geometry.Type.Unknown);
// 导出
String geoJson = GeometryEngine.geometryToGeoJson(geometry);
// 导入
Geometry geom = GeometryEngine.geometryFromWkt(
"POLYGON((0 0,10 0,10 10,0 10,0 0))",
0,
Geometry.Type.Polygon
);
// 导出
String wkt = GeometryEngine.geometryToWkt(geometry, 0);
// 导入
Geometry geom = GeometryEngine.geometryFromWkb(byteBuffer, Geometry.Type.Unknown);
// 导出
ByteBuffer wkb = GeometryEngine.geometryToWkb(geometry, 0);
// 导入
Geometry geom = GeometryEngine.geometryFromEsriShape(byteBuffer, Geometry.Type.Polygon);
// 导出
byte[] shape = GeometryEngine.geometryToEsriShape(geometry);
当需要批量处理大量几何对象时,使用 OperatorFactoryLocal 获取算子并配合 GeometryCursor 可获得更好的性能:
OperatorFactoryLocal factory = OperatorFactoryLocal.getInstance();
OperatorBuffer bufferOp = (OperatorBuffer) factory.getOperator(Operator.Type.Buffer);
// 使用 SimpleGeometryCursor 包装输入
SimpleGeometryCursor inputCursor = new SimpleGeometryCursor(geometryArray);
double[] distances = {100.0};
GeometryCursor resultCursor = bufferOp.execute(inputCursor, sr, distances, false, null);
// 逐个取出结果
Geometry result;
while ((result = resultCursor.next()) != null) {
// 处理每个缓冲区结果
}
Geometry.Type type = geometry.getType();
switch (type) {
case Point: Point p = (Point) geometry; break;
case Polygon: Polygon pg = (Polygon) geometry; break;
case Polyline: Polyline pl = (Polyline) geometry; break;
case MultiPoint: MultiPoint mp = (MultiPoint) geometry; break;
case Envelope: Envelope ev = (Envelope) geometry; break;
}
// 按维度判断
boolean isPoint = Geometry.isPoint(type.value());
boolean isLinear = Geometry.isLinear(type.value());
boolean isArea = Geometry.isArea(type.value());
// 检查属性
geometry.hasZ();
geometry.hasM();
geometry.hasID();
// 添加属性
geometry.addAttribute(VertexDescription.Semantics.Z);
geometry.addAttribute(VertexDescription.Semantics.M);
| 场景 | 关键方法 |
|---|---|
| 地理围栏 / 点在面内判断 | GeometryEngine.contains() 或 within() |
| 计算两点距离 | GeometryEngine.distance() 或 geodesicLength() |
| 创建缓冲区(如 POI 周边范围) | GeometryEngine.buffer() 或 geodesicBuffer() |
| 面求交 / 叠加分析 | GeometryEngine.intersect() / union() / difference() |
| 坐标格式互转 | jsonToGeometry() / geometryToGeoJson() / geometryFromWkt() 等 |
| 几何有效性检查与修复 | GeometryEngine.simplify() |
| Hadoop / Spark 空间处理 | 搭配 Operator + GeometryCursor 批量处理 |
SpatialReference。GeometryEngine.simplify() 确保拓扑正确。geodesicArea() / geodesicLength() 以获得椭球面精确结果。OperatorFactoryLocal + GeometryCursor,而非逐个调用 GeometryEngine 静态方法。GeometryEngine 的静态方法是线程安全的。Point、Polyline、Polygon 等构造函数创建几何SpatialReference.create(wkid) 指定坐标系GeometryEngine 静态方法(线程安全、API 简洁);批量处理使用 OperatorFactoryLocal + GeometryCursorGeometryEngine.geometryToGeoJson() / geometryFromWkt() 等方法进行 WKT、WKB、GeoJSON、Esri JSON 互转geodesicArea() / geodesicLength() / geodesicBuffer() 获得椭球面精确结果SpatialReferenceGeometryEngine.simplify() 确保拓扑正确OperatorFactoryLocal + GeometryCursor,而非逐个调用 GeometryEngine 静态方法GeometryEngine 静态方法是线程安全的;Operator 实例非线程安全