springboot + mongodb 通过经纬度坐标匹配平面区域的方法(springboot核心注解)越早知道越好

随心笔谈2年前发布 admin
188 0 0

文章摘要

这篇文章介绍了如何在Spring Boot项目中自定义MongoDB实体以满足基于经纬度坐标区域匹配的需求。由于MongoDB默认的`GeoSpatialIndexed`无法完全满足环状多边形区域匹配的要求,作者决定自定义一个空间坐标类型。 **主要内容总结:** 1. **自定义转换器**: - 创建了`CustomReadGeoJsonConverter`类,实现了`Converter<Document, CustomGeoJson>`接口。 - 该转换器用于将文档中的`GeoJson`数据转换为自定义的`CustomGeoJson`对象,其中包括`type`和`coordinates`字段。 2. **自定义MongoDB实体**: - 在`DemoMdb`实体类中,添加了自定义的`CustomGeoJson`字段,并配置了`@GeoSpatialIndexed`索引,指定使用自定义的`CustomGeoJson`对象。 - 实体中还定义了`@Data`和`@Document`注解,确保MongoDB正确识别并存储空间数据。 3. **数据保存**: - 在`saveData`方法中,创建一个包含经纬度点集合的列表,并将该列表赋值给`DemoMdb`实体的`coordinates`字段。 - 使用MongoDB的`insert`方法将数据保存到MongoDB集合`demo_mdb`中。 4. **数据查询**: - 在`findData`方法中,通过`@Query`和`@Intersects`方法构建查询条件,基于经纬度点进行区域匹配。 - 使用MongoDB的`find`方法返回匹配结果。 5. **代码示例**: - 文章提供了完整的自定义转换器、实体类、数据保存和查询方法,供读者参考和应用。 文章整体思路清晰,通过自定义空间坐标类型和MongoDB的索引配置,解决了经纬度区域匹配问题。代码示例完整,适合读者理解和扩展。



java api 自带的mongodb实体无法满足环状多边形的区域匹配(大概是我没用对方法可能)所以我们要自定义一个空间坐标类型

废话不多说 上代码

@Configuration
@ReadingConverter
public class CustomReadGeoJsonConverter implements Converter<Document, CustomGeoJson> {

@Override
public CustomGeoJson convert(Document document) {
CustomGeoJson geoJson=new CustomGeoJson();
geoJson.setType(document.get(GeoJsonConstant.TYPE, String.class));
geoJson.setCoordinates(document.get(GeoJsonConstant.COORDINATES, Iterable.class));
return geoJson;
}

}

@Configuration
public class Config {
@Autowired
private CustomReadGeoJsonConverter customReadGeoJsonConverter;
@Bean
public MongoCustomConversions customConversions() {
List<Converter<?, ?>> converterList=new ArrayList<>();
converterList.add(customReadGeoJsonConverter);
return new MongoCustomConversions(converterList);
}
}

自定义的空间坐标类型插入实体

其中的coordinates 可自定义插入point

@Data
public class CustomGeoJson implements GeoJson, Serializable {
private String type;

private Iterable<?> coordinates;

}

在我们定义的mongodb实体中加入我们自定义的类型

@Data
@Document(collection=”demo_mdb”)
public class DemoMdb implements Serializable {

private String id;

@GeoSpatialIndexed(type=GeoSpatialIndexType.GEO_2DSPHERE)
private CustomGeoJson customGeoJson;
}

插入数据

public void saveData() {
//这里自定义point点集合(这里不固定格式参照mongdb官方文档)
List<List<Point>> pointList=new ArrayList<>();
DemoMdb db=new DemoMdb();
//自行查看需要的类型
db.setType(“***”);
db.setCoordinates(pointList);
//mongoTemplate自行引入不做赘述
mongoTemplate.insert(db, DemoMdb .class);
}

查询数据

public List<DemoMdb> findData(String x, String y) {
Query query=new Query(Criteria.where(“customGeoJson”).
intersects(new GeoJsonPoint(Double.valueOf(x), Double.valueOf(y))));
List<DemoMdb> dbList=mongoTemplate.find(query, DemoMdb.class);
return dbList;
}

只是一种方法,还不完美欢迎评论指教

到此这篇关于springboot + mongodb 通过经纬度坐标匹配平面区域的方法的文章就介绍到这了,更多相关springboot mongodb 经纬度内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:Springboot整合MongoDB进行CRUD操作的两种方式(实例代码详解)springboot-mongodb的多数据源配置的方法步骤SpringBoot MongoDB 索引冲突分析及解决方法springboot+mongodb 实现按日期分组分页查询功能详解springboot整合mongodb

© 版权声明

相关文章