Geoencoding usando Geopy y Python

Estoy intentando geocodificar un archivo CSV que contiene el nombre de la ubicación y una dirección analizada que incluye el número de dirección, nombre de la calle, ciudad, código postal, país. Quiero usar GEOPY y ArcGIS Geocodes a través de Geopy. Quería crear un código que pase por mi csv de más de 5000 entradas y me dé la latitud y la longitud en columnas separadas en mi CSV. Quiero usar el servicio de geoencoding de ArcGIS a través de Geopy. ¿Alguien me puede proporcionar un código para empezar? ¡Gracias!

Aquí está mi guión:

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) 

He estado usando esta secuencia de comandos para hacer un geoencoding por lotes de .csv. Requiere que una columna contenga la dirección de texto completa que desea geocodificar, y que una columna se titule ‘ID única’, que tiene un identificador único para cada elemento en el archivo .csv. También imprimirá una lista de las direcciones que no pudo geocodificar. También realiza una comprobación rápida para ver si el código postal puede ser incorrecto / descartar la geoencoding:

 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... 

Esto generará un nuevo csv con “_RESULTS” (por ejemplo, una entrada de ‘address.csv’ generará ‘Address_RESULTS.csv’) con dos nuevas columnas para ‘Lat’ y ‘Long’.

esto es solo un principio, dime si eso ayuda. No escribe en el csv, pero editaré mi respuesta más adelante si también necesita esa parte.

 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: