顯示廣告
隱藏 ✕
※ 本文為轉錄連結,轉錄者為 mesak
看板 Knuckles_note
作者 Knuckles (站長 那克斯)
標題 [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++){
	
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&region=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
※ 看板: Mesak 文章推薦值: 2 目前人氣: 0 累積人氣: 9647 
※ 本文也出現在看板: KnucklesNote
( ̄︶ ̄)b mesak, c66702000 說讚!
mesak 轉錄至看板 Mesak (使用連結) 時間:2013-05-06 09:54:07
1樓 時間: 2015-06-25 16:38:55 (台灣)
  06-25 16:38 TW
請問站長, 研究了這功能, 為何echo 出現一片空白, 可以幫忙解答, 謝謝
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇