將數據(數據中帶有經緯度字段)存入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直接調用這個方法即可,最後出來的數據就是從近到遠排序的