Получение долготы и широты более чем одного местоположения - PullRequest
0 голосов
/ 29 сентября 2019

Как узнать долготу и широту нескольких мест?Я пытаюсь получить координаты 15 районов Торонто.Я пробовал

address = ['Toronto Canada', 'East York', 'Davenport', 'Eglinton', 'Etobicoke', 'Toronto-Danforth']
geolocator = Nominatim(user_agent="foursquare_agent")
location = geolocator.geocode(address)
lat = location.latitude
lng = location.longitude
print(lat, lng)

Вышеприведенное возвращает: AttributeError: у объекта 'NoneType' нет атрибута 'latitude'

Ответы [ 2 ]

0 голосов
/ 29 сентября 2019

Вы получаете эту ошибку, потому что вы передали неправильный тип geolocator.geocode, который принимает запросы либо как dict (используется для структурированных запросов), либо как str, когда вы пытаетесь передать список Python.

См. Документ GeoPy: https://geopy.readthedocs.io/en/stable/#nominatim

Таким образом, простой, хотя и не обязательно эффективный способ получения необходимой информации - просто передать каждый район, закодированный в виде строки, вВаш экземпляр геолокации индивидуально.Должно работать что-то вроде следующего:

# your usual imports and data assigments

locations = [geolocator.geocode(borough) for borough in address]

from pprint import pprint
pprint(locations)
---
[Location(Toronto, Golden Horseshoe, Ontario, M6K 1X9, Canada, (43.653963, -79.387207, 0.0)),
 Location(East York, Toronto—Danforth, East York, Toronto, Golden Horseshoe, Ontario, M4J 2G9, Canada, (43.6913391, -79.3278212, 0.0)),
 Location(Davenport, Scott County, Iowa, USA, (41.5236436, -90.5776368, 0.0)),
 Location(Eglinton, County Londonderry, Northern Ireland, BT47 3GY, United Kingdom, (55.0266097, -7.176451, 0.0)),
 Location(Etobicoke, Toronto, Golden Horseshoe, Ontario, Canada, (43.67145915, -79.5524920661167, 0.0)),
 Location(Toronto—Danforth, Old Toronto, Toronto, Golden Horseshoe, Ontario, Canada, (43.6789439, -79.3448597, 0.0))]

И отсюда вы сможете получить широты, долготы и все, что вам нужно из этого списка Location объектов.

Также обратите внимание, что «Davenport» и «Eglinton» явно не были достаточно однозначными, поэтому вы можете указать «Davenport, Toronto» и т. Д.

Последнее примечание: метод geocode для Nominatim class имеет необязательный аргумент exactly_one (True по умолчанию), поэтому, возможно, существует какой-то способ для вас получить геокодированные местоположения всего вашего списка различных адресов с помощью одного вызова метода, но я не сделалдействительно посмотрите, как это сделать (если это вообще возможно), так как я никогда не использовал GeoPy, и я сам не знаком с предметом геокодирования.

Кстати, я тоже из Торонто, поэтомуЯ знаю все эти места, которые вы упомянули: D

0 голосов
/ 29 сентября 2019

Один запрос geocode() будет искать одно местоположение.Чтобы найти более одного местоположения, вам нужно запустить его в цикле.

city = 'Toronto, Canada'
boroughs  = ['East York', 'Davenport', 'Eglinton', 'Etobicoke', 'Toronto-Danforth']
for borough in boroughs:
    address = borough + ', ' + city
    location = geolocator.geocode(address)
    lat = location.latitude
    lng = location.longitude
    print(address, lat, lng)
...