地址之間的距離 - 地理信息系統(4)

(2017-07-17 銀河統計)

在哈爾濱市,從道里區通達街138號到道里區井街18號的距離是多少?這個問題能夠有多種答案。首先,將兩個地址進行地址解析,經緯度爲:算法

點A:哈爾濱市道里區通達街138號(126.616759,45.74989)
點B:哈爾濱市道里區井街18號(126.628442,45.786112)

墨卡託座標爲:數組

點A:哈爾濱市道里區通達街138號(14095066.5,5709461.47)
點B:哈爾濱市道里區井街18號(14096367.06,5715222.83)

根據地址和經緯度均可以計算出不一樣位置之間的距離,一般應該先將地址解析爲經緯度或墨卡託座標,而後再計算各類距離。app

一、直線距離

已知兩點間平面座標(墨卡託座標)\(A(X_1, Y_1)\)\(B(X_2, Y_2)\),根據歐氏距離公式,函數

\[S=\sqrt{(X_1 - X_2)^2+(Y_1 - Y_2)^2}=\sqrt{(14095066.5 - 14096367.06)^2+(5709461.47 - 5715222.83)^2}\approx 5906.33\]工具

能夠計算出兩點間直線距離爲5906.33像素。學習

二、球面距離

已知兩點間經緯度座標\(A(JD_1, WD_1)\)\(B(JD_2, WD_2)\),根據百度地圖API提供的算法計算球面距離,spa

地址A: 經度   緯度 
地址B: 經度   緯度 
球面距離:   (米) 

注:更改地址A和地址B經緯度,點擊「計算球面距離」按鈕可計算出兩點間球面距離code

百度地圖API代碼(Javascript)排序

var point1 = new BMap.Point(126.616759, 45.74989);  
var point2 = new BMap.Point(126.628442, 45.786112);  
var distance = map.getDistance(point1,point2);

三、駕車距離和時間

直線距離或球面距離屬於數學範疇的抽象距離。在城鎮中,兩個地址間的距離取決於街道距離或街道的連通性。一般分爲兩個地址間的的駕車距離、步行距離或公交距離及所需時間。ip

I、兩個地址之間的駕車距離和時間

地址A 
地址B 
駕車距離  (米) 駕車時間  (分鐘)

II、兩個經緯度座標之間的駕車距離和時間

地址A: 經度   緯度 
地址B: 經度   緯度 
駕車距離  (米) 駕車時間  (分鐘)

注:兩個地址或兩個經緯度座標之間的駕車時長和時間點有關,只是作完出行參考。駕車距離指標反映街區距離,在數據分析和建模中很是有用。兩個地址能夠先轉換爲經緯度再計算駕車距離,因此兩個經緯度座標之間的駕車或步行距離是基本街區距離指標

百度地圖API代碼(Javascript)

var transit = new BMap.DrivingRoute(map, {renderOptions: {map: map},
onSearchComplete: function (results){
if (transit.getStatus() != BMAP_STATUS_SUCCESS){return;}
        var plan = results.getPlan(0);
            alert(plan.getDistance(true));  //駕車距離
            alert(plan.getDuration(true));  //駕車時間
        },
    onPolylinesSet: function(){setTimeout(function(){},"1000");     
}});
transit.search(new BMap.Point(126.616759, 45.74989), new BMap.Point(126.628442, 45.786112));

四、步行距離和時間

地址A: 經度   緯度 
地址B: 經度   緯度 
步行距離  (米) 步行時間  (分鐘)

注:兩個地址或兩個經緯度座標之間的步行時長和時間點無關

百度地圖API代碼(Javascript)

var Walking = new BMap.WalkingRoute(map, {renderOptions: {map: map},
onSearchComplete: function (results){
if (Walking.getStatus() != BMAP_STATUS_SUCCESS){return;}
        var plan = results.getPlan(0);
            alert(plan.getDistance(true));  //步行距離
            alert(plan.getDuration(true));  //步行時間
        },
    onPolylinesSet: function(){setTimeout(function(){},"1000");     
}});
Walking.search(new BMap.Point(126.616759, 45.74989), new BMap.Point(126.628442, 45.786112));

五、公交距離和時間

地址A: 經度   緯度 
地址B: 經度   緯度 
公交距離  (米) 公交時間  (分鐘)

注:兩個地址或兩個經緯度座標之間的公交時長和時間點有關

百度地圖API代碼(Javascript)

var transit = new BMap.TransitRoute(map, {renderOptions: {map: map},
onSearchComplete: function (results){
if (transit.getStatus() != BMAP_STATUS_SUCCESS){return;}
        var plan = results.getPlan(0);
            alert(plan.getDistance(true));  //公交距離
            alert(plan.getDuration(true));  //公交時間
        },
    onPolylinesSet: function(){setTimeout(function(){},"1000");     
}});
transit.search(new BMap.Point(126.616759, 45.74989), new BMap.Point(126.628442, 45.786112));

六、一對多點直線和球面距離計算

一對多點距離計算能夠按不一樣距離搜索出離某一特定地址(點)最近的K個地址(點),技術結果在空間插值方法和數據挖掘技術中常常用到。

經度   緯度 

不一樣距離選項: 

注:在下拉框中選擇直線距離或球面距離,可輸出距離(由小到大)表

七、一對多點駕車、步行和公交距離計算

經度   緯度 

經緯度數組長度   當前項         

操做步驟:

I、  重複點擊「計算距離」(節奏不用太快),直至當前項和經緯度數組長度相等;
II、 點擊「距離列表」得到排序後的全部距離表格;
III、點擊「數據重置」按鈕設置全部缺省參數,以便於從新計算。

注:一對多點駕車、步行和公交距離百度地圖API沒有批量處理功能,運用Javacript回調函數每次只能調回一對經緯度間的駕車、步行或公交距離。若是要計算1個經緯度點到10個經緯度點之間的距離,須要點擊10次「距離計算」按鈕

本文提供的各類距離計算工具僅用於我的學習或教學研究用途,不支持大批量商業用途的駕車、步行和公交距離計算(因爲百度地圖key的限制)。

相關文章
相關標籤/搜索