从Google地理编码器中提取单个地址组件会生成Google Apps脚本

时间:2014-06-11 19:55:13

标签: google-apps-script google-geocoder

从JSON Google地理编码器结果中获取单个地址组件似乎有些困难。例如,我想根据地址获取县名。有人可以解释为什么,例如,这段代码不起作用?

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

有什么建议吗?

2 个答案:

答案 0 :(得分: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]}

在这种情况下,没有任何组件是&#34; administrative_area_level_2&#34;,但在您的情况下可能是。

您还应该考虑使用Array.forEach

希望这可以帮助您确定更具体的问题。

答案 1 :(得分:0)

要添加Aaron和Micah的答案,你真的很接近,只需要选择第一个结果。 geocode生成一系列结果,但如果您对单个地址进行地理编码,那么抓住第一个地址就行了。他们的答案使用的是白宫地址,该地址似乎没有县,但使用谷歌总部(正如谷歌在例子中所做的那样)会产生有效的结果。

这里是用于选择geocoding responses的任何组件的通用函数,同时利用indexOf检查所需组件是否在types数组中(保存{{1}循环):

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; } } } 进行测试,我们得到了圣克拉拉县的正确价值&#39;:

Logger