Reverse geocoding with Python Nominatim limitations & improvement geopy.geocoders

Question:

I need to fetch address for 10000 based on latitude & longitude & I used geopy.geocoders for that. However, the first limitation is that there’s a limitation in terms of the number of cordinates you can reverse geocode in day.

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)

& secondly this just prints the address without the coordinates when applied on a dataframe for multiple coordinates which makes it difficult to map to the original dataset. Also it doesn’t give the output in English I also tried the following :

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

But this obviously does not work because it expects the coordinates as a mandatory parameter.

What can be done.

Asked By: user6016731

||

Answers:

First, according to Nominatim usage policy the only limit is one request/second. I don’t see any daily limit beyond the 86400 requests per day (1second6060*24) derived from the one request limit
https://operations.osmfoundation.org/policies/nominatim/

The easiest way to guarantee you don’t make more than one request per second is

  time.sleep(1)

while iterating through the requests, before making a request.

Second, the location object keeps both coordinates and address as properties:

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

Third, with geopy you can declare the language. It’s false by default

reverse(query, exactly_one=True, timeout=DEFAULT_SENTINEL, language=False,  addressdetails=True)

Check geopy docs concerning Nominatim:
https://geopy.readthedocs.io/en/stable/#nominatim

Answered By: LuisTavares
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.