Spring数据Mongodb存储和查询GIS圆和多边形。

问题描述 投票:2回答:1

我有一个简单的用例,用MongoDB和Spring-data连接器来解决。

  • 存储一个多边形或圆形(简单的带半径的点)。
  • 检查给点是否在多边形圆内。

现在,我已经做了这样的工作。

  • 把Polygon以geoJSON的形式存储在一个文档中
  • 应用2dSphere索引
  • 以Polygon geoJSON类型存储的多边形。
  • 圆圈存储单点和半径作为单独的参数
  • 我可以使用$geoIntersects查询的多边形。
  • 圈子我能够用$geoNear查询,并进行汇总。

问题:如何正确存储和索引圆(点和半径)和多边形(多点)?

  • 存储和索引圆(点和半径)和多边形(多点)的正确方法是什么?
  • 如何做一个查询来检查给定的点是否在多边形圆中?
spring mongodb gis polygon geometry
1个回答
0
投票

目前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);



    }
}
© www.soinside.com 2019 - 2024. All rights reserved.