【问题标题】:Spring data Mongodb Store and query GIS Circle and PolygonSpring data Mongodb 存储和查询 GIS Circle 和 Polygon
【发布时间】:2016-02-06 03:15:16
【问题描述】:
我有一个使用 MongoDB 和 Spring-data 连接器来解决的简单用例。
- 存储多边形或圆(带半径的简单点)
- 检查给定点是否在多边形/圆内
现在,我已经这样做了:
- 将 Polygon 作为 geoJSON 存储到文档中
- 应用 2dSphere 索引
- 以 Polygon geoJSON 类型存储的多边形
- 圆将单个点和半径存储为单独的参数
- 我可以使用 $geoIntersects 查询多边形
- 我可以使用带有聚合的 $geoNear 进行查询
问题:
- 存储和索引圆(点和半径)和多边形(多个点)的正确方法是什么?
- 如何进行单个查询来检查给定点是否位于多边形/圆形中?
【问题讨论】:
标签:
spring
mongodb
gis
polygon
geometry
【解决方案1】:
目前 Spring Data 不支持使用 MongoRepository 接口的这种查询($geoIntersects),但这对我有用:
假设我们有以下文档
@Document
public class AreaTown {
@Id
private String id;
private String name;
@GeoSpatialIndexed(type = GeoSpatialIndexType.GEO_2DSPHERE)
private GeoJsonPolygon area;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public GeoJsonPolygon getArea() {
return area;
}
public void setArea(GeoJsonPolygon area) {
this.area = area;
}
@Override
public String toString() {
return "AreaTown [id=" + id + ", name=" + name + ", area=" + area + "]";
}
}
应用自定义查询,我能够找到一个点是否在多边形内
@SpringBootApplication
public class MongoGeoJsonApplication implements CommandLineRunner{
public static void main(String[] args) {
SpringApplication.run(MongoGeoJsonApplication.class, args);
}
@Autowired
private MongoTemplate mongoTemplate;
@Override
public void run(String... args) throws Exception {
Point inside = new Point(-97.406285,18.481136);
Query query = new Query().addCriteria(Criteria.where("area").intersects(new GeoJsonPoint(inside)));
List<AreaTown> list = mongoTemplate.find(query, AreaTown.class);
System.out.println(list);
}
}