首页 文章

使用Spring Data Mongodb进行地理空间查询

提问于
浏览
0

我有一个使用Spring Boot 1.5.7和Spring Data Mongodb 1.10.7的项目 . 在我的实体(用@Document注释的POJO)中,我想使用spring data repos“findByXxxWithin”方案对其中一个字段执行地理空间查询,并传入包含搜索区域边界框的Box .

我想查询的字段是多边形,而不是简单的点 . 我发现double [] point定义很容易查询,一些例子表明你也可以使用GeoJsonPoint . 对于多边形,它似乎并不那么容易 . 如果我的实体声明了GeoJsonPoint,则使用Box的内部搜索总是返回空 . 多边形的GeoJson定义实际上是一个三维数组值,在我的例子中,是双倍的 . 以这种方式定义数据也会导致空结果 . 任何使用包含多边形定义的POJO的尝试都会失败 . 我唯一的成功就是使用了double [] [] .

我想在我的对象中有一个更准确的GeoJson表示数据,Spring数据能够查询 . 这可能吗?此外,Mongodb还有其他几种地理空间查询操作,例如$ geoIntersects . 这些是通过 spring 数据提供的吗?或者,如果spring数据不支持,我可以使用较低级别的api直接针对mongo制定这些查询?

1 回答

  • 1

    让我试着用MongoDB和Spring数据来背诵我的一个工作,它类似于你的问题陈述 .

    我有一个具有地理配准(纬度和经度)的文档 . 我使用 org.geojson.LngLatAlt 对象来存储经度和纬度 . 您还可以拥有多个LngLatAlt对象,因为我使用了它们的Set(java.util.Set) . 因此,这将解决您的文档中的表示问题 .

    现在,当MongoDB中存在数据时,您可以使用Spring数据进行地理空间查询 . 首先,看起来Spring数据在地理空间查询中效率非常低,您可能很想使用本机MongoDB查询,这绝对是好的和有效的 . 但是要在这里学习的是,Spring还提供了一种进行此类查询的方法;虽然不是很直接,但同样有效 . 使用Spring Data,您可以使用 org.springframework.data.geo.Boxorg.springframework.data.geo.Circle 对象进行空间查询 . Box用于BBOX查询,circle用于球体查询 . 现在您已拥有 org.springframework.data.geo.Shape 对象,可以将Criteria对象设置为Query .

    代码段 -

    @Autowired
    private MongoTemplate mongoTemplate;
    
    Box bbox = ShapeUtils.getBBox(coordinates);
    Query q = new Query(Criteria.where("lngLatAlt").within(bbox));
    List<Lead> leads = mongoTemplate.find(q, Lead.class);
    

    如果我的解决方案清晰且相关,请告诉我 . 或者如果您需要更多说明 .

    问候

相关问题