我的日常

登录/注册
您现在的位置:论坛 资料库 JAVA开发 > 根据两个位置的经纬度,来计算两地的距离
总共48087条微博

动态微博

查看: 1908|回复: 0

根据两个位置的经纬度,来计算两地的距离

[复制链接]

279

主题

41

听众

689

金钱

版主

该用户从未签到

跳转到指定楼层
楼主
发表于 2015-03-30 10:33:38 |只看该作者 |倒序浏览
  1. package com.fh.util;

  2. import java.util.HashMap;
  3. import java.util.Map;

  4. public class MapDistance {  
  5.           
  6.     private static double EARTH_RADIUS = 6378.137;  
  7.   
  8.     private static double rad(double d) {  
  9.         return d * Math.PI / 180.0;  
  10.     }
  11.    
  12.     /**
  13.      * 根据两个位置的经纬度,来计算两地的距离(单位为KM)
  14.      * 参数为String类型
  15.      * @param lat1 用户经度
  16.      * @param lng1 用户纬度
  17.      * @param lat2 商家经度
  18.      * @param lng2 商家纬度
  19.      * @return
  20.      */
  21.     public static String getDistance(String lat1Str, String lng1Str, String lat2Str, String lng2Str) {
  22.             Double lat1 = Double.parseDouble(lat1Str);
  23.             Double lng1 = Double.parseDouble(lng1Str);
  24.             Double lat2 = Double.parseDouble(lat2Str);
  25.             Double lng2 = Double.parseDouble(lng2Str);
  26.            
  27.         double radLat1 = rad(lat1);
  28.         double radLat2 = rad(lat2);
  29.         double difference = radLat1 - radLat2;
  30.         double mdifference = rad(lng1) - rad(lng2);
  31.         double distance = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(difference / 2), 2)
  32.                 + Math.cos(radLat1) * Math.cos(radLat2)
  33.                 * Math.pow(Math.sin(mdifference / 2), 2)));
  34.         distance = distance * EARTH_RADIUS;
  35.         distance = Math.round(distance * 10000) / 10000;
  36.         String distanceStr = distance+"";
  37.         distanceStr = distanceStr.
  38.                 substring(0, distanceStr.indexOf("."));
  39.         
  40.         return distanceStr;
  41.     }
  42.    
  43.     /**
  44.          * 获取当前用户一定距离以内的经纬度值
  45.          * 单位米 return minLat
  46.          * 最小经度 minLng
  47.          * 最小纬度 maxLat
  48.          * 最大经度 maxLng
  49.          * 最大纬度 minLat
  50.          */
  51.         public static Map getAround(String latStr, String lngStr, String raidus) {
  52.                 Map map = new HashMap();
  53.                
  54.                 Double latitude = Double.parseDouble(latStr);// 传值给经度
  55.                 Double longitude = Double.parseDouble(lngStr);// 传值给纬度

  56.                 Double degree = (24901 * 1609) / 360.0; // 获取每度
  57.                 double raidusMile = Double.parseDouble(raidus);
  58.                
  59.                 Double mpdLng = Double.parseDouble((degree * Math.cos(latitude * (Math.PI / 180))+"").replace("-", ""));
  60.                 Double dpmLng = 1 / mpdLng;
  61.                 Double radiusLng = dpmLng * raidusMile;
  62.                 //获取最小经度
  63.                 Double minLat = longitude - radiusLng;
  64.                 // 获取最大经度
  65.                 Double maxLat = longitude + radiusLng;
  66.                
  67.                 Double dpmLat = 1 / degree;
  68.                 Double radiusLat = dpmLat * raidusMile;
  69.                 // 获取最小纬度
  70.                 Double minLng = latitude - radiusLat;
  71.                 // 获取最大纬度
  72.                 Double maxLng = latitude + radiusLat;
  73.                
  74.                 map.put("minLat", minLat+"");
  75.                 map.put("maxLat", maxLat+"");
  76.                 map.put("minLng", minLng+"");
  77.                 map.put("maxLng", maxLng+"");
  78.                
  79.                 return map;
  80.         }
  81.    
  82.     public static void main(String[] args) {
  83.             //济南国际会展中心经纬度:117.11811  36.68484
  84.             //趵突泉:117.00999000000002  36.66123
  85.             //System.out.println(getDistance("117.11811","36.68484","117.00999000000002","36.66123"));
  86.            
  87.             System.out.println(getAround("117.11811", "36.68484", "13000"));
  88.             //117.01028712333508(Double), 117.22593287666493(Double),
  89.             //36.44829619896034(Double), 36.92138380103966(Double)
  90.            
  91.         }
  92.    
  93. }
复制代码



科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、科帮网管理员和版主有权不事先通知发贴者而删除本文


JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

快速回复
您需要登录后才可以回帖 登录 | 立即注册

   

关闭

站长推荐上一条 /1 下一条

发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
快速回复 返回顶部 返回列表