javaBean
@Data
@NoArgsConstructor
@AllArgsConstructor
@Document("places")
@CompoundIndex(name = "location_index",def = "{'location':'2dsphere'}")
public class Places {
// 唯一id
private ObjectId id;
// 地理标题
private String title;
// 地理描述
private String address;
// 地理信息类(存储经纬度)
private GeoJsonPoint location;
}
使用@CompoundIndex添加符合索引要修改配置类才会生效
#该配置在第一次生成表的时候生效,如果表已存在,需要删除表重新生成
spring: data: mongodb: auto-index-creation: true #自动创建索引
百度自动拾取坐标:拾取坐标系统
添加数据
public void testSave(){
Places places = new Places();
places.setId(ObjectId.get());
places.setTitle("南湖公园");
places.setAddress("江苏省宿迁市沭阳县南湖路");
places.setLocation(new GeoJsonPoint(118.763185,34.099015));
mongoTemplate.save(places);
Places places1 = new Places();
places1.setId(ObjectId.get());
places1.setAddress("江苏省宿迁市沭阳县承辉路碧桂园南城首府");
places1.setTitle("碧桂园");
places1.setLocation(new GeoJsonPoint(118.761665,34.072623));
mongoTemplate.save(places1);
}
测试查询附近
public void testNear(){
// 查询附近
//1 准备数据
//1.1 构建中心坐标
GeoJsonPoint point = new GeoJsonPoint(118.763185,34.100015);
//1.2 查询半径1千米
Distance distance = new Distance(1, Metrics.KILOMETERS);
//1.3 绘制圆
Circle circle = new Circle(point, distance);
//2 查询
Query query = Query.query(Criteria.where("location").withinSphere(circle));
//2.1 查询条件
List<Places> list = mongoTemplate.find(query, Places.class);
//2.2 查询结果
list.forEach(System.out::println);
//结果:Places(id=6459a4061507b7408ffbfbb9, title=南湖公园, address=江苏省宿迁市沭阳县南湖路, location=Point [x=118.763185, y=34.099015])
}
测试查询距离
public void testDistance(){
//1 构建中心点
GeoJsonPoint point = new GeoJsonPoint(118.763185,34.100015);
//2 构建附近查询对象 1千米
NearQuery nearQuery = NearQuery.near(point, Metrics.KILOMETERS).maxDistance(1, Metrics.KILOMETERS);
//3 查询附近
GeoResults<Places> results = mongoTemplate.geoNear(nearQuery, Places.class);
//4 获得距离和数据
for (GeoResult<Places> result : results) {
Places places = result.getContent();
double value = result.getDistance().getValue();
System.out.println(places + " -- 距离:" + value + "km");
}
//结果:Places(id=6459a4061507b7408ffbfbb9, title=南湖公园, address=江苏省宿迁市沭阳县南湖路, location=Point [x=118.763185, y=34.099015]) -- 距离:0.11131884502147556km
}
可能的报错:Command failed with error 27 (IndexNotFound) 找不到索引字段
即索引无数据
解决办法:手动添加索引
db.places.createIndex({'location':'2dsphere'})