使用Python Nominatim进行反向地理编码的限制和改进geopy.geocoders

3

我需要根据纬度和经度获取10000个地址,我使用了geopy.geocoders进行操作。然而,第一个限制是在一天内反向地理编码的坐标数受到限制。

from geopy.geocoders import Nominatim
from geopy.extra.rate_limiter import RateLimiter
geolocator = Nominatim(user_agent="specify_your_app_name_here",timeout=None)

rectangles_df=df["LatLong"].head(2)

location=rectangles_df.apply(geolocator.reverse)

& 其次,当应用于包含多个坐标的数据框时,此方法仅打印地址而不包括坐标,这使得将其映射到原始数据集变得困难。此外,它不会以英语输出结果。我也尝试了以下方法:

test=rectangles_df.apply(geolocator.reverse(language='en'))

但是显然这样做行不通,因为它要求坐标作为必填参数。
有什么解决办法?
1个回答

4
首先,根据Nominatim使用政策,唯一的限制是每秒钟一个请求。我没有看到任何每日请求次数的限制,除了从一个请求限制得出的每天86400个请求(1秒6060*24)。 https://operations.osmfoundation.org/policies/nominatim/ 最简单的确保不超过每秒一个请求的方式是:
  time.sleep(1)

在发出请求之前,遍历请求时。

其次,location对象将坐标和地址都作为属性保存:

print(location.latitude, location.longitude, location.adress)

第三,使用geopy可以声明语言。默认情况下为false
reverse(query, exactly_one=True, timeout=DEFAULT_SENTINEL, language=False,  addressdetails=True)

请查看有关 Nominatim 的 geopy 文档: https://geopy.readthedocs.io/en/stable/#nominatim


@Luis_Tavares 有没有一种方法可以使用geopy内置的速率限制器来进行反向地理编码呢? - user4718221
也许可以尝试类似这样的代码 geocode = RateLimiter(geolocator.reverse, min_delay_seconds=1)。由于RateLimitergeolocator属性,因此它应该适用于geocodereverse - LuisTavares

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接