spring-data-mongo根据两个经纬度之间距离进行排序

该博客介绍了如何使用Spring Data MongoDB将带有经纬度的实体类存储到MongoDB,并基于传入的经纬度与数据库中的坐标计算距离,实现查询结果的排序。通过控制器调用相应方法,可以获取按距离从近到远排序的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将数据(数据中带有经纬度字段)存入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直接调用这个方法即可,最后出来的数据就是从近到远排序的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值