首页 > 解决方案 > 如何在 OSM 上批量反向纬度/经度

问题描述

我有一个纬度/经度坐标列表,需要获取每个坐标的状态。这可以通过以下代码完成:

df = pd.read_csv('SOL_A.dsv', delimiter = '|', low_memory=False)
for index, row in df.iterrows(): 
    lat = row['LAT']
    lon = row['LONG']
    g = geocoder.osm([lat,lon], method='reverse')
    st = '_UN'
    if g.state != None:
        st = g.state
    geom_states.append(st)
df['STATE'] = geom_states

但是对于我的约 5k 记录,它最终会开始产生Status code 429 from https://nominatim.openstreetmap.org/search: ERROR - 429 Client Error: Too Many Requests for URL: tps://nominatim.openstreetmap.org/search?q=0.0%2C+0.0&format=jsonv2&addressdetails=1&limit=1预期效果。

我只需要处理一次,不介意是否需要一整天。我通读了 OSM可接受的使用政策,内容如下:

所以..应该有可能(?)

我尝试添加我的 API 密钥 ( geocoder.osm([lat,lon], method='reverse', key=API_KEY)) 并time.sleep(1.1)在每次调用之前添加一个以确保,但并没有真正帮助。

想法?

标签: pythonopenstreetmapreverse-lookup

解决方案


Nominatim 使用政策明确规定:

  • 没有大量使用(绝对最大每秒 1 个请求)。
  • 提供一个有效的HTTP RefererUser-Agent来标识应用程序(由 http 库设置的普通用户代理不会这样做)。
  • 清楚地显示适合您的媒体的属性。
  • 数据是根据ODbL许可证提供的,该许可证要求以相同的方式共享(尽管合理使用/公平交易可能涵盖少量提取)。

看起来您没有将请求限制为每秒最多 1 个。此外,我不确定您是否传递了有效的 HTTP 引用者(又名用户代理)。

请注意,此使用策略仅适用于 OSM 的公共 Nominatim 实例。您始终可以安装自己的 Nominatim 服务或切换到替代/商业 Nominatim 实例


推荐阅读