Саморазвитие

Трансформация координат в GeoPy

Время прочтения: 2 мин.

Для того, чтобы перевести географические координаты в наименования адресов объектов недвижимости, в первую очередь необходимо, используя консоль (win+r Ø cmd), произвести установку библиотеки GeoPy при помощи команды:

pip install geopy

Далее импортируем необходимые библиотеки, их всего две:

from geopy.geocoders import Nominatim
import pandas as pd

Для перевода координат в адреса напишем функцию get_address_by_location:

def get_address_by_location(latlong, language='ru'):
    app = Nominatim(user_agent='tutorial')
    try:
        return app.reverse(latlong, language=language).raw
    except:
        return get_address_by_location(latlong)

Аргументом функции get_address_by_location является строка (тип данных «str»), состоящая из перечисленных через запятую координат широты и долготы.

На вход подаем данные в виде excel-таблицы:

ШиротаДолгота
48.3817750984508135.1204040451879
48.381412052738085135.0959719910949
60.9380593258531576.59672655946456
54.84675864339395446.58899756398235
58.30443254832946648.643817147897046
59.2172420925574139.90126708580591
48.19466349351636136.13723640773017

Указанные выше данные импортируем в DataFrame:

data = pd.read_excel('list.xlsx')

При помощи цикла и генератора списков каждая координата переводится в одну строку, которая в дальнейшем подается в качестве аргумента в ранее созданную функцию get_address_by_location. На выходе из функции получаем словарь Python c набором данных, из которых выбираем нужные и сохраняем в питоновский список «lst».

lst = []
for i in range(len(data)):
    latlong = (',').join(str(x) for x in list(data.iloc[i]))
    address = get_address_by_location(latlong)
    element = [data.iloc[i]['Широта'],
            data.iloc[i]['Долгота'],
            address['address']['state'],
            address['address']['city'] if 'city' in address['address'] \
            else (address['address']['village'] if 'village' in address['address']\
            else(address['address']['town'] if 'town' in address['address'] else '')),
            address['address']['road'] if 'road' in address['address'] else '',
            address['address']['house_number'] if 'h ouse_number' in address['address'] else '']
    lst.append(element)

Для сохранения полученных данных в excel-файл, предварительно переводим список lst в DataFrame:

df = pd.DataFrame(lst, columns=['Широта', 'Долгота', 'Регион', 'Город/ПГТ/Село', 'Улица', 'Номер дома'])

А после при помощи функции to_excel экспортируем DataFrame df в xlsx-файл:

df.to_excel(‘list_address.xlsx’,index=False)

На выходе получаем список координат и соответствующие им наименования адресов объектов недвижимости в табличной форме:

Советуем почитать