【问题标题】:Get latitude & longitude from address geopandas从地址 geopandas 获取纬度和经度
【发布时间】:2017-10-19 02:35:26
【问题描述】:

我有一个大约 1 亿条日志的 csv。其中一列是地址,我正在尝试获取地址的纬度和经度。我想尝试解决方案中提到的类似方法,但给出的solutionarcGIS,这是一个商业工具。我确实尝试过google API,它只限制了 2000 个条目。

将地址的经纬度放入大型数据集中的下一个最佳替代方法是什么。

输入:Site 列是来自巴黎市的地址

start_time,stop_time,duration,input_octets,output_octets,os,browser,device,langue,site
2016-08-27T16:15:00+05:30,2016-08-27T16:28:00+05:30,721.0,69979.0,48638.0,iOS,CFNetwork,iOS-Device,zh_CN,NULL
2016-08-27T16:16:00+05:30,2016-08-27T16:30:00+05:30,835.0,2528858.0,247541.0,iOS,Mobile Safari UIWebView,iPhone,en_GB,Berges de Seine Rive Gauche - Gros Caillou
2016-08-27T16:16:00+05:30,2016-08-27T16:47:00+05:30,1805.0,133303549.0,4304680.0,Android,Android,Samsung GT-N7100,fr_FR,Centre d'Accueil Kellermann
2016-08-27T16:17:00+05:30,,2702.0,32499482.0,7396904.0,Other,Apache-HttpClient,Other,NULL,Bibliothèque Saint Fargeau
2016-08-27T16:17:00+05:30,2016-08-27T17:07:00+05:30,2966.0,39208187.0,1856761.0,iOS,Mobile Safari UIWebView,iPad,fr_FR,NULL
2016-08-27T16:18:00+05:30,,2400.0,1505716.0,342726.0,NULL,NULL,NULL,NULL,NULL
2016-08-27T16:18:00+05:30,,302.0,3424123.0,208827.0,Android,Chrome Mobile,Samsung SGH-I337M,fr_CA,Square Jean Xxiii
2016-08-27T16:19:00+05:30,,1500.0,35035181.0,1913667.0,iOS,Mobile Safari UIWebView,iPhone,fr_FR,Parc Monceau 1 (Entrée)
2016-08-27T16:19:00+05:30,,6301.0,9227174.0,5681273.0,Mac OS X,AppleMail,Other,fr_FR,Bibliothèque Parmentier

NULL 的地址可以忽略,也可以从输出中删除。

输出应该有以下列

start_time,stop_time,duration,input_octets,output_octets,os,browser,device,langue,site, latitude, longitude

感谢所有帮助,提前感谢您!

【问题讨论】:

  • 您需要提供minimal reproducible example
  • @InaS 我确实提到我使用 Google Api 并且有局限性,我发现的下一个最合适的解决方案是使用 arcgis 并且这是商业包。因此,我没有正确的方法来放置代码,如果我放置 Google API 代码,那么整个问题将朝着不同的方向发展。我已经在几天前的另一个问题中尝试过。
  • 澄清一下,您主要是在寻求一种方法来获取大型数据集的纬度/经度坐标,而不是如何使用 pandas/python 操作数据。对吗?
  • @pshep 我对操纵持开放态度,也接受了 lat lon
  • 我建议将 geopy 与 Open Street Map Nominatim 地理编码器一起使用:geopy.readthedocs.io/en/1.10.0/#geopy.geocoders.Nominatim

标签: python pandas latitude-longitude arcgis geopandas


【解决方案1】:
import csv
from geopy.geocoders import Nominatim

#if your sites are located in France only you can use the country_bias parameters to restrict search
geolocator = Nominatim(country_bias="France")

with open('c:/temp/input.csv', 'rb') as csvinput:
    with open('c:/temp/output.csv', 'wb') as csvoutput:
       output_fieldnames = ['Site', 'Address_found', 'Latitude', 'Longitude']
       writer = csv.DictWriter(csvoutput, delimiter=';', fieldnames=output_fieldnames)
       writer.writeheader()
       reader = csv.DictReader(csvinput)
       for row in reader:
            site = row['site']
            if site != "NULL":
                try:
                    location = geolocator.geocode(site)
                    address = location.address
                    latitude = location.latitude
                    longitude = location.longitude
                except:
                    address = 'Not found'
                    latitude = 'N/A'
                    longitude = 'N/A'
            else:
                address = 'N/A'
                latitude = 'N/A'
                longitude = 'N/A'

            #here is the writing section
            output_row = {}
            output_row['Site'] = row['site']
            output_row['Address_found'] = address.encode("utf-8")
            output_row['Latitude'] = latitude
            output_row['Longitude'] = longitude
            writer.writerow(output_row)

【讨论】:

  • 您可以从地理定位中获得不同的信息,例如建筑物的类型等...
  • 地理编码器可能会为您提供错误的位置,因为您输入的 csv 中的站点信息不准确。如果至少可以拥有城市,效果会更好
  • 位置来自巴黎市,分布在全市范围内,是的,这给出了一行没有纬度和经度的输出,:(
  • 这只是在第一行停止NULL,Not found,N/A,N/A
  • 好的,让我试试你的样品,我会回来的
猜你喜欢
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
  • 1970-01-01
相关资源
最近更新 更多