2014-06-11 53 views
1

從JSON Google地理編碼器結果中獲取各個地址組件似乎存在一些困難。例如,我想根據地址獲取縣名。有人可以解釋爲什麼,例如,這段代碼不起作用嗎?從Google地理編碼器中提取各個地址組件導致Google Apps腳本

function county(){ 
    var geo = Maps.newGeocoder().geocode('address'); 
    for (var i=0; i<geo.results.address_components.length; i++) 
    for (var j=0; j<geo.results.address_components[i].types.length; j++) 
     if (geo.results.address_components[i].types[j]=="administrative_area_level_2") 
     var county = geo.results.address_components[i].long_name; 
} 

我知道這是過於簡單,但它甚至不能識別results.address_components

有什麼建議?

+0

歡迎來到SO,比爾!沒有必要告誡你的問題,這根本不是一個愚蠢的問題(儘管這裏也很好,答案很簡單)。爲了將來的參考,如果您可以提供可複製的代碼(即使用真實地址而不是「地址」),社區將更容易排除故障,並且如果您複製錯誤消息,也可以節省時間。乾杯。 –

回答

0

可以使用Logger對象看中介的數據是這樣的:

Logger.log(geo) 

你會看到在視圖菜單這樣的事情,在日誌:

{results=[{address_components=[{long_name=Address, short_name=Address, types=[point_of_interest, establishment]}, {long_name=Madrid, short_name=Madrid, types=[locality, political]}, {long_name=Madrid, short_name=M, types=[administrative_area_level_2, political]}, {long_name=Community of Madrid, short_name=Community of Madrid, types=[administrative_area_level_1, political]}, {long_name=Spain, short_name=ES, types=[country, political]}, {long_name=28039, short_name=28039, types=[postal_code]}], formatted_address=Address, 28039 Madrid, Spain, types=[hospital, point_of_interest, establishment], geometry={viewport={southwest={lng=-3.708366880291502, lat=40.44598801970851}, northeast={lng=-3.705668919708498, lat=40.44868598029151}}, location_type=APPROXIMATE, location={lng=-3.7070179, lat=40.447337}}}, {address_components=[{long_name=Address:, short_name=Address:, types=[point_of_interest, establishment]}, {long_name=Pineville, short_name=Pineville, types=[locality, political]}, {long_name=1, Charlotte, short_name=1, Charlotte, types=[administrative_area_level_3, political]}, {long_name=Mecklenburg County, .........

如果你跑

function myFunction() { 
    var geo = Maps.newGeocoder().geocode('1600 pennsylvania ave, washington, dc'); 
    Logger.log(geo.results[0].address_components); 
} 

myFunction(); 

你可以在日誌中看到組件,它看起來就像這樣:

{long_name=1600, short_name=1600, types=[street_number]}, {long_name=President's Park, short_name=President's Park, types=[establishment]}, {long_name=Pennsylvania Avenue Northwest, short_name=Pennsylvania Ave NW, types=[route]}, {long_name=Washington, short_name=Washington, types=[locality, political]}, {long_name=District of Columbia, short_name=DC, types=[administrative_area_level_1, political]}, {long_name=United States, short_name=US, types=[country, political]}, {long_name=20500, short_name=20500, types=[postal_code]}

在這種情況下,沒有一個組件是「administrative_area_level_2」,但在你的情況下,他們可能會。您可以考慮使用Array.forEach

希望這可以幫助您確定更具體的問題。

0

爲了增加Aaron和Micah的答案,你真的很接近,主要需要選擇第一個結果。 geocode會生成一個結果數組,但如果您要對單個地址進行地址解析,那麼抓住第一個地址就行。他們的答案使用白宮的地址,似乎沒有一個縣,但使用谷歌總部(谷歌往往在例子中)做出了有效的結果。

下面是選擇geocoding responses的任何成分,還利用indexOf檢查所需的組件是types陣列(保存for環路)的通用功能:

function getAddressComponent(address, component) { 
    var geo = Maps.newGeocoder().geocode(address); 
    var resultComponents = geo.results[0].address_components; 
    for (var i = 0; i < resultComponents.length; i++) { 
    if (resultComponents[i].types.indexOf(component) > -1) { 
     return resultComponents[i].long_name; 
    } 
    } 
} 

測試與Logger,我們得到「聖克拉拉縣」的正確價值:

function getAddressComponent_test() { 
    var address = '1600 Amphitheatre Parkway, Mountain View, CA'; 
    Logger.log(getAddressComponent(address, 'administrative_area_level_2')); 
} 
相關問題