spring 数据 neo4j 空间处理多边形
spring data neo4j spatial working with polygons
美好的一天,
我想在更大范围内构建几何图形。为此,我将几何数据从各种来源(也包括 shp 文件)导入到使用 spring-data-neo4j 的嵌入式 neo4j 数据库中。到目前为止一切顺利。
我被困在哪里:
在我的域中,我定义了一个 Building
形状为 Polygon wkt;
的实体
是否可以通过 CRUDRepository
?
创建具有 Polygon
属性 的节点
有了 Point
就可以正常工作了:例如
@NodeEntity
public class Building implements Serializable{
@GraphId
private Long id;
@Indexed(indexType = IndexType.POINT, indexName = "building_wkt_index", unique = false)
private Point wkt;
}
public interface BuildingRepository extends GraphRepository<Building>, SpatialRepository<Building>{
/**
* CRUD
*/
}
Building b = new Building();
b.setWkt(new Point(12,12));
buildingService.save(b);
问题是 Lines
和 Polygons
没有实现 IndexType。
这是我使用 spring-data 和 neo4j 的第一个项目,所以我不确定应该朝哪个方向发展。
查看 neo4j 空间文档表明,使用 wkt 应该可以存储 Polygon
s(参见 http://neo4j-contrib.github.io/spatial/#spatial-server-plugin)
also proposes to create a spatial index via REST. Another suggestion is this one: 。
我尝试像这样手动创建空间索引:
Transaction tx = template.getGraphDatabaseService().beginTx();
template.getGraphDatabaseService().index().forNodes("building_wkt_index", MapUtil.stringMap(
IndexManager.PROVIDER, "spatial", "geometry_type", "polygon", "wkt", "wkt"));
tx.success();
并调用存储库的 save()。
但是,这似乎不起作用。 wkt 没有存储,它是空的。
是否可以在我的 Building
中以某种方式使用这个命名索引(甚至可能) - 或者将所有事务移动到 neo4j 空间插件的 REST 上确实是唯一的方法。
是否可以实施新的 IndexType
?
非常感谢所有输入!
对于任何对可能的解决方案感兴趣的人:
1st 我手动创建空间索引:
template.getGraphDatabaseService().index().forNodes("your_spatial_index", MapUtil.stringMap(
IndexManager.PROVIDER, "spatial", "geometry_type","polygon","wkt", "wkt"));
在域实体中,wkt 存储为字符串:
String wkt;
然后我将存储库访问权限移至一项服务。
当一个新的节点被保存时,这个节点被手动添加到空间索引中:
Transaction tx = template.getGraphDatabase().beginTx();
Node n = template.getNode(b.getId());
template.getGraphDatabase().getIndex("your_spatial_index").add(n,"id",b.getId());
tx.success();
tx.close();
至少,这是将多边形 wkt 添加到 R 树的快速修复。
但是,更新和删除索引节点必须手动处理。
美好的一天,
我想在更大范围内构建几何图形。为此,我将几何数据从各种来源(也包括 shp 文件)导入到使用 spring-data-neo4j 的嵌入式 neo4j 数据库中。到目前为止一切顺利。
我被困在哪里:
在我的域中,我定义了一个 Building
形状为 Polygon wkt;
的实体
是否可以通过 CRUDRepository
?
Polygon
属性 的节点
有了 Point
就可以正常工作了:例如
@NodeEntity
public class Building implements Serializable{
@GraphId
private Long id;
@Indexed(indexType = IndexType.POINT, indexName = "building_wkt_index", unique = false)
private Point wkt;
}
public interface BuildingRepository extends GraphRepository<Building>, SpatialRepository<Building>{
/**
* CRUD
*/
}
Building b = new Building();
b.setWkt(new Point(12,12));
buildingService.save(b);
问题是 Lines
和 Polygons
没有实现 IndexType。
这是我使用 spring-data 和 neo4j 的第一个项目,所以我不确定应该朝哪个方向发展。
查看 neo4j 空间文档表明,使用 wkt 应该可以存储 Polygon
s(参见 http://neo4j-contrib.github.io/spatial/#spatial-server-plugin)
also proposes to create a spatial index via REST. Another suggestion is this one: 。
我尝试像这样手动创建空间索引:
Transaction tx = template.getGraphDatabaseService().beginTx();
template.getGraphDatabaseService().index().forNodes("building_wkt_index", MapUtil.stringMap(
IndexManager.PROVIDER, "spatial", "geometry_type", "polygon", "wkt", "wkt"));
tx.success();
并调用存储库的 save()。 但是,这似乎不起作用。 wkt 没有存储,它是空的。
是否可以在我的 Building
中以某种方式使用这个命名索引(甚至可能) - 或者将所有事务移动到 neo4j 空间插件的 REST 上确实是唯一的方法。
是否可以实施新的 IndexType
?
非常感谢所有输入!
对于任何对可能的解决方案感兴趣的人:
1st 我手动创建空间索引:
template.getGraphDatabaseService().index().forNodes("your_spatial_index", MapUtil.stringMap(
IndexManager.PROVIDER, "spatial", "geometry_type","polygon","wkt", "wkt"));
在域实体中,wkt 存储为字符串:
String wkt;
然后我将存储库访问权限移至一项服务。 当一个新的节点被保存时,这个节点被手动添加到空间索引中:
Transaction tx = template.getGraphDatabase().beginTx();
Node n = template.getNode(b.getId());
template.getGraphDatabase().getIndex("your_spatial_index").add(n,"id",b.getId());
tx.success();
tx.close();
至少,这是将多边形 wkt 添加到 R 树的快速修复。 但是,更新和删除索引节点必须手动处理。