※ 本文為轉錄連結,轉錄者為 mesak
看板 Knuckles_note
作者 標題 [PHP] 使用 Google Map API 將地址轉為經緯度
時間 2012年12月18日 Tue. PM 02:29:47
參考: Google Geocoding API
使用 PHP/MySQL 進行地址地理編碼
什麼是地理編碼?
地理編碼是指將地址 (例如 1600 Amphitheatre Parkway, Mountain View, CA) 轉換成地理座標 (例如緯度 37.423021 和經度 -122.083739) 的程序,而您可以使用這些座標來放置標記或設定地圖位置。
使用限制
Google Geocoding API 有查詢限制,每天只能要求 2,500 個地理位置 (Google Maps API Premier 使用者每天最多可查詢 100,000 個要求)。之所以要有這個限制,是為了避免有人濫用 Geocoding API 和 (或) 將其用在其他目的。此限制以後如有變更,恕不另行通知。此外,我們也限制要求頻率,以避免發生濫用服務的狀況。如果您已超過 24 小時的使用上限或是濫用服務,Geocoding API 將暫時無法使用。如果您持續超過上限,則會遭到封鎖,無法使用 Geocoding API。
使用PHP將多個地址的經緯度抓回來
<?php
$addr_str_array = array('地址1','地址2');
$num_addr = count($addr_str);
$addr_latlng_array = array(); //用來存抓到的經緯度
for($i=0; $i<$num_addr ; $i++){
/*
location_type 會儲存指定位置的其他相關資料,目前支援的值如下:
"ROOFTOP" 會指出傳回的結果是精準的地理編碼,因為結果中位置資訊的精確範圍已縮小至街道地址。
"RANGE_INTERPOLATED" 表示傳回的結果反映的是插入在兩個精確定點之間 (例如十字路口) 的約略位置 (通常會在街道上)。如果 Geocoder 無法取得街道地址的精確定點地理編碼,就會傳回插入的結果。
"GEOMETRIC_CENTER" 表示傳回的結果是結果的幾何中心,包括折線 (例如街道) 和多邊形 (區域)。
"APPROXIMATE" 表示傳回的結果是約略位置。
*/
}
$addr_str_array = array('地址1','地址2');
$num_addr = count($addr_str);
$addr_latlng_array = array(); //用來存抓到的經緯度
for($i=0; $i<$num_addr ; $i++){
set_time_limit(10);
$addr_str = $addr_str_array[$i];
$addr_str_encode = urlencode($addr_str);
$url = "http://maps.googleapis.com/maps/api/geocode/json"
."?sensor=true&language=zh-TW®ion=tw&address=".$addr_str_encode;
$geo = file_get_contents($url);
$geo = json_decode($geo,true);
$geo_status = $geo['status'];
echo "$addr_str $geo_status\n";
if($geo_status=="OVER_QUERY_LIMIT"){ die("OVER_QUERY_LIMIT"); }
if($geo_status!="OK") continue;
$geo_address = $geo['results'][0]['formatted_address'];
$num_components = count($geo['results'][0]['address_components']);
//郵遞區號、經緯度
$geo_zip = $geo['results'][0]['address_components'][$num_components-1]['long_name'];
$geo_lat = $geo['results'][0]['geometry']['location']['lat'];
$geo_lng = $geo['results'][0]['geometry']['location']['lng'];
$geo_location_type = $geo['results'][0]['geometry']['location_type'];
/*
location_type 會儲存指定位置的其他相關資料,目前支援的值如下:
"ROOFTOP" 會指出傳回的結果是精準的地理編碼,因為結果中位置資訊的精確範圍已縮小至街道地址。
"RANGE_INTERPOLATED" 表示傳回的結果反映的是插入在兩個精確定點之間 (例如十字路口) 的約略位置 (通常會在街道上)。如果 Geocoder 無法取得街道地址的精確定點地理編碼,就會傳回插入的結果。
"GEOMETRIC_CENTER" 表示傳回的結果是結果的幾何中心,包括折線 (例如街道) 和多邊形 (區域)。
"APPROXIMATE" 表示傳回的結果是約略位置。
*/
//if($geo_location_type!="ROOFTOP") continue;
$addr_latlng_array[$i] = array($geo_lat,$geo_lng);
sleep(1); //不能讀太快,每筆要間隔一秒
}
--
※ 作者: Knuckles 時間: 2012-12-18 14:29:47
※ 編輯: Knuckles 時間: 2015-10-19 06:59:59
回列表(←)
分享