地理编码#

geopandas 通过以下方式支持地理编码(即将地名转换为地球上的位置 geopy ,一个可选的依赖项 geopandas 。以下示例显示如何获取纽约市的行政区位置,并将这些位置与包含在中的详细行政区边界文件一起绘制 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)
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
Input In [3], in <cell line: 1>()
----> 1 boro_locations = geopandas.tools.geocode(boros.BoroName)

File /usr/local/lib/python3.10/dist-packages/geopandas-0.10.2+79.g3abc6a7-py3.10.egg/geopandas/tools/geocoding.py:65, in geocode(strings, provider, **kwargs)
     63 if provider is None:
     64     provider = "photon"
---> 65 throttle_time = _get_throttle_time(provider)
     67 return _query(strings, True, provider, throttle_time, **kwargs)

File /usr/local/lib/python3.10/dist-packages/geopandas-0.10.2+79.g3abc6a7-py3.10.egg/geopandas/tools/geocoding.py:16, in _get_throttle_time(provider)
     11 def _get_throttle_time(provider):
     12     """
     13     Amount of time to wait between requests to a geocoding API, for providers
     14     that specify rate limits in their terms of service.
     15     """
---> 16     import geopy.geocoders
     18     # https://operations.osmfoundation.org/policies/nominatim/
     19     if provider == geopy.geocoders.Nominatim:

ModuleNotFoundError: No module named 'geopy'

In [4]: boro_locations
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Input In [4], in <cell line: 1>()
----> 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");
../../_images/boro_centers_over_bounds.png

默认情况下, geocode() 函数使用 Photon geocoding API 。但是,可以使用指定的 provider 关键字。

的参数 provider 可以是引用地理编码服务的字符串,例如 'google''bing''yahoo' ,以及 'openmapquest' ,或一个 Geocoder 从… geopy 。看见 geopy.geocoders.SERVICE_TO_GEOCODER 查看完整的名单。对于许多提供程序,诸如API密钥之类的参数需要作为 **kwargsgeocode() 打电话。

例如,要使用OpenStreetMap Nominatim地理编码器,您需要指定一个用户代理:

geopandas.tools.geocode(boros.BoroName, provider='nominatim', user_agent="my-application")

注意

请查阅所选提供商的服务条款。上面的示例使用 'photon' (默认),预计公平使用-广泛使用将受到限制。 (Photon's Terms of Use )。