Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 利用Spring数据Mongodb进行地理空间查询_Java_Spring_Mongodb_Spring Data_Spring Data Mongodb - Fatal编程技术网

Java 利用Spring数据Mongodb进行地理空间查询

Java 利用Spring数据Mongodb进行地理空间查询,java,spring,mongodb,spring-data,spring-data-mongodb,Java,Spring,Mongodb,Spring Data,Spring Data Mongodb,我有一个使用SpringBoot1.5.7和SpringDataMongoDB1.10.7的项目。在我的实体(用@Document注释的POJO)中,我想使用spring数据repos“findbyxxwithin”方案对其中一个字段执行地理空间查询,并传入一个包含搜索区域边界框的框 我要查询的字段是多边形,而不是简单的点。我发现double[]点定义很容易查询,一些示例表明您也可以使用GeoJsonPoint。对于多边形,这似乎并不那么容易。如果我的实体声明了GeoJsonPoint,那么使用

我有一个使用SpringBoot1.5.7和SpringDataMongoDB1.10.7的项目。在我的实体(用@Document注释的POJO)中,我想使用spring数据repos“findbyxxwithin”方案对其中一个字段执行地理空间查询,并传入一个包含搜索区域边界框的框

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


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

让我试着背诵我在MongoDB和spring数据方面的一项工作,这与您的问题陈述非常相似

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

现在,当MongoDB中存在数据时,可以使用Spring数据进行地理空间查询。 首先,看起来Spring数据在地理空间查询中非常高效,您可能会尝试使用本机MongoDB查询,这绝对是好的和高效的。但这里要学习的是,Spring也提供了一种进行此类查询的方法;虽然不是很直接,但同样有效。 使用Spring数据,您可以使用org.springframework.Data.geo.Boxorg.springframework.Data.geo.Circle对象进行空间查询。框用于BBOX查询,圆用于球体查询。现在您有了org.springframework.data.geo.Shape对象,您可以创建要查询的Criteria对象

代码片段-

@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);
@Autowired
私有MongoTemplate MongoTemplate;
框bbox=ShapeUtils.getBBox(坐标);
查询q=新查询(条件。其中(“lngLatAlt”)。在(bbox)中);
列出Lead=mongoTemplate.find(q,Lead.class);
请让我知道我的解决方案是否清晰和相关。或者如果你需要更多的澄清

问候