Геокодирование с использованием Geopy и Python

Я пытаюсь Геокодировать CSV-файл, содержащий имя местоположения и разобранный адрес, который включает в себя номер адреса, название улицы, город, почтовый индекс, страну. Я хочу использовать Геокоды GEOPY и ArcGIS через Geopy.Я хотел создать код, который проходит через мой csv 5000 + записей и дает мне широту и долготу в отдельных столбцах в моем CSV. Я хочу использовать сервис геокодирования ArcGIS через Geopy. Может ли кто-нибудь предоставить мне код для начала? Спасибо!

вот мой скрипт:

import csv
from geopy.geocoders import ArcGIS


geolocator = ArcGIS()     # here some parameters are needed

with open('C:/Users/v-albaut/Desktop/Test_Geo.csv', 'rb') as csvinput:
    with open('output.csv', 'w') as csvoutput:
        output_fieldnames = ['Name','Address', 'Latitude', 'Longitude']
        writer = csv.DictWriter(csvoutput, delimiter=',', fieldnames=output_fieldnames)
        reader = csv.DictReader(csvinput)

        for row in reader:
            # here you have to replace the dict item by your csv column names
            query = ','.join(str(x) for x in (row['Name'], row['Address']))
            Address, (latitude, longitude) = geolocator.geocode(query)

            # here is the writing section
            output_row = {}
            output_row['Name'] = Name
            output_row['Address'] = Address
            output_row['Latitude'] = Latitude
            output_row['Longitude'] =Longitude
            writer.writerow(output_row)

2 ответов


я использовал этот скрипт для пакетного геокодирования .csv. Он требует, чтобы один столбец содержал полный текстовый адрес, который вы хотите геокодировать, и чтобы один столбец назывался "UniqueID", который имеет уникальный идентификатор для каждого элемента в .csv. Он также распечатает список всех адресов, которые не удалось геокодировать. Он также быстро проверяет, может ли почтовый индекс быть неправильным/сбрасывая геокодирование:

def main(path, filename):
# path to where your .csv lives, and the name of the csv.
    import geopy
    from geopy.geocoders import ArcGIS
    import pandas as pd

    Target_Addresses = pd.read_csv(path+'\'+filename)
    Target_Addresses['Lat'] = np.nan
    Target_Addresses['Long'] = np.nan
    Indexed_Targets = Target_Addresses.set_index('UniqueID')

    geolocator = ArcGIS() #some parameters here
    Fails = []
    for index, row in Indexed_Targets.iterrows():
        Address = row['Address']
        Result = geolocator.geocode(Address)
        if Result == None:
            Result = geolocator.geocode(Address[:-7])
            if Result == None:
                Fails.append[Address]
            else:
                Indexed_Targets.set_value(index, 'Lat', Result.latitude)
                Indexed_Targets.set_value(index, 'Long', Result.longitude)
        else:
            Indexed_Targets.set_value(index, 'Lat', Result.latitude)
            Indexed_Targets.set_value(index, 'Long', Result.longitude)
    for address in Fails:
        print address
    Indexed_Targets.to_csv(filename[:-4]+"_RESULTS.csv")

if __name__ == '__main__':
    main(path, filename) # whatever these are for you...

это выведет новый csv с "_RESULTS" (например, ввод адреса.csv "выведет" addresses_RESULTS.csv) с двумя новыми столбцами для " Lat " и "Long".


это только начало, скажите мне, если это помогает. Он не пишет в csv, но я отредактирую свой ответ позже, если вам нужна эта часть также

import csv
from geopy.geocoders import ArcGIS

geolocator = ArcGIS() #here some parameters are needed

with open('C:/Users/v-albaut/Desktop/Test_Geo.csv', 'rb') as csvinput:
    with open('output.csv', 'w') as csvoutput:
       output_fieldnames = ['Name','Address', 'Latitude', 'Longitude']
       writer = csv.DictWriter(csvoutput, delimiter=',', fieldnames=output_fieldnames)
       reader = csv.DictReader(csvinput)
       for row in reader:
            #here you have to replace the dict item by your csv column names
            query = ','.join(str(x) for x in (row['Name'], row['Address']))

            try:
                address, (latitude, longitude) = geolocator.geocode(query)
            except:
                latitude = 'N/A'
                longitude = 'N/A'

            #here is the writing section
            output_row = {}
            output_row['Name'] = row['Name']
            output_row['Address'] = row['Address']
            output_row['Latitude'] = latitude
            output_row['Longitude'] = longitude
            writer.writerow(output_row)

doc: