如何在spring数据neo4j空间中表示地理空间圆形或多边形区域?

时间:2014-04-08 09:41:07

标签: neo4j spring-data-neo4j neo4j-spatial

我需要在地图中表示某个地方的圆形或多边形区域。任何地方都不是地图中的单一地方。它是一个多边形区域。目前我所拥有的是具有单点lon lat表示的单个单索引wkt字段。如何在neo4j中表示圆形或多边形区域信息?

2 个答案:

答案 0 :(得分:3)

您还应该能够在WKT字段中使用多边形表示,但不确定它是否有效但应该如此。因为它将索引多边形的边界框。

使用SDN 3.1.M1,还可以更多地支持多边形,圆形和方框等地理类型,这使得它更容易使用。

答案 1 :(得分:0)

以下是使用REST如何在Neo4j Spatial中使用多边形的示例。

首先,设置一个配置为使用WKT几何的空间索引。

POST http://localhost:7474/db/data/index/node {"name":"tickle","config":{"provider":"spatial","wkt":"wkt"}}

我的索引名称是“挠痒痒”。如果您还没有建立RTree的基本节点,则此调用将执行此操作。这些节点中有一个层节点。该图层也被命名为“tickle”。如果已建立RTree的基节点,则将添加新的层节点。将在我将添加的节点中包含WKT几何的属性的名称是“wkt”。

现在,添加一个多边形节点。

POST http://localhost:7474/db/data/transaction/commit {"statements" : [ {"statement" : "CREATE (n:City {name : 'Bartown', wkt : 'POLYGON ((-97.06138 32.837, -97.06133 32.836, -97.06124 32.833, -97.06127 32.832, -97.06138 32.837))"') RETURN id(n)" } ] }

这不符合Neo4j Spatial观点。它只是添加了一个具有name属性(“Bartown”)的节点和一个包含lon / lat多边形的wkt属性。请注意,多边形由经度和纬度对组成,每个经度和纬度代表多边形的顶点。最后一个顶点必须与第一个顶点具有相同的坐标(这使得它成为一个闭合的图形)。请注意返回的节点ID。它将在下一步中使用。

现在将节点添加到RTree。如果您创建的节点的ID不是4,请将下面语句末尾的数字更改为刚刚返回的值。

POST http://localhost:7474/db/data/index/node/tickle {"value":"dummy","key":"dummy","uri":"http://localhost:7474/db/data/node/4"}

如果显示节点的图形,您会发现已将一个节点添加到RTree,该节点具有与原始节点(4)的内部ID匹配的“id”属性,但是内部ID是不同。

所以,现在你已经为RTree和空间索引添加了一个节点。如果要添加更多节点,只需创建更多节点并将其添加到索引中。

如果使用REST进行查询,Neo4j Spatial将返回RTree节点,必须使用“id”属性取消引用以获取原始节点。例如,

POST http://localhost:7474/db/data/ext/SpatialPlugin/graphdb/findGeometriesWithinDistance {"pointX":"-97.0", "pointY":"32.0", "distanceInKm":"1000.0", "layer":"tickle"}

将返回RTree节点(5)。另一方面,如果使用Cypher执行查询,则返回原始节点。 (这次我不打算将Cypher嵌入REST中。)

START n = node:tickle(“withinDistance:[32.0,-97.0,1000.0]”)RETURN n;

请注意,Cypher调用中坐标的顺序是纬度,经度,最大距离。这与其他一切相反,而且是一个错误。

我希望如果你还没有把它整理好,这足以让你开始。我刚刚完成了这个问题!