Я пытаюсь получить названия страны и города из значений Lat и Long с помощью JQ.

Вот полный пример JSON https://maps.googleapis.com/maps/ api / geocode / json? latlng = 55.397563,10.39870099999996 & sensor = false

Я вставил возвращенный JSON в jqplay,

Пытался выбрать названия страны и города, но самое близкое, что я нашел, это

.results[0].address_components[].short_name

Как я могу указать просто привести узлы, где "types" : [ "country", "political" ]?

Благодарность

1
noway 24 Ноя 2014 в 14:07

3 ответа

Лучший ответ

Мне непонятно, что именно вы ищете. Каждый результат имеет набор типов, каждый компонент адреса также имеет набор типов. Какой из них ты хотел? Мы можем написать фильтр, который будет соответствовать тому, что вы пытались сделать, но с учетом данных он будет для вас совершенно бесполезен. Единственный элемент, который содержит перечисленные вами типы, - это просто название страны.

В любом случае, если вы хотите получить объект результата с типами "country" и "political", используйте фильтр contains().

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

В противном случае вам нужно будет уточнить, что именно вы хотели от этого набора данных. Пример ожидаемого результата ...

2
Jeff Mercado 26 Ноя 2014 в 07:14
Слава богу, кто-то уже спросил и ответил на этот вопрос, иначе я бы отказался от организации своих фотографий с использованием данных exif GPS json и этих сложных правил.
 – 
Sridhar Sarnobat
19 Май 2021 в 08:03
Это все еще работает? Для меня это просто возвращает []
 – 
Alex van Es
22 Май 2021 в 06:09

Я написал для этого функцию.

/**
*   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);
    ...
  }
});
...

Я использовал его здесь: сохранение данных маркера в db

0
Community 23 Май 2017 в 14:50

Назначьте 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

        }
    }
}    
0
muhamad ridwan 24 Ноя 2014 в 16:49