基于SHP文件的Neo4j Spatial图形网络

时间:2014-06-10 12:44:47

标签: graph neo4j spatial shapefile

我正在尝试使用Neo4j Spatial在网络上进行距离计算。目标是在一定距离内定义点,但只定位在道路上的点。

我使用Java中的ShapefileImporter为我的道路网络数据加载了一个SHP。 现在我可以看到一堆具有几何属性的节点,但我看不到任何关系。

如何在连接线之间添加关系以便我有一个真实的图形?

我曾预料到ShapeFileImporter会将每一行的起点和终点作为节点并在两者之间添加关系。

BTW,我正在使用带有Spatial 0.13插件的Neo4j Community 2.1.1。

2 个答案:

答案 0 :(得分:0)

我还没玩过它,但看起来它需要shapefile中的每个功能,将每个功能作为一个节点导入,并允许通过空间索引对其属性进行空间(内部,重叠,交叉等)查询 - 而不是将一层内容翻译成节点和关系。

如果你要翻译道路linesegments - >图表,记住道路将成为关系,道路的交叉点将成为节点。

答案 1 :(得分:0)

Neo4j Spatial提供的每个示例导入器都会决定如何在图表中构建该数据。这个决定是通过选择GeometryEncoder实现来做出的。 GeometryEncoder决定如何在图形中构造Geometry。对于所有几何分离的数据源,如Shapefile,最简单的通用选择是将每个几何体作为WKT或WKB存储在单个节点的单个属性中。

因此,如果您希望将几何图形分隔为图形结构,则需要为此编写编码器。或者重新使用或修改/扩展已经完成的操作,例如OSMGeometryEncoder。

然而,我认为,问自己的第一个问题是为什么你想将几何图形看作子图?例如,如果要执行路由,那么这还不够,还需要将所有LineString段连接在一起以创建完整的网络。在这种情况下,使用已连接的数据集(如OpenStreetMap,它已经作为完全连接的图形加载到Neo4j中)要容易得多。

如果您特别需要使用Shapefile,那么该过程将是:

  • 编写一个将LineString转换为子图的GeometryEncoder(可能在OSMGeometryEncoder上建模)
  • 扩展或修改Shapefile导入程序,以便在导入期间使用此新几何编码器
  • 编写代码,找到LineStrings之间可能的连接并加入它们(通过合并公共端节点,或者通过在它们之间创建特殊关系)
  • 添加您认为需要路由的任何额外元数据(转弯限制等)
  • 编写路由算法