You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 08:55:12