Geocoding¶
geopandas
supports geocoding (i.e., converting place names to
location on Earth) through geopy, an optional dependency of geopandas
.
The following example shows how to get the
locations of boroughs in New York City, and plots those locations along
with the detailed borough boundary file included within geopandas
.
In [1]: boros = geopandas.read_file(geopandas.datasets.get_path("nybb"))
In [2]: boros.BoroName
Out[2]:
0 Staten Island
1 Queens
2 Brooklyn
3 Manhattan
4 Bronx
Name: BoroName, dtype: object
In [3]: boro_locations = geopandas.tools.geocode(boros.BoroName)
---------------------------------------------------------------------------
timeout Traceback (most recent call last)
~/checkouts/readthedocs.org/user_builds/geopandas/conda/v0.8.2/lib/python3.7/site-packages/geopy/geocoders/base.py in _call_geocoder(self, url, timeout, raw, requester, deserializer, **kwargs)
354 try:
--> 355 page = requester(req, timeout=timeout, **kwargs)
356 except Exception as error:
~/checkouts/readthedocs.org/user_builds/geopandas/conda/v0.8.2/lib/python3.7/urllib/request.py in open(self, fullurl, data, timeout)
524
--> 525 response = self._open(req, data)
526
~/checkouts/readthedocs.org/user_builds/geopandas/conda/v0.8.2/lib/python3.7/urllib/request.py in _open(self, req, data)
542 result = self._call_chain(self.handle_open, protocol, protocol +
--> 543 '_open', req)
544 if result:
~/checkouts/readthedocs.org/user_builds/geopandas/conda/v0.8.2/lib/python3.7/urllib/request.py in _call_chain(self, chain, kind, meth_name, *args)
502 func = getattr(handler, meth_name)
--> 503 result = func(*args)
504 if result is not None:
~/checkouts/readthedocs.org/user_builds/geopandas/conda/v0.8.2/lib/python3.7/urllib/request.py in https_open(self, req)
1392 return self.do_open(http.client.HTTPSConnection, req,
-> 1393 context=self._context, check_hostname=self._check_hostname)
1394
~/checkouts/readthedocs.org/user_builds/geopandas/conda/v0.8.2/lib/python3.7/urllib/request.py in do_open(self, http_class, req, **http_conn_args)
1352 raise URLError(err)
-> 1353 r = h.getresponse()
1354 except:
~/checkouts/readthedocs.org/user_builds/geopandas/conda/v0.8.2/lib/python3.7/http/client.py in getresponse(self)
1353 try:
-> 1354 response.begin()
1355 except ConnectionError:
~/checkouts/readthedocs.org/user_builds/geopandas/conda/v0.8.2/lib/python3.7/http/client.py in begin(self)
305 while True:
--> 306 version, status, reason = self._read_status()
307 if status != CONTINUE:
~/checkouts/readthedocs.org/user_builds/geopandas/conda/v0.8.2/lib/python3.7/http/client.py in _read_status(self)
266 def _read_status(self):
--> 267 line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
268 if len(line) > _MAXLINE:
~/checkouts/readthedocs.org/user_builds/geopandas/conda/v0.8.2/lib/python3.7/socket.py in readinto(self, b)
588 try:
--> 589 return self._sock.recv_into(b)
590 except timeout:
~/checkouts/readthedocs.org/user_builds/geopandas/conda/v0.8.2/lib/python3.7/ssl.py in recv_into(self, buffer, nbytes, flags)
1070 self.__class__)
-> 1071 return self.read(nbytes, buffer)
1072 else:
~/checkouts/readthedocs.org/user_builds/geopandas/conda/v0.8.2/lib/python3.7/ssl.py in read(self, len, buffer)
928 if buffer is not None:
--> 929 return self._sslobj.read(len, buffer)
930 else:
timeout: The read operation timed out
During handling of the above exception, another exception occurred:
GeocoderTimedOut Traceback (most recent call last)
<ipython-input-3-2354aa2d31fd> in <module>
----> 1 boro_locations = geopandas.tools.geocode(boros.BoroName)
~/checkouts/readthedocs.org/user_builds/geopandas/conda/v0.8.2/lib/python3.7/site-packages/geopandas/tools/geocoding.py in geocode(strings, provider, **kwargs)
71 throttle_time = _get_throttle_time(provider)
72
---> 73 return _query(strings, True, provider, throttle_time, **kwargs)
74
75
~/checkouts/readthedocs.org/user_builds/geopandas/conda/v0.8.2/lib/python3.7/site-packages/geopandas/tools/geocoding.py in _query(data, forward, provider, throttle_time, **kwargs)
146 try:
147 if forward:
--> 148 results[i] = coder.geocode(s)
149 else:
150 results[i] = coder.reverse((s.y, s.x), exactly_one=True)
~/checkouts/readthedocs.org/user_builds/geopandas/conda/v0.8.2/lib/python3.7/site-packages/geopy/geocoders/geocodefarm.py in geocode(self, query, exactly_one, timeout)
104 logger.debug("%s.geocode: %s", self.__class__.__name__, url)
105 return self._parse_json(
--> 106 self._call_geocoder(url, timeout=timeout), exactly_one
107 )
108
~/checkouts/readthedocs.org/user_builds/geopandas/conda/v0.8.2/lib/python3.7/site-packages/geopy/geocoders/base.py in _call_geocoder(self, url, timeout, raw, requester, deserializer, **kwargs)
380 raise GeocoderUnavailable('Service not available')
381 elif isinstance(error, SocketTimeout):
--> 382 raise GeocoderTimedOut('Service timed out')
383 elif isinstance(error, SSLError):
384 if "timed out" in message:
GeocoderTimedOut: Service timed out
In [4]: boro_locations
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-4-796f7e9a655e> in <module>
----> 1 boro_locations
NameError: name 'boro_locations' is not defined
In [5]: import matplotlib.pyplot as plt
In [6]: fig, ax = plt.subplots()
In [7]: boros.to_crs("EPSG:4326").plot(ax=ax, color="white", edgecolor="black");
In [8]: boro_locations.plot(ax=ax, color="red");
By default, the geocode
function uses the
GeoCode.Farm geocoding API with a rate limitation
applied. But a different geocoding service can be specified with the
provider
keyword.
The argument to provider
can either be a string referencing geocoding
services, such as 'google'
, 'bing'
, 'yahoo'
, and
'openmapquest'
, or an instance of a Geocoder
from geopy
. See
geopy.geocoders.SERVICE_TO_GEOCODER
for the full list.
For many providers, parameters such as API keys need to be passed as
**kwargs
in the geocode
call.
For example, to use the OpenStreetMap Nominatim geocoder, you need to specify a user agent:
geopandas.tools.geocode(boros.BoroName, provider='nominatim', user_agent="my-application")
Attention
Please consult the Terms of Service for the chosen provider. The example
above uses 'geocodefarm'
(the default), for which free users are
limited to 250 calls per day and 4 requests per second
(geocodefarm ToS).