python - 如何在 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可接受的使用政策,内容如下:
- 没有大量使用(每秒绝对最多 1 个请求)。
- 提供一个有效的 HTTP Referer 或 User-Agent 来识别应用程序(HTTP 库设置的普通用户代理不会这样做)。
- 清楚地显示适合您的媒体的属性。
- 数据是根据 ODbL 许可提供的,该许可要求以相同的方式共享(尽管合理使用/公平交易可能涵盖少量提取)。
所以..应该有可能(?)
我尝试添加我的 API 密钥 ( geocoder.osm([lat,lon], method='reverse', key=API_KEY)
) 并time.sleep(1.1)
在每次调用之前添加一个以确保,但并没有真正帮助。
想法?
解决方案
Nominatim 使用政策明确规定:
- 没有大量使用(绝对最大每秒 1 个请求)。
- 提供一个有效的HTTP Referer或User-Agent来标识应用程序(由 http 库设置的普通用户代理不会这样做)。
- 清楚地显示适合您的媒体的属性。
- 数据是根据ODbL许可证提供的,该许可证要求以相同的方式共享(尽管合理使用/公平交易可能涵盖少量提取)。
看起来您没有将请求限制为每秒最多 1 个。此外,我不确定您是否传递了有效的 HTTP 引用者(又名用户代理)。
请注意,此使用策略仅适用于 OSM 的公共 Nominatim 实例。您始终可以安装自己的 Nominatim 服务或切换到替代/商业 Nominatim 实例。
推荐阅读
- c# - Unity中,Inspector中更改布尔值时如何触发Set方法?
- visual-studio-code - 为什么升级后VSCode远程资源管理器的目录是一个点?
- microsoft-dynamics - Dynamics 365 - 数据导入期间的重复检测不起作用
- python - python中哪种方式更好更快?
- amazon-route53 - 如何将 Netlify DNS 用于 AWS Route 53 管理的域?
- mysql - 如何使用 JPA 自定义单个查询更新选择表
- api - 在这种情况下考虑实时通知和数据的最佳 API?
- arrays - 获取:此表达式的目标类型必须是函数式接口
- python - VSCode 中的 Jupyter
- javascript - 如何在javascript中将base64 png字符串转换为base64 svg字符串?