添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

使用Python将40万个经纬度转换为邮政编码

0 人关注

我有400,000个带有经度和纬度的案例。我想把这些转换为邮政编码。下面的代码可以工作...

import geopy
from geopy.geocoders import Nominatim
geolocator = geopy.Nominatim(user_agent='my-application')
def get_zipcode(df, geolocator, lat_field, lon_field):
    location = geolocator.reverse((df[lat_field], df[lon_field]))
    if 'address' in location.raw.keys():
      if 'postcode' in location.raw['address'].keys():
        return location.raw['address']['postcode']
    else:

但只是在小批量的时候,但需要一段时间,比如2000箱需要15分钟。

dfbatch1['pickup_zip'] = dfbatch1.apply(get_zipcode, axis=1, geolocator=geolocator, lat_field='pickup_latitude', lon_field='pickup_longitude')

What would be the best way to convert all of my latitudes & longitudes to zip codes?

5 个评论
我不知道在location.raw中可能有多少个键,但作为一个开始,我会摆脱测试键是否存在--只是假设它存在,并把它放在一个try except中。另外,你希望你的经度和纬度在哪里?也许你可以尝试设置 country_bias(不知道这样做是否会更快)?我想问题更多的是对包含数据的一些服务器的调用。
请尊重 Nominatim的使用政策 .它明确指出。"不能大量使用(绝对的每秒最多1个请求)",在不可接受的使用下,它包括系统查询。"这包括网格中的反向查询,搜索完整的邮编、城镇等列表,以及下载一个地区的所有POI。如果你需要完整的数据集,请从OSM星球或摘录中获取。" 。 我假设你是因为请求太多而被节流的。
你可以安装你自己的Nomatim实例--这可能会使事情更快。来源。 nominatim.org/release-docs/latest/admin/Installation
D.L
threading multiprocessing 来并行运行请求。但也请看@Thomas关于公平使用的评论!
我不确定你是否需要一个地理编码服务:如果你只是试图将纬度/伦度对转换为邮政编码,你可以使用免费的邮政编码数据集自己做这件事(如 this one )和 geopandas 的少量工作。
python
geocoding
latitude-longitude
geopy
zipcode
BDuff
BDuff
发布于 2022-02-28
1 个回答
larsks
larsks
发布于 2022-02-28
已采纳
0 人赞同

警告:这里不是地理信息系统专家!

看起来这很容易使用 geopandas 和一个邮政编码多边形的来源(当然,注意到邮政编码是 其实不是多边形 ):

例如,如果我有一个文件 (lat, lon) 中的 points.geojson 的点数据源,我可以做这样的事情。

import geopandas
points = geopandas.read_file('points.geojson')
zipcodes = geopandas.read_file("zip_poly.gdb")
zip_points = points.sjoin(zipcodes, how='left', )

替换代码4】的默认行为是执行一个intersects的查询,这就是我们想要的。

这给了我一个地理数据框架,将坐标(在.geometry属性中)映射到邮政编码(在.ZIP_CODE属性中)。我使用了this source为邮编数据。

例如,给定一个点。

>>> points.query('NAME == "Boston"').geometry
1436    POINT (-71.05671 42.35959)
Name: geometry, dtype: geometry

我现在知道了它的邮编。