我有一个使用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表示数据,弹出数据能够查询。这可能吗?此外,Mongodb还有其他几种地理空间查询操作,例如$ geoIntersects。这些是通过弹簧数据提供的吗?或者,如果spring数据不支持mongo,我可以使用更低级别的api直接表示这些查询?
答案 0 :(得分:1)
让我尝试叙述我对MongoDB和Spring数据的工作之一,这与您的问题陈述相当相似。
我有一个具有地理参考(纬度和经度)的文档。我使用了 org.geojson.LngLatAlt 对象存储经度和纬度。您还可以具有多个LngLatAlt对象,因为我使用了它们的Set(java.util.Set)。因此,这将解决您在文档中表示的问题。
现在,当MongoDB中存在数据时,您可以使用Spring数据进行地理空间查询。 乍一看,Spring数据在地理空间查询中似乎效率很低,您可能会想使用本机MongoDB查询,这绝对是有效的。但是这里要学习的是,Spring还提供了一种进行此类查询的方法。虽然不是很直接,但同样有效。 使用Spring Data,您可以使用 org.springframework.data.geo.Box 或 org.springframework.data.geo.Circle 对象进行空间查询。 Box用于BBOX查询,圆形用于球形查询。现在您有了 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);
请让我知道我的解决方案是否明确和相关。或者,如果您需要更多说明。
致谢