知道了道路上起点的坐标,就需要计算出道路与起点到指定距离的交点的坐标。这种问题就像SDO-LRS.LOCATE_PT函数中的oracle spatial 。GeoTools 或neo4j spatial上有类似的API吗?
3 回答
我不确定 geotools 是否提供了这个功能。但是,JTS 中有一个相关的,Geotools 和 Neo4j-Spatial 都使用它。查看 JTS 包com.vividsolutions.linearref,它具有用于沿着线性几何搜索点或创建/投影点的类。我认为方法 LengthIndexedLine.extractPoint(length) 可能是您正在寻找的。
在 Neo4j-Spatial 中,我们有一个使用 LocationIndexedLine(但尚未使用 LengthIndexedLine)的实用程序。请参阅 TestSpatialUtils 中的测试代码,以及它在SpatialTopologyUtils中调用的代码。
今年还有两个 Google Summer of Code 项目正在开发与此相关的功能。一个是专门关于地理处理的,我们将使用 Neo4j-Spatial 中的简单 API 公开这些类型的函数。另一个更多是关于 OSM 数据模型的数据挖掘,但也可以涉及这些功能。有关更多信息,请查看 neo4j 和 udig 邮件列表。到夏天结束时,我们将在 Neo4j-Spatial 中提供更丰富的地理处理功能。
我只是将一些代码推送到 Neoj4-Spatial 以使用新方法 locatePoint 包装 JTS 方法 LengthIndexedLine.extractPoint,该方法的行为与 Oracle SDO_LRS.LOCATE_PT 方法相同。所以,至少在主干上,Neo4j-Spatial 现在有了这个能力。实际上,用于此的代码是微不足道的,因为它包装了 JTS 代码,所以功能一直存在,但现在看起来更像 Oracle API。
前面提到的 GSoC 项目将尝试在一定程度上标准化 API,以便以直观的方式提供更完整的功能集。
PrecisionModel precisionModel = new PrecisionModel(PrecisionModel.FLOATING_SINGLE);
GeometryFactory geometryFactory = new GeometryFactory(precisionModel, 0);
Coordinate[] coordinates = new Coordinate[3];
coordinates[0] = new Coordinate(0, 0);
coordinates[1] = new Coordinate(5, 5);
coordinates[2] = new Coordinate(10, 0);
CoordinateSequence coordinateSequence = new CoordinateArraySequence(coordinates);
Geometry geo = new LineString(coordinateSequence, geometryFactory);
LengthLocationMap lengthLocationMap = new LengthLocationMap(geo);
LocationIndexedLine locationIndexedLine = new LocationIndexedLine(geo);
LinearLocation linearLocation = lengthLocationMap.getLocation(len);
Coordinate result = locationIndexedLine.extractPoint(linearLocation);