已知兩點經緯度計算距離

已知兩點經緯度計算距離

該博文來自於ieayoio的博客:http://www.ieayoio.com/

最近做了一些計算最近附近商店距離的工作,距離計算原以就是勾股定理那麼簡單,然而真去做的時候才知道太天真了,經線上緯度每差一度可以有一個確定的值,然而,因爲緯線圈的長度隨着緯度的改變而改變,不能單純的計算每個單位經度上距離的一個確定值。
經過一番的查找,原來計算距離有一個公式如下:
S=2arcsinsin2a2+cos(Lat1)×cos(Lat2)×sin2b2×6378.137 S = 2 arcsin\sqrt{sin^2\frac a2 + cos(Lat1) × cos(Lat2) × sin^2\frac b2} × 6378.137

  1. Lat1 Lung1 表示A點經緯度,Lat2 Lung2 表示B點經緯度,這裏的單位是弧度而不是角度;

  2. a=Lat1 – Lat2 爲兩點緯度之差 b=Lung1 -Lung2 爲兩點經度之差;

  3. 6378.137爲地球半徑,單位爲千米;

從公式中可以看到兩點的經度Lung1和Lung2沒有包含在公式中,而只是包含在差值之中。

知道公式了,網上的各種教程無非就是套用公式,例如數據庫要查詢可以寫一個自定義的函數,一下以mysql爲例:

DROP FUNCTION IF EXISTS GetDistance;
DELIMITER $$
CREATE FUNCTION GetDistance(LatBegin DOUBLE, LngBegin DOUBLE, LatEnd DOUBLE, LngEnd DOUBLE)
RETURNS DOUBLE  
BEGIN  
  DECLARE Distance DOUBLE;
  DECLARE EARTH_RADIUS DOUBLE;
  DECLARE RadLatBegin,RadLatEnd,RadLatDiff,RadLngDiff DOUBLE; 
  SET EARTH_RADIUS = 6378.137;
  SET RadLatBegin = LatBegin * PI()/180.0;
  SET RadLatEnd = LatEnd * PI()/180.0;
  SET RadLatDiff = RadLatBegin - RadLatEnd;
  SET RadLngDiff = LngBegin * PI()/180.0 - LngEnd * PI()/180.0;   
  SET Distance = 2 *ASIN(SQRT(POWER(SIN(RadLatDiff/2), 2)+COS(RadLatBegin)*COS(RadLatEnd)*POWER(SIN(RadLngDiff/2), 2)));
  SET Distance = Distance * EARTH_RADIUS;
  RETURN Distance;
END  $$
DELIMITER ;

這樣定義一個自定義函數之後就可以直接利用這個函數進行數據庫的查詢和排序,例如:

SELECT * FROM `shop` WHERE GetDistance(`double_latitude`,`double_longitude`,34.54,234.4) < 5 ORDER BY GetDistance(`double_latitude`,`double_longitude`,34.54,234.4) DESC LIMIT 1,20

另外再提供一個Java版本:

import static java.lang.Math.*;

/**
 * Created by ieayoio on 16-12-2.
 */
public class DistanceUtils {
    
    public static double getDistance(double LatBegin, double LngBegin, double LatEnd, double LngEnd) {

        double EARTH_RADIUS = 6378.137;

        double RadLatBegin = LatBegin * PI / 180.0;
        double RadLatEnd = LatEnd * PI / 180.0;
        double RadLatDiff = RadLatBegin - RadLatEnd;
        double RadLngDiff = LngBegin * PI / 180.0 - LngEnd * PI / 180.0;

        double Distance = 2 * asin(sqrt(pow(sin(RadLatDiff / 2), 2) + cos(RadLatBegin) * cos(RadLatEnd) * pow(sin(RadLngDiff / 2), 2)));
        return Distance * EARTH_RADIUS;
    }
}

本文鏈接:http://www.ieayoio.com/2016/12/02/已知經緯度計算距離/

參考資料:
https://zhidao.baidu.com/question/401287294.html
http://blog.csdn.net/smartsmile2012/article/details/45339787
http://blog.csdn.net/xiyang_1990/article/details/16803735

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章