Java对关于两个地点的根据经纬度算出后排序

简介: Java对关于两个地点的根据经纬度算出后排序

1.排序

/**
     * 查询收货地址列表
     * 
     * @param request
     * @param wechatId
     * @return
     */
    @RequestMapping("/weixin/address/queryRecentlyAddress")
    public AddressVo queryRecentlyAddress(HttpServletRequest request, Integer wechatId, AddressVo vo) {
        String openId = OauthUtil.getInstance().getOpenId(request, String.valueOf(wechatId));
        // 查询收货地址
        Map<String, Object> map = new HashMap<String, Object>();
        String nowLng = (String) request.getAttribute("Lng");
        String nowLat = (String) request.getAttribute("Lat");
        
        map.put("openId", openId);
        List<AddressVo> aList = addressService.queryList(map);
        //TreeMap具有更具key做自动排序的功能,默认为正序即从小到大
        Map<Double,AddressVo> addressMap=new TreeMap<Double,AddressVo>();
        for(AddressVo address:aList){
            String latitude = address.getLatitude();
            String longitude = address.getLongitude();
            double distance = Distance(nowLng,nowLat,latitude,longitude);
            addressMap.put(distance,address);
        }
        AddressVo addressVo = addressMap.get(0);
        return addressVo;
    }

2.计算距离

 

//根据两个地点的经纬度,计算两的距离
      private static final double EARTH_RADIUS = 6378.137;
 
      private static double rad(double d){
                      return d * Math.PI / 180.0;
           }
 
 
 
    public  double Distance(String nowLng, String nowLat, String latitude, String longitude) {
            double long1;
            double lat1;
            double long2;
            double lat2;
            double a, b, sa2, sb2,d = 0;
            try {
                  long1 = Double.valueOf(nowLng);
                   lat1 = Double.valueOf(nowLat);
                   long2 = Double.valueOf(latitude);
                   lat2 = Double.valueOf(longitude);
                   lat1 = rad(lat1);
                   lat2 = rad(lat2);
                    a = lat1 - lat2;
                    b = rad(long1 - long2);
                    sa2 = Math.sin(a / 2.0);
                    sb2 = Math.sin(b / 2.0);
                    d = 2   * EARTH_RADIUS
                            * Math.asin(Math.sqrt(sa2 * sa2 + Math.cos(lat1)
                            * Math.cos(lat2) * sb2 * sb2));
                    
            } catch (Exception e) {
            
                e.printStackTrace();
            }
            return d;
   }

 

相关文章
|
8月前
|
监控 Java API
Java语言按文件创建日期排序及获取最新文件的技术
这段代码实现了文件创建时间的读取、文件列表的获取与排序以及获取最新文件的需求。它具备良好的效率和可读性,对于绝大多数处理文件属性相关的需求来说足够健壮。在实际应用中,根据具体情况,可能还需要进一步处理如访问权限不足、文件系统不支持某些属性等边界情况。
388 14
|
Java 程序员
Java 排序神器:Comparable 和 Comparator 该怎么选?
嗨,大家好,我是小米!今天和大家聊一聊Java社招面试中常考的经典问题——Comparable和Comparator的区别。Comparable定义对象的自然排序,适用于单一固定的排序规则;Comparator则是策略接口,用于定义自定义排序规则,适用于多样化或多变的排序需求。掌握这两者的区别是理解Java排序机制的基础,也是面试中的加分题。结合实际项目场景深入探讨它们的应用,能更好地打动面试官。如果你觉得有帮助,欢迎点赞、收藏、分享,期待你的一键三连!我们下期见~ 我是小米,一个喜欢分享技术的程序员,关注我的微信公众号“软件求生”,获取更多技术干货!
210 20
|
Java API 存储
Java如何对List进行排序?
【7月更文挑战第26天】
1961 9
Java如何对List进行排序?
|
Java API
Java 8,如何对 ArrayList 元素进行排序?
【8月更文挑战第16天】
2039 2
Java 8,如何对 ArrayList 元素进行排序?
|
存储 搜索推荐 算法
【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)
【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)
225 1
|
存储 Java API
【Java高手必备】揭秘!如何优雅地对List进行排序?掌握这几种技巧,让你的代码瞬间高大上!
【8月更文挑战第23天】本文深入探讨了Java中对List集合进行排序的各种方法,包括使用Collections.sort()、自定义Comparator以及Java 8的Stream API。通过示例代码展示了不同情况下如何选择合适的方法:从简单的整数排序到自定义类对象的排序,再到利用Comparator指定特殊排序规则,最后介绍了Stream API在排序操作中的简洁应用。理解这些技术的区别与应用场景有助于提高编程效率。
814 4
|
Java 容器
07 Java数组与数组操作(定义+遍历+排序+增删改查)(上)
07 Java数组与数组操作(定义+遍历+排序+增删改查)
209 8
|
搜索推荐 算法 Java
堆排序实战:轻松实现高效排序,附详细Java代码
嗨,大家好!我是小米,一名热爱技术分享的程序员。今天要带大家了解堆排序——一种基于二叉堆的数据结构,具有O(n log n)时间复杂度的选择排序算法。堆排序分为构建大顶堆和排序两个阶段:先建堆使根节点为最大值,再通过交换根节点与末尾节点并调整堆来逐步排序。它稳定高效,空间复杂度仅O(1),适合对稳定性要求高的场合。虽然不如快速排序快,但在避免递归和节省空间方面有优势。一起动手实现吧!如果有任何疑问,欢迎留言交流!
490 2
|
存储 Java