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

/**
     * 查询收货地址列表
     *
     * @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;
    }

根据两个点的经纬度算出两个点之间的距离

//根据两个地点的经纬度,计算两的距离

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;
   }
时间: 2024-12-29 01:27:33

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

Java 多线程编程两个简单的例子

/** * @author gao */ package gao.org; public class RunnableDemo implements Runnable{ @Override public void run() { // TODO Auto-generated method stub for(int i=0;i<10;i++){ System.out.println("新线程输出:"+i); } } public static void main(String []

Java float保留两位小数或多位小数

转自:Java float保留两位小数或多位小数 方法1:用Math.round计算,这里返回的数字格式的. float price=89.89; int itemNum=3; float totalPrice=price*itemNum; float num=(float)(Math.round(totalPrice*100)/100);//如果要求精确4位就*10000然后/10000 方法2:用DecimalFormat 返回的是String格式的.该类对十进制进行全面的封装.像%号,千分

【Java多线程】两种基本实现框架

Java多线程学习1——两种基本实现框架 一.前言 当一个Java程序启动的时候,一个线程就立刻启动,改程序通常也被我们称作程序的主线程.其他所有的子线程都是由主线程产生的.主线程是程序开始就执行的,并且程序最终是以主线程的结束而结束的. Java编写程序都运行在在Java虚拟机(JVM)中,在JVM的内部,程序的多任务是通过线程来实现的.每用Java命令启动一个Java应用程序,就会启动一个JVM进程.在同一个JVM进程中,有且只有一个进程,就是它自己.在这个JVM环境中,所有程序代码的运行都

[Java基础] Java float保留两位小数或多位小数

方法1:用Math.round计算,这里返回的数字格式的. float price=89.89; int itemNum=3; float totalPrice=price*itemNum; float num=(float)(Math.round(totalPrice*100)/100);//如果要求精确4位就*10000然后/10000 方法2:用DecimalFormat 返回的是String格式的.该类对十进制进行全面的封装.像%号,千分位,小数精度.科学计算. float price=

Java中比较两个字符串是否相等的问题

java中判断两个字符串是否相等的问题 我最近刚学java,今天编程的时候就遇到一个棘手的问题,就是关于判断两个字符串是否相等的问题.在编程中,通常比较两个字符串是否相同的表达式是"==",但在java中不能这么写.在java中,用的是equals(); 例:A字符串和B和字符串比较: if(A.equals(B)){ } 返回true 或false. String 的equals 方法用于比较两个字符串是否相等.由于字符串是对象类型,所以不能用简单的"=="判断.

如何处理Java异常的两个例子?

下面有两个例子.一个是告诉我们调用方法也需要处理被调用者所抛出的异常:另一个是告诉我们父类可以被用来捕获或者处理异常. 1.调用方法必须处理被调用者所抛出的异常 下面是一个小小处理异常的程序.仅仅只是为了测试,如果在一个方法里抛出一个异常,不仅仅那个方法,而且调用该方法的所有方法必须声明或抛出该异常. public class exceptionTest { private static Exception exception; public static void main(String[]

浅析Java语言中两种异常的差别

Java提供了两类主要的异常:runtime exception和checked exception.所有的checked exception是从java.lang.Exception类衍生出来的,而runtime exception则是从java.lang.RuntimeException或java.lang.Error类衍生出来的. 它们的不同之处表现在两方面:机制上和逻辑上. 一.机制上  它们在机制上的不同表现在两点:1.如何定义方法;2. 如何处理抛出的异常.请看下面CheckedEx

Java 多线程编程两个简单的样例

/** * @author gao */ package gao.org; public class RunnableDemo implements Runnable{ @Override public void run() { // TODO Auto-generated method stub for(int i=0;i<10;i++){ System.out.println("新线程输出:"+i); } } public static void main(String []

java多线程的两个创建方法

Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法: ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法. 为什么Java要提供两种方法来创建线程呢?它们都有哪些区别?相比而言,哪一种方法更好呢? 在Java中,类仅支持单继承,