使用davidmoten RTree索引图边时无法添加几何线至条目问题
问题分析与解决
你的代码存在核心逻辑错误:仅在RTree为空时才添加第一条边,后续所有边的添加操作都被if (rtree.isEmpty())的判断阻断。第一次添加边后,RTree不再为空,循环里剩余的所有边都无法被加入索引。
修复后的代码
public static RTree<Integer, Line> createRTree(CoreGraph graph) { RTree<Integer, Line> rtree = RTree.create(); Map<Integer, Map<Integer, Double>> adjMap = graph.getAdjancencyMap(); for (Entry<Integer, Map<Integer, Double>> entry : adjMap.entrySet()) { int startNodeId = entry.getKey(); double startLong = graph.getNodeFromMap(startNodeId).getLongitude(); double startLatit = graph.getNodeFromMap(startNodeId).getLatitude(); Map<Integer, Double> adjList = entry.getValue(); for (Entry<Integer, Double> adjacentNodes : adjList.entrySet()) { int endNodeId = adjacentNodes.getKey(); double endLong = graph.getNodeFromMap(endNodeId).getLongitude(); double endLatit = graph.getNodeFromMap(endNodeId).getLatitude(); Line line = Geometries.line(startLong, startLatit, endLong, endLatit); int edgeId = graph.getEdgeId(startNodeId, endNodeId); // 移除不必要的isEmpty判断,直接添加所有边 rtree.add(edgeId, line); } } return rtree; }
额外检查建议
- 确认
graph.getEdgeId(startNodeId, endNodeId)返回的edgeId是否唯一,RTree允许重复ID,但如果需要唯一索引,需保证edgeId不重复。 - 验证
Geometries.line(...)创建的Line对象坐标合法(比如经度范围-180180,纬度-9090),确保符合davidmoten RTree对几何对象的要求。
内容的提问来源于stack exchange,提问作者Aavash Bhandari
相关产品推荐
相关产品推荐

