【问题标题】:Reverse geocoding - getting postal code with geopy.Nominatim反向地理编码 - 使用 geopy.Nominatim 获取邮政编码
【发布时间】:2021-02-16 15:09:03
【问题描述】:

我已经尝试了几个小时,但我不知道我应该做什么。我有一个包含纬度和经度数据的数据框:

    year  month        lat        lon       SMI
0   2010      1  47.266481  10.149783  0.830187
1   2010      2  47.266481  10.149783  0.754513
2   2010      3  47.266481  10.149783  0.663457
3   2010      4  47.266481  10.149783  0.407255
4   2010      5  47.266481  10.149783  0.972982
5   2010      6  47.266481  10.149783  0.147511
6   2010      7  47.266481  10.149783  0.085912
7   2010      8  47.266481  10.149783  0.936917
8   2010      9  47.266481  10.149783  0.673884
9   2010     10  47.266481  10.149783  0.242676
10  2010     11  47.266481  10.149783  0.797547
11  2010     12  47.266481  10.149783  0.923627
12  2011      1  47.266481  10.149783  0.895137
13  2011      2  47.266481  10.149783  0.471502
14  2011      3  47.266481  10.149783  0.340169

每个月我有 23,199 个不同的地理点,我必须将它们与它们各自的邮政编码匹配(德国)。

基于这个讨论(https://gis.stackexchange.com/questions/352961/convert-lat-lon-to-zip-postal-code-using-python),我想出了以下代码:

import pandas as pd
import geopy

geopy.geocoders.options.default_user_agent = "myMAil"

def get_zipcode(subsmi, geolocator, lat_field, lon_field):
    location = geolocator.reverse((subsmi[lat_field], subsmi[lon_field]))
    return location.raw['address']['postcode']


geolocator = geopy.Nominatim()

zipcodes = subsmi.apply(get_zipcode, axis=1, geolocator=geolocator, lat_field='lat', lon_field='lon')

只要数据框保持在 10 行,代码就可以工作。只要我想将该代码应用于包含超过 10 行的数据帧,就会出现 KeyError: 'postcode'。 我知道 Nominatim 限制了可以反转的点数。有谁知道如何更改代码,以便最终扭转我的所有观点。

感谢您的帮助。

【问题讨论】:

    标签: python reverse-geocoding geopy postal-code nominatim


    【解决方案1】:

    如果限制是您认为的 Nominatim,并且选项可能会将您的数据分成 10 个块,并按 10 个 10 个检查它们,直到找到最接近的解决方案。

    我还发现有一个 rate_limiter 函数可以允许批量操作,这也可能是您的解决方案,我将链接文档。

    限速器链接:https://geopy.readthedocs.io/en/latest/index.html?highlight=rate%20limiter#module-geopy.extra.rate_limiter

    【讨论】:

    • 我尝试实现速率限制器,但我不断收到相同的错误,但我将尝试将数据分成块。谢谢。
    • 问题似乎出在某处的字典中,也许您也可以尝试处理该错误,看看它是否至少为您提供了大部分邮政编码,也许您的数据集上只是类型错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多