2015-07-06 52 views
6

Konumun adını içeren bir CSV dosyasını ve Adres numarasını, Sokak adını, şehri, posta kodunu, ülkeyi içeren bir ayrıştırma adresi Geocode'ı kullanmaya çalışıyorum. Geopy üzerinden GEOPY ve ArcGIS Geocode'larını kullanmak istiyorum. 5000+ girişimde csv'mden geçen bir kod oluşturmak istedim ve CSV'mdeki ayrı sütunlarda enlem ve boylamı bana verdim. Geopy ile ArcGIS Geocoding servisini kullanmak istiyorum. Başlamak için herkes bana bir kod sağlayabilir mi? Teşekkürler!Geopy ve Python kullanarak Geocoding

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) 

cevap

3

.csv'den bazı toplu iş kodlamaları yapmak için bu betiği kullanıyorum. Bir sütunun, coğrafi kodlamak istediğiniz tam metin adresini içermesi ve bir sütunun, .csv'deki her öğe için benzersiz bir tanıtıcıya sahip 'UniqueID' başlıklı olmasını gerektirir. Ayrıca, coğrafi kodlamada başarısız olduğu tüm adreslerin bir listesini de yazdıracaktır. Ayrıca posta kodu coğrafi kodlama dışına iten/yanlış olabilir olmadığını görmek için hızlı bir denetleme yapar: "_RESULTS" (ile

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

Bu irade çıkışı yeni bir csv örneğin 'addresses.csv' olacak bir giriş 'lat' ve 'Long' için iki yeni sütun içeren 'address_RESULTS.csv' çıkışı.

+0

Bu kodu kullanmaya çalıştım. sadece ilk satır adresini (adres) yazdırır ve "_RESULTS.csv" dosyası oluşturulmaz. Lütfen yardım için teşekkürler –

+0

@SourabhChoudhary, giriş adreslerinizin nasıl düzenlendiği hakkında biraz daha bilgi verebilir misiniz? Ve ne tür bir hata üretiyor? – GabeFS

3

bu Eğer yardımcı olur söyle, sadece bir uzaklaştırmak geçerli:

İşte benim senaryom. Bu csv yazmaz ama o kısmı gerekirse daha sonra cevabımı düzenlemek edeceğiz ayrıca

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

Merhaba, yazı parçasını da sağlayabilirseniz, bu harika olacak! – Gonzalo68

+0

Yazma bölümünü ekledim, lütfen test edip çalışıp çalışmadığını söyle. Çalıştırmak için ArcGIS geocoder nesnesine doğru parametreleri sağlamanız gerektiğini unutmayın. –

+0

Komutta doğru sütun adını yerleştirdiğimde bir anahtar hata alıyorum. Ne yapmalıyım? – Gonzalo68