2015-07-06 12 views
6

Sto provando a geocodificare un file CSV che contiene il nome della posizione e un indirizzo analizzato che include Numero indirizzo, Nome via, città, CAP, Paese. Voglio usare GEOPY e Geocods ArcGIS attraverso Geopy. Volevo creare un codice che scorre attraverso il mio csv di 5000+ voci e mi dà la latitudine e la longitudine in colonne separate nel mio CSV. Voglio usare il servizio ArcGIS Geocoding tramite Geopy. Qualcuno può fornirmi un codice per iniziare? Grazie!Geocoding con Geopy e Python

Ecco il mio script:

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) 

risposta

3

Sto usando questo script per fare un po 'di geocoding in batch da .csv. Richiede che una colonna contenga l'indirizzo di testo completo che desideri geocodificare e che una colonna sia intitolata "UniqueID", che ha un identificativo univoco per ciascun elemento in .csv. Stamperà anche un elenco di tutti gli indirizzi che non è riuscito a geocodificare. Si fa anche un rapido controllo per vedere se il codice zip potrebbe non essere corretto/gettando via il geocoding:

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

Questa volontà uscita un nuovo csv con "_RESULTS" (ad esempio, un ingresso di 'addresses.csv' sarà output 'addresses_RESULTS.csv') con due nuove colonne per 'Lat' e 'Long'.

+0

Ho provato a usare questo codice. è sufficiente stampare l'indirizzo (indirizzo) della prima riga e non viene creato alcun file "_RESULTS.csv". Si prega di aiutare grazie –

+0

@SourabhChoudhary puoi dare qualche informazione in più su come sono organizzati i tuoi indirizzi di input? E che tipo di errore sta producendo? – GabeFS

3

questo è solo un beggining, mi dica se questo aiuta. Non scrivere al csv, ma Io modificare la mia risposta in seguito se è necessario che una parte anche

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:

+0

Ciao se puoi fornire anche la parte di scrittura che sarà fantastica! – Gonzalo68

+0

Ho aggiunto la parte di scrittura, puoi testare per favore e dirmi se funziona. Nota che dovrai fornire i parametri giusti all'oggetto geocoder ArcGIS per farlo funzionare –

+0

Ricevo un errore chiave quando ho inserito il nome della colonna giusta sullo script. Cosa dovrei fare? – Gonzalo68

Problemi correlati