反向地理编码 - 使用 geopy.Nominatim

问题描述

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

    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 限制了一个人可以逆转的分数。有没有人知道我如何更改代码,以便我最终可以扭转所有观点。

感谢您的帮助。

解决方法

如果限制是您认为的 Nominatim,则可以选择将您的数据分成 10 个块,然后 10 x 10 检查它们,直到找到最接近的解决方案。

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

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...