【问题标题】:Extract postcode from Google Maps API JSON using Google Refine使用 Google Refine 从 Google Maps API JSON 中提取邮政编码
【发布时间】:2013-04-08 04:28:24
【问题描述】:

我正在尝试使用 Google Refine 从 Google Maps API JSON 中提取邮政编码。

我通过获取 URL 添加了一个新列:

"http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=" + escape(value, "url")

那么生成的JSON如下:

{ "results" : [ { "address_components" : [ { "long_name" : "44", "short_name" : "44", "types" : [ "street_number" ] }, { "long_name" : "Homer Street", "short_name" : "Homer St", "types" : [ "route" ] }, { "long_name" : "London", "short_name" : "London", "types" : [ "locality", "political" ] }, { "long_name" : "Greater London", "short_name" : "Gt Lon", "types" : [ "administrative_area_level_2", "political" ] }, { "long_name" : "United Kingdom", "short_name" : "GB", "types" : [ "country", "political" ] }, { "long_name" : "W1H 4NW", "short_name" : "W1H 4NW", "types" : [ "postal_code" ] }, { "long_name" : "London", "short_name" : "London", "types" : [ "postal_town" ] } ], "formatted_address" : "44 Homer Street, London, Greater London W1H 4NW, UK", "geometry" : { "location" : { "lat" : 51.51981750, "lng" : -0.16534040 }, "location_type" : "ROOFTOP", "viewport" : { "northeast" : { "lat" : 51.52116648029151, "lng" : -0.1639914197084980 }, "southwest" : { "lat" : 51.51846851970851, "lng" : -0.1666893802915020 } } }, "types" : [ "street_address" ] } ], "status" : "OK" }

在浏览了几篇博客找到相关代码后,我尝试使用此转换列...

value.parseJson().results[0]["formatted_address"]

...这对完整地址很有用。

当我尝试提取邮政编码时出现问题。我试着摆弄,一无所获,然后我下载了 JSONPad 并将 JSON 粘贴到树图中以获取路径:

value.parseJson().results[0]["address_components"][5]["long_name"]

问题在于,这对于某些条目来说是完美地提取了邮政编码,而对于其他条目来说却不是那么完美,它提取了其他东西——例如城镇或国家。

将 [5] 更改为 [6] 似乎可以提取其他地址的邮政编码,但有没有办法只提取邮政编码,而不管它在结构中的哪个位置?

非常感谢任何帮助!

【问题讨论】:

    标签: json google-maps postal-code google-refine


    【解决方案1】:

    您可以将邓肯的回答从 Javascript 翻译成 Python 并将其与 Jython 解释器一起使用,或者您可以使用以下 GREL 表达式(我发布到 Google 网上论坛以响应您的查询):

    filter(forEach(value.parseJson().results[0].address_components,c,if(c.types[0]=='postal_code',c.long_name,'')),v,v!= '')[0]

    当然,这一切都假定您根据 API 的服务条款将此数据用于在 Google 地图上显示。

    【讨论】:

      【解决方案2】:

      您可能需要做的是遍历 address_components 数组中的结构,检查每个结构的“类型”。当 types 包含“postal_code”时,然后是 tada,那就是您的邮政编码。

      类似于以下代码(对我有用):

      <script type="text/javascript">
      var stuData = 
      {
          "results": [{
                  "address_components": [{
                          "long_name": "44",
                          "short_name": "44",
                          "types": ["street_number"]
                      }, {
                          "long_name": "Homer Street",
                          "short_name": "Homer St",
                          "types": ["route"]
                      }, {
                          "long_name": "London",
                          "short_name": "London",
                          "types": ["locality", "political"]
                      }, {
                          "long_name": "Greater London",
                          "short_name": "Gt Lon",
                          "types": ["administrative_area_level_2", "political"]
                      }, {
                          "long_name": "United Kingdom",
                          "short_name": "GB",
                          "types": ["country", "political"]
                      }, {
                          "long_name": "W1H 4NW",
                          "short_name": "W1H 4NW",
                          "types": ["postal_code"]
                      }, {
                          "long_name": "London",
                          "short_name": "London",
                          "types": ["postal_town"]
                      }
                  ],
                  "formatted_address": "44 Homer Street, London, Greater London W1H 4NW, UK",
                  "geometry": {
                      "location": {
                          "lat": 51.51981750,
                          "lng": -0.16534040
                      },
                      "location_type": "ROOFTOP",
                      "viewport": {
                          "northeast": {
                              "lat": 51.52116648029151,
                              "lng": -0.1639914197084980
                          },
                          "southwest": {
                              "lat": 51.51846851970851,
                              "lng": -0.1666893802915020
                          }
                      }
                  },
                  "types": ["street_address"]
              }
          ],
          "status": "OK"
      };
      
      var myPostcode;
      
      for (var i = 0; i < stuData.results[0].address_components.length; i++) {
          for (var j = 0; j < stuData.results[0].address_components[i].types.length; j++) {
              if (stuData.results[0].address_components[i].types[j] == "postal_code") {
                  myPostcode = stuData.results[0].address_components[i].long_name;
                  break;
              }
          }
      }
      
      console.log(myPostcode);
      </script>
      

      【讨论】:

      • 谢谢,但请原谅我 - 我如何将其合并到 Google Refine 中?我是否需要用您的代码替换“通过获取 URL 添加列”列的结果,然后使用相同的... value.parseJson().results[0]["address_components"][5]["long_name" ] ...像以前一样处理?
      • 抱歉,我不熟悉 Google Refine。在我提到 stuData 的地方,您可能只使用您的value.parseJson(),例如i &lt; value.parseJson().results[0].address_components.length
      猜你喜欢
      • 2011-11-28
      • 2011-07-31
      • 2017-02-15
      • 2018-01-03
      • 2014-06-11
      • 2016-03-13
      • 2021-06-08
      • 2011-05-19
      • 2017-10-06
      相关资源
      最近更新 更多