這個功能應用的場合似乎不多,但之前幫某客戶做網站時,正好需要計算兩個地點的距離用來計算車資,至於要如何實現這個功能呢?
嗯...老實說一剛開始挺苦惱的,好在有萬能的Google。深入搜索後,得知要計算兩點之間的距離可以透過兩點的經緯度做計算。(學到了一課)
得知這個資訊後,接著下來就是想辦法獲取地址的經緯度與利用經緯度計算距離了。
獲取地址經緯度
這個部份我們利用google map 的 api 來實現,基本上很簡單只須向google map發起簡單的請求就可以得到了,連API KEY都不用申請。
更新內容(2019.05.02):
目前google map api 已經強制要求要API KEY,新版的使用方式,請參閱
<?php
/*
* 獲取地址經緯度 - 從google map
*/
function getAddressLatLng($addr='')
{
//向google map請求
$geocode=file_get_contents('http://maps.google.com/maps/api/geocode/json?address='.$addr.'&sensor=false');
$output= json_decode($geocode);
//經度
$longitude = $output->results[0]->geometry->location->lng;
//緯度
$latitude = $output->results[0]->geometry->location->lat;
//返回資料
return array('lng'=>$longitude,'lat'=>$latitude);
}
#使用方式
$data = getAddressLatLng('地址');經緯度計算距離
使用上面的函數我們便可以知道兩點的地址分別的經緯度座標,接著下來我們在用計算公式去計算出兩點的距離。
下面的函式是從網路上蒐來的至於公式的原理我也不清楚,實際測試過是有效的,但與google map的距離還是有誤差,我想應該是這個公式算出來的是直線距離吧。
<?php
/**
* 計算兩點間的距離
* $lng1 第一組地址的經度
* $lat1 第一組地址的緯度
* $lng2 第二組地址的經度
* $lat2 第二組地址的緯度
*/
function getdistance($lng1,$lat1,$lng2,$lat2){
//將角度轉為弧度
$radLat1=deg2rad($lat1);
$radLat2=deg2rad($lat2);
$radLng1=deg2rad($lng1);
$radLng2=deg2rad($lng2);
$tmp1=$radLat1-$radLat2;
$tmp2=$radLng1-$radLng2;
//計算公式
$d=2*asin(sqrt(pow(sin($tmp1/2),2)+cos($radLat1)*cos($radLat2)*pow(sin($tmp2/2),2)))*6378.137*1000;
//單位公尺
return intval($d);
}利用這兩個函數,便能實現計算兩點間的距離了。 是不是很簡單,真的很簡單。(最近一直被這句洗腦...)
計算兩點距離實際範例
讓我們來實際試試看到底有沒有用吧!這邊簡單的示範台北市政府到台北101的距離。
<?php //台北市政府的地址 $addr1 = "台北市信義區市府路1號"; //台北101的地址 $addr2 = "台北市信義路五段7號"; //獲取台北市政府經緯度 $geo1 = getAddressLatLng($addr1); //獲取台北101經緯度 $geo2 = getAddressLatLng($addr2); $lng1 = $geo1['lng']; $lat1 = $geo1['lat']; $lng2 = $geo2['lng']; $lat2 = $geo2['lat']; //計算距離 $distance = getdistance($lng1,$lat1,$lng2,$lat2); //輸出結果 (單位公尺) echo $distance; //399m
我們這邊算出來的距離是399m(直線距離),但實際上用google map 算出來是600m(步行距離),看來準確度真的是僅供參考=.=
注意事項
在使用 getAddressLatLng() 這個函數要特別注意到一點,因為它是向google map 請求的,所以請求頻率太高有時會被拒絕,因此建議將獲取到的經緯度資訊保存在資料庫。
文章轉載或引用,請先告知並保留原文出處與連結!!(單純分享或非營利的只需保留原文出處,不用告知)
原文連結:
https://blog.aidec.tw/post/calculate-address-distance-use-google-map-and-php
若有業務合作需求,可寫信至: [email protected]
創業、網站經營相關內容未來將發布在 小易創業筆記