我有一个 NodeA ,用 @NodeEntity 注释。它有很多领域,包括:
@Indexed
public Double lat;
@Indexed
public Double lon;
请注意,NodeA已经能够通过 lat 和 lon 字段存储足够的位置信息。我想将NodeA类型的节点添加到空间层中,以便我可以使用 GeoPipeline 运行空间查询。
new Coordinate(13.766, 55.566)
等点添加到空间图层中。 (如果没有解决方案,我如何将NodeA节点与其对应的Coordinate节点相关联?)我正在使用:
编辑:当我将类型为NodeA的现有节点连接到RTREE_ROOT时, GeoPipeline 会抱怨缺少NodeA节点的 bbox属性。 (果然,NodeA中没有 bbox 属性,但它存在于Coordinate类型的其他节点中。)
答案 0 :(得分:1)
我在这里找到了解决方案:
http://www.markhneedham.com/blog/2013/03/10/neo4jcypher-finding-football-stadiums-near-a-city-using-spatial/
我们只需要将节点添加到空间索引中。节点应具有 wkt 属性,该属性包含坐标信息。添加到此索引的所有节点也将自动添加到空间层。
IndexProviderTest.java提供了更新的实现:
https://github.com/mneedham/spatial/blob/master/src/test/java/org/neo4j/gis/spatial/IndexProviderTest.java#L251
@Test
public void testWithinDistanceIndex() {
Map<String, String> config = SpatialIndexProvider.SIMPLE_WKT_CONFIG;
IndexManager indexMan = db.index();
Index<Node> index = indexMan.forNodes("layer2", config);
Transaction tx = db.beginTx();
Node batman = db.createNode();
String wktPoint = "POINT(41.14 37.88 )";
batman.setProperty("wkt", wktPoint);
String batman1 = "batman";
batman.setProperty("name", batman1);
index.add(batman, "dummy", "value");
Map<String, Object> params = new HashMap<String, Object>();
Double[] point = {37.87, 41.13};
params.put(LayerNodeIndex.POINT_PARAMETER,
point);
params.put(LayerNodeIndex.DISTANCE_IN_KM_PARAMETER, 2.0);
IndexHits<Node> hits = index.query(
LayerNodeIndex.WITHIN_DISTANCE_QUERY, params);
tx.success();
tx.finish();
Node node = hits.getSingle();
assertTrue(node.getId() == batman.getId());
assertTrue(node.getProperty("name").equals(batman1));
}
答案 1 :(得分:0)
博客使用Neo4j Spatial和Spring Data Neo4j 3.0.1找到梵高的艺术作品
<强> http://inserpio.wordpress.com/2014/04/03/artworks-spatial-search/ 强>
完全符合我的要求。 @NodeEntity包含 wkt 属性,并且节点被添加到 SpatialRepository 。