zoukankan      html  css  js  c++  java
  • Android下如何计算两经纬点之间距离

    节选自百度地图API:

    若开发者使用的是百度地图或定位API,且版本在1.3.5以后的,

    路线规划提供了获取路线距离的方法,见MKRoutePlan 类的 getDistance 方法。

    如果是计算任意两点的距离,自2.0.0版本开始,Android SDK为开发者提供了计算距离的接口(DistanceUtil),具体使用方法如下:

    1. GeoPoint p1LL = new GeoPoint(39971802, 116347927);  
    2.   
    3. GeoPoint p2LL = new GeoPoint(39892131, 116498555);  
    4.   
    5. double distance = DistanceUtil.getDistance(p1LL, p2LL);  
    GeoPoint p1LL = new GeoPoint(39971802, 116347927);
    
    GeoPoint p2LL = new GeoPoint(39892131, 116498555);
    
    double distance = DistanceUtil.getDistance(p1LL, p2LL);

    若未使用百度地图或定位SDK,或是地图、定位SDK版本在1.3.5以下的,可以选用以下两种计算方式:

    一、利用勾股定理计算,适用于两点距离很近的情况;

    二、按标准的球面大圆劣弧长度计算,适用于距离较远的情况;

    1. static double DEF_PI = 3.14159265359; // PI  
    2.     static double DEF_2PI = 6.28318530712; // 2*PI  
    3.     static double DEF_PI180 = 0.01745329252; // PI/180.0  
    4.     static double DEF_R = 6370693.5; // radius of earth  
    5.       
    6.     /** 
    7.      * 第一种方式,按勾股定律求结果 
    8.      * @param lon1 
    9.      * @param lat1 
    10.      * @param lon2 
    11.      * @param lat2 
    12.      * @return 
    13.      * @author kazeik.chen QQ:77132995  2014-4-1下午4:30:09  
    14.      * TODO kazeik@163.com 
    15.      */  
    16.     public double GetShortDistance(double lon1, double lat1, double lon2,  
    17.             double lat2) {  
    18.         double ew1, ns1, ew2, ns2;  
    19.         double dx, dy, dew;  
    20.         double distance;  
    21.         // 角度转换为弧度  
    22.         ew1 = lon1 * DEF_PI180;  
    23.         ns1 = lat1 * DEF_PI180;  
    24.         ew2 = lon2 * DEF_PI180;  
    25.         ns2 = lat2 * DEF_PI180;  
    26.         // 经度差  
    27.         dew = ew1 - ew2;  
    28.         // 若跨东经和西经180 度,进行调整  
    29.         if (dew > DEF_PI)  
    30.             dew = DEF_2PI - dew;  
    31.         else if (dew < -DEF_PI)  
    32.             dew = DEF_2PI + dew;  
    33.         dx = DEF_R * Math.cos(ns1) * dew; // 东西方向长度(在纬度圈上的投影长度)  
    34.         dy = DEF_R * (ns1 - ns2); // 南北方向长度(在经度圈上的投影长度)  
    35.         // 勾股定理求斜边长  
    36.         distance = Math.sqrt(dx * dx + dy * dy);  
    37.         return distance;  
    38.     }  
    39.   
    40.     /** 
    41.      * 第二种方式,按大圆劣弧求距离 
    42.      * @param lon1 
    43.      * @param lat1 
    44.      * @param lon2 
    45.      * @param lat2 
    46.      * @return 
    47.      * @author kazeik.chen QQ:77132995  2014-4-1下午4:30:30  
    48.      * TODO kazeik@163.com 
    49.      */  
    50.     public double GetLongDistance(double lon1, double lat1, double lon2,  
    51.             double lat2) {  
    52.         double ew1, ns1, ew2, ns2;  
    53.         double distance;  
    54.         // 角度转换为弧度  
    55.         ew1 = lon1 * DEF_PI180;  
    56.         ns1 = lat1 * DEF_PI180;  
    57.         ew2 = lon2 * DEF_PI180;  
    58.         ns2 = lat2 * DEF_PI180;  
    59.         // 求大圆劣弧与球心所夹的角(弧度)  
    60.         distance = Math.sin(ns1) * Math.sin(ns2) + Math.cos(ns1)  
    61.                 * Math.cos(ns2) * Math.cos(ew1 - ew2);  
    62.         // 调整到[-1..1]范围内,避免溢出  
    63.         if (distance > 1.0)  
    64.             distance = 1.0;  
    65.         else if (distance < -1.0)  
    66.             distance = -1.0;  
    67.         // 求大圆劣弧长度  
    68.         distance = DEF_R * Math.acos(distance);  
    69.         return distance;  
    70.     }  
    71.     //以下是测试  
    72.     double mLat1 = 39.90923; // point1纬度  
    73.     double mLon1 = 116.357428; // point1经度  
    74.     double mLat2 = 39.90923;// point2纬度  
    75.     double mLon2 = 116.397428;// point2经度  
    76.     double distance = GetShortDistance(mLon1, mLat1, mLon2, mLat2);  
  • 相关阅读:
    nginx能访问html静态文件但无法访问php文件
    LeetCode "498. Diagonal Traverse"
    LeetCode "Teemo Attacking"
    LeetCode "501. Find Mode in Binary Search Tree"
    LeetCode "483. Smallest Good Base" !!
    LeetCode "467. Unique Substrings in Wraparound String" !!
    LeetCode "437. Path Sum III"
    LeetCode "454. 4Sum II"
    LeetCode "445. Add Two Numbers II"
    LeetCode "486. Predict the Winner" !!
  • 原文地址:https://www.cnblogs.com/hudabing/p/4571127.html
Copyright © 2011-2022 走看看