在JQ(非JQuery)中解析Google Maps JSON数据以进行地理编码

时间:2014-11-24 11:07:01

标签: json google-maps jq

我正在尝试使用JQ从Lat和Long值获取Country和City名称。

以下是JSON的完整示例 https://maps.googleapis.com/maps/api/geocode/json?latlng=55.397563,10.39870099999996&sensor=false

我在jqplay

中粘贴了返回的JSON

尝试选择国家和城市名称,但我得到的最接近的是

.results[0].address_components[].short_name

如何指定将节点置于"types" : [ "country", "political" ]

的位置

由于

3 个答案:

答案 0 :(得分:1)

我不清楚你究竟在寻找什么。每个结果都有一组类型,每个地址组件也有一组类型。你想要哪一个?我们可以编写一个与您尝试的相匹配的过滤器,但考虑到数据,它对您来说完全没用。包含您列出的类型的唯一项目只是国家/地区名称。

无论如何,假设您想要获得具有"country""political"类型的结果对象,请使用contains()过滤器。

.results | map(
    select(
        .types | contains(["country","political"])
    )
)

否则,您需要从此数据集中明确您想要的内容。预期结果的一个例子......

答案 1 :(得分:0)

我写了一个函数来做到这一点。

/**
*   geocodeResponse is an object full of address data.  
*   This function will "fish" for the right value
*   
*   example: type = 'postal_code' => 
*   geocodeResponse.address_components[5].types[1] = 'postal_code'
*   geocodeResponse.address_components[5].long_name = '1000'
* 
*   type = 'route' => 
*   geocodeResponse.address_components[1].types[1] = 'route'
*   geocodeResponse.address_components[1].long_name = 'Wetstraat'
*/
function addresComponent(type, geocodeResponse, shortName) {
  for(var i=0; i < geocodeResponse.address_components.length; i++) {
    for (var j=0; j < geocodeResponse.address_components[i].types.length; j++) {
      if (geocodeResponse.address_components[i].types[j] == type) {
        if (shortName) {
          return geocodeResponse.address_components[i].short_name;
        }
        else {
          return geocodeResponse.address_components[i].long_name;
        }
      }
    }
  }
  return '';
}

使用它的方式;一个例子:

...
myGeocoder.geocode({'latLng': marker.getPosition()}, function(results, status) {
  if (status == google.maps.GeocoderStatus.OK && results[1]) {
    var country     = addresComponent('country', results[1], true);
    var postal_code = addresComponent('postal_code', results[1], true);
    ...
  }
});
...

我在这里使用它:saving marker data into db

答案 2 :(得分:0)

将json分配给结果变量,var results = {your json}。  然后试试这个:

for( var idx in results.results)
{
    var address = results.results[idx].address_components;
    for(var elmIdx in address)
    {
        if(address[elmIdx].types.indexOf("country") > -1 &&
           address[elmIdx].types.indexOf("political") > -1)
        {
           address[elmIdx].short_name //this is the country name
           address[elmIdx].long_name  //this is the country name

        }
    }
}