Как получить названия городов в обратном геокодировании Google с помощью Python

avatar
Liu Yu
8 апреля 2018 в 02:27
762
1
0

У меня возникла серьезная проблема с обратным геокодированием Google. Я получил географическую информацию с помощью своего ключа API, но я не могу использовать один синтаксис для получения названий городов, поскольку названия городов находятся в другом положении. У меня есть список из почти 2000 координат в Японии. Пожалуйста помоги. Большое спасибо! Поясню подробно

Эти координаты (35.098129999999998, 135.71893) возвращают мне информацию ниже, чтобы захватить город, мне нужно разрезать [2]['short_name'], обратите внимание, что 'types' - это 'locality'.

[{'long_name': 'Unnamed Road', 'short_name': 'Unnamed Road', 'types':                   ['route']}, 
{'long_name': 'Kita-ku', 'short_name': 'Kita-ku', 'types': ['political', 'sublocality', 'sublocality_level_1']}, 
{'long_name': 'Kyōto-shi', 'short_name': 'Kyōto-shi', 'types': ['locality', 'political']}, 
{'long_name': 'Kyōto-fu', 'short_name': 'Kyōto-fu', 'types': ['administrative_area_level_1', 'political']}, 
{'long_name': 'Japan', 'short_name': 'JP', 'types': ['country', 'political']}]

Эти координаты (26.2110699999999999, 127.6876) возвращают мне приведенную ниже информацию, чтобы получить название города, которое мне нужно нарезать [4]['short_name'], обратите внимание, что 'types' также является 'locality'.

[{'long_name': '29', 'short_name': '29', 'types': ['premise']},     
{'long_name': '4', 'short_name': '4', 'types': ['political', 'sublocality', 'sublocality_level_4']}, 
{'long_name': '1 Chome', 'short_name': '1 Chome', 'types': ['political', 'sublocality', 'sublocality_level_3']}, 
{'long_name': 'Higawa', 'short_name': 'Higawa', 'types': ['political', 'sublocality', 'sublocality_level_2']}, 
{'long_name': 'Naha-shi', 'short_name': 'Naha-shi', 'types': ['locality', 'political']}, {'long_name': 'Okinawa-ken', 'short_name': 'Okinawa-ken', 'types': ['administrative_area_level_1', 'political']},  
{'long_name': 'Japan', 'short_name': 'JP', 'types': ['country', 'political']}, {'long_name': '900-0022', 'short_name': '900-0022', 'types': ['postal_code']}]

Эти координаты (35.670479999999998, 139.74091999999999) возвращают мне информацию ниже, чтобы получить название города, мне нужно нарезать [5]['short_name'], обратите внимание, что 'types' - это 'administrative_area_level_1'.

[{'long_name': 'M.Y赤坂', 'short_name': 'M.Y赤坂', 'types': ['premise']}, 
{'long_name': '11', 'short_name': '11', 'types': ['political', 'sublocality', 'sublocality_level_4']}, 
{'long_name': '2 Chome', 'short_name': '2 Chome', 'types': ['political', 'sublocality', 'sublocality_level_3']}, 
{'long_name': 'Akasaka', 'short_name': 'Akasaka', 'types': ['political', 'sublocality', 'sublocality_level_2']}, 
{'long_name': 'Minato-ku', 'short_name': 'Minato-ku', 'types': ['locality', 'political']}, 
{'long_name': 'Tōkyō-to', 'short_name': 'Tōkyō-to', 'types': ['administrative_area_level_1', 'political']}, 
{'long_name': 'Japan', 'short_name': 'JP', 'types': ['country', 'political']}, 
{'long_name': '107-0052', 'short_name': '107-0052', 'types': ['postal_code']}]

Названия городов находятся в разных позициях в формате JSON, и есть проблема с «типом». Как мне отличить «administrative_area_level_1» от «locality»? Можно ли придумать оператор if, чтобы выбрать именно то, что я хочу? ниже весь код

import googlemaps
import pandas as pd
import numpy as np

gmaps=googlemaps.Client(key='myapikey')
co=[(35.098129999999998, 135.71893),(26.211069999999999, 127.6876),(35.670479999999998, 139.74091999999999)]
for x, y in co:
   coor=(x,y)
   reverse_geocode_result = gmaps.reverse_geocode(coor)
   print (reverse_geocode_result[0]['address_components'])
Источник
Liu Yu
11 апреля 2018 в 04:16
0

Кто-нибудь, кто может мне помочь? Я отчаянно нуждаюсь в помощи. Большое спасибо!

Ответы (1)

avatar
Agung Sriwongo
15 мая 2018 в 05:13
0

Я думаю, вы можете получить названия городов, но для этого потребуется несколько шагов. Во-первых, просто возьмите и местность, и административный_уровень_области_1 для каждой координаты. Позже, после того, как вы получите их все, просто удалите элементы, которые не являются названием города.

import googlemaps
import pandas as pd
import numpy as np

gmaps=googlemaps.Client(key='my key')
co=[(35.098129999999998, 135.71893),(26.211069999999999, 127.6876),(35.670479999999998, 139.74091999999999)]
s = [] # Same as your code but I make an empty list
for x, y in co:
   coor = (x,y)
   reverse_geocode_result = gmaps.reverse_geocode(coor)
   s.append(reverse_geocode_result[0]['address_components'])

result = [] # result for each element contains both local and adm_lvl_1
for j in s:
    l=[]
    for i in j:
        if i['types'][0]=='administrative_area_level_1':
            l.append(i['long_name'])
        elif i['types'][0]=='locality':
            l.append(i['long_name'])
    result.append(l)

Здесь результат будет содержать список всех элементов как с населенным пунктом, так и с admin_area_level_1. Чтобы отличить город, вам нужно составить список всех городов Японии. Затем вы можете выполнить цикл для каждого элемента результата, чтобы получить только название города.

Liu Yu
16 мая 2018 в 05:52
0

Большое спасибо за ответ. Я слишком долго ждал возможного решения! Я прыгаю прямо, чтобы дать ему попробовать.