在OSM中找到Neo4j空间查找节点并找到最短的POI方式

时间:2013-12-02 15:44:51

标签: java neo4j neo4j-spatial

嗨,我是新手neo4j并试图弄清楚一切是如何工作的

我导入一个OSM文件,现在我正在处理一个函数,您可以输入WGS84格式的点和POI,然后该函数找到POI的最短路径。

因此,为了找到最接近我的WGS84点的几何图形,我使用

Coordinate co = new Coordinate(12.9639158,56.070904);
List<SpatialDatabaseRecord> results2 = GeoPipeline
                .startNearestNeighborLatLonSearch(layer, co, 1)
                .toSpatialDatabaseRecordList();

然后我的问题开始了,因为我真的不明白OSM文件的构建方式

是否有一个功能,以便我可以按名称获取我的POI节点? 我从OSM文件中获取了一个索引

SpatialDatabaseService spatialService = new SpatialDatabaseService(database);
Layer layer = spatialService.getLayer(osm);
LayerIndexReader spatialIndex = layer.getIndex();

我可以用它来按属性搜索节点吗?

为了找到点之间的最短路,我发现了一个dijkstra算法

PathFinder<WeightedPath> finder = GraphAlgoFactory.dijkstra(
        Traversal.expanderForTypes( ExampleTypes.MY_TYPE, Direction.BOTH ), "cost" );
WeightedPath path = finder.findSinglePath( nodeA, nodeB );

现在的问题是我的RelationshipTypes ???我认为它应该是NEXT,但我如何在代码中包含它?我是否必须创建一个带有NEXT的枚举???

如果我在正确的方式给你一些帮助,有人可以给我一些反馈吗?

好的终于找到了如何通过id找到节点:D不是太难但我搜索了很长时间:D

谢谢

1 个答案:

答案 0 :(得分:3)

我可以发表一些意见:

  • 我们目前不向OSM导入器中的lucene索引添加名称或标签,但这是一个好主意。
  • 所做的是将所有几何(poi,街道,多边形等)添加到RTree索引。这是您调用layer.getIndex()时获得的索引。此索引可用于查找区域内的内容,还可以在搜索索引时按几何属性(名称或标记)执行过滤。这可能是你找到名字的最佳选择。请参阅以下两个选项。
  • OSM模型中的路径查找并非易事,因为当前模型是针对OSM完整性而设计的,所有osm节点在一个巨大的连接网络中表示为真实节点,包括所有几何(不仅仅是道路)。图表很复杂,遍历者需要知道如何遍历它以实现路径查找。它不像跟随NEXT关系那么简单。例如,参见http://www.slideshare.net/craigtaverner/neo4j-spatial-backing-a-gis-with-a-true-graph-database处的幻灯片13和15。每个线段都有一个长度,但你真正想要的是一个更简单的图形,它只有交叉点的节点,以及这些点之间的总驱动距离的单一关系。此图表不存在,但可以由OSM导入器添加。

最后,提出了两个按名称查找POI的建议。或者:   - 动态图层   - 或地理位置

对于动态图层,您可以使用CQL语法或键值对(对于标记)。例如,每个参见https://github.com/neo4j/spatial/blob/master/src/test/java/org/neo4j/gis/spatial/TestDynamicLayers.java的第81和84行。这种方法允许在从RTree回调的遍历期间完成名称测试。

对于GeoPipes,您定义了一个流,并且RTree返回的每个对象都将传递给下一个过滤器。这应该具有与动态图层相同的性能,并且使用起来也更直观。例如,参见https://github.com/neo4j/spatial/blob/master/src/test/java/org/neo4j/gis/spatial/pipes/GeoPipesTest.java的第99和112行的'filter_by_osm_attribute'和'filter_by_property'测试。这些都按名称搜索街道。