spring-data-mongo根據兩個經緯度之間距離進行排序

將數據(數據中帶有經緯度字段)存入mongo中,在根據傳入的經緯度與存在mongo中數據的經緯度做距離比較進行排序

  1. 實體類
// 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;
  1. 將數據存入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);
        }
  1. mongo中經緯度的數據
    在這裏插入圖片描述
  2. 根據查詢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直接調用這個方法即可,最後出來的數據就是從近到遠排序的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章