将数据(数据中带有经纬度字段)存入mongo中,在根据传入的经纬度与存在mongo中数据的经纬度做距离比较进行排序
- 实体类
// document注解是指定mongo中那个表
@Data
@Document("scenery")
public class SceneryResult {
private Integer SceneryID;
private String SceneryName;
private Integer SceneryGrade;
private String SceneryAddress;
private String SceneryProvinceName;
private String SceneryCityName;
private String ScenerySummary;
@GeoSpatialIndexed
private Double[] Location;//地理位置
@Transient
private String SceneryLongitude;//经度(坐标) 高德坐标系
@Transient
private String SceneryLatitude;//纬度(坐标)
private String TicketType;
private String TicketTypeName;
private String SceneryAliasName;
- 将数据存入mongo中
// 获取到的数据
List result = (List)baseResponse.getResult();
for (int i = 0; i < result.size(); i++) {
SceneryResult sceneryResult = (SceneryResult) result.get(i);
sceneryResult.setLocation(new Double[]{Double.parseDouble(sceneryResult.getSceneryLongitude()),Double.parseDouble(sceneryResult.getSceneryLatitude())});
mongoTemplate.save(sceneryResult);
}
- mongo中经纬度的数据
- 根据查询mongo中的数据并根据传入的经纬度与数据中的经纬度计算距离进行排序
public List<SceneryResult> findLists(Integer id, Double SceneryLongitude, Double SceneryLatitude,
Integer page, Integer size){
// page一定要减1
Pageable pageable = PageRequest.of(page-1,size);
List<SceneryResult> sceneryResultList = new ArrayList<>();
// mongo的方法,传入经纬度
Point point = new Point(SceneryLongitude,SceneryLatitude);
// 按条件查询
//Criteria criteria = Criteria.where("sceneryID").is(id);
//Query query1 = new Query(criteria);
NearQuery nearQuery = NearQuery.near(point,Metrics.KILOMETERS).with(pageable);
GeoResults<SceneryResult> geoResults = mongoTemplate.geoNear(nearQuery, SceneryResult.class);
List<GeoResult<SceneryResult>> list = geoResults.getContent();
for (int i = 0; i < list.size(); i++) {
GeoResult<SceneryResult> sceneryResultGeoResult = list.get(i);
sceneryResultList.add(sceneryResultGeoResult.getContent());
// 打印出距离
System.out.println(sceneryResultGeoResult.getDistance());
}
return sceneryResultList;
controller直接调用这个方法即可,最后出来的数据就是从近到远排序的