Skip to content

Commit

Permalink
Merge pull request #275 from xiangmeng4geo/master
Browse files Browse the repository at this point in the history
add baidu reverse
  • Loading branch information
DenisCarriere committed Aug 19, 2017
2 parents 8948e06 + 6ebc988 commit b151960
Show file tree
Hide file tree
Showing 14 changed files with 472 additions and 3 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@ Providers
| [Bing][Bing] | World | API key | yes |
| [CanadaPost][CanadaPost] | Canada | API key | |
| [FreeGeoIP][FreeGeoIP] | World | | |
| [Gaode][Gaode] | China | API key | |
| [Geocoder.ca][Geocoder.ca] | CA & US | Rate Limit | |
| [GeocodeFarm][GeocodeFarm] | World | [Policy][GeocodeFarm-Policy] | |
| [GeoNames][GeoNames] | World | Username | yes |
Expand Down
1 change: 1 addition & 0 deletions docs/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ Detailed information about each individual provider that are within Geocoder.
providers/Bing.rst
providers/CanadaPost.rst
providers/FreeGeoIP.rst
providers/Gaode.rst
providers/GeocodeFarm.rst
providers/Geocoder-ca.rst
providers/Geonames.rst
Expand Down
14 changes: 14 additions & 0 deletions docs/providers/Baidu.rst
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,19 @@ Geocoding
>>> g.json
...
Reverse Geocoding
~~~~~~~~~~~~~~~~~

.. code-block:: python
>>> import geocoder
>>> latlng = [45.3, -105.1]
>>> g = geocoder.baidu(latlng, method='reverse', key='<API KEY>')
>>> g.json
...
Command Line Interface
----------------------

Expand All @@ -38,6 +51,7 @@ Parameters
- `method`: (default=geocode) Use the following:

- geocode
- reverse

References
----------
Expand Down
49 changes: 49 additions & 0 deletions docs/providers/Gaode.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
Gaode
=====

Gaode(AMap) Maps Geocoding API is a free open the API, the default quota
one 2000 times / day.

This API only support china.

Geocoding
~~~~~~~~~

.. code-block:: python
>>> import geocoder # pip install geocoder
>>> g = geocoder.gaode('方恒国际中心A座', key='<API KEY>')
>>> g.json
...
Command Line Interface
----------------------

.. code-block:: bash
$ geocode '方恒国际中心A座' --provider gaode
Environment Variables
---------------------

To make sure your API key is store safely on your computer, you can define that API key using your system's environment variables.

.. code-block:: bash
$ export GAODE_API_KEY=<Secret API Key>
Parameters
----------

- `location`: Your search location you want geocoded.
- `key`: Gaode API key.
- `method`: (default=geocode) Use the following:

- geocode
- reverse

References
----------

- `API Reference <http://lbs.amap.com/api/webservice/guide/api/georegeo>`_
- `Get Gaode key <http://lbs.amap.com/dev/>`_
2 changes: 1 addition & 1 deletion geocoder/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
# CORE
from geocoder.api import get, yahoo, bing, geonames, mapquest, google, mapbox # noqa
from geocoder.api import nokia, osm, tomtom, geolytica, arcgis, opencage # noqa
from geocoder.api import maxmind, ipinfo, freegeoip, ottawa, here, baidu, w3w # noqa
from geocoder.api import maxmind, ipinfo, freegeoip, ottawa, here, baidu, gaode, w3w # noqa
from geocoder.api import yandex, mapzen, komoot, tamu, geocodefarm, tgos, uscensus # noqa

# EXTRAS
Expand Down
22 changes: 21 additions & 1 deletion geocoder/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@

from __future__ import absolute_import

from geocoder.gaode import Gaode
from geocoder.gaode_reverse import GaodeReverse
from geocoder.osm import Osm
from geocoder.w3w import W3W
from geocoder.bing import BingQuery
Expand Down Expand Up @@ -33,6 +35,7 @@
from geocoder.canadapost import Canadapost
from geocoder.geocodefarm import GeocodeFarm
from geocoder.uscensus import USCensus
from geocoder.baidu_reverse import BaiduReverse
from geocoder.w3w_reverse import W3WReverse
from geocoder.osm_reverse import OsmReverse
from geocoder.here_reverse import HereReverse
Expand Down Expand Up @@ -66,7 +69,14 @@
'geocode': Here,
'reverse': HereReverse,
},
'baidu': {'geocode': Baidu},
'baidu': {
'geocode': Baidu,
'reverse': BaiduReverse
},
'gaode': {
'geocode': Gaode,
'reverse': GaodeReverse
},
'yahoo': {'geocode': Yahoo},
'tomtom': {'geocode': Tomtom},
'arcgis': {
Expand Down Expand Up @@ -249,6 +259,16 @@ def baidu(location, **kwargs):
return get(location, provider='baidu', **kwargs)


def gaode(location, **kwargs):
"""Gaode Provider
:param ``location``: Your search location you want geocoded.
:param ``key``: Gaode API key.
:param ``referer``: Gaode API referer website.
"""
return get(location, provider='gaode', **kwargs)


def komoot(location, **kwargs):
"""Ottawa Provider
Expand Down
6 changes: 5 additions & 1 deletion geocoder/baidu.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,13 @@ class Baidu(Base):
def __init__(self, location, **kwargs):
self.url = 'http://api.map.baidu.com/geocoder/v2/'
self.location = location
coordtype = 'wgs84ll'
if 'coordtype' in kwargs:
coordtype = kwargs['coordtype']
self.params = {
'address': location,
'output': 'json',
'ret_coordtype': coordtype,
'ak': self._get_api_key(baidu_key, **kwargs),
}
self.headers = {'Referer': kwargs.get('referer', 'http://developer.baidu.com')}
Expand All @@ -51,7 +55,7 @@ def quality(self):
return self.parse['result'].get('level')

@property
def accuracy(self):
def confidence(self):
return self.parse['result'].get('confidence')

if __name__ == '__main__':
Expand Down
84 changes: 84 additions & 0 deletions geocoder/baidu_reverse.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
#!/usr/bin/python
# coding: utf8

from __future__ import absolute_import

from geocoder.baidu import Baidu
from geocoder.keys import baidu_key
from geocoder.location import Location


class BaiduReverse(Baidu):
"""
Baidu Geocoding API
===================
Baidu Maps Geocoding API is a free open the API, the default quota
one million times / day.
Params
------
:param location: Your search location you want geocoded.
:param key: Baidu API key.
:param referer: Baidu API referer website.
References
----------
API Documentation: http://developer.baidu.com/map
Get Baidu Key: http://lbsyun.baidu.com/apiconsole/key
"""
provider = 'baidu'
method = 'reverse'

def __init__(self, location, **kwargs):
self.url = 'http://api.map.baidu.com/geocoder/v2/'
self.location = location
location = Location(location)
coordtype = 'wgs84ll'
if 'coordtype' in kwargs:
coordtype = kwargs['coordtype']
self.params = {
'location': str(location),
'ret_coordtype': coordtype,
'output': 'json',
'ak': self._get_api_key(baidu_key, **kwargs),
}
if ('lang_code' in kwargs):
self.params['accept-language'] = kwargs.get('lang_code')
self._initialize(**kwargs)

@property
def address(self):
return self.parse['result']['formatted_address']

@property
def country(self):
return self.parse['addressComponent']['country']

@property
def province(self):
return self.parse['addressComponent']['province']

@property
def state(self):
return self.parse['addressComponent']['province']

@property
def city(self):
return self.parse['addressComponent']['city']

@property
def district(self):
return self.parse['addressComponent']['district']

@property
def street(self):
return self.parse['addressComponent']['street']

@property
def housenumber(self):
return self.parse['addressComponent']['street_number']


if __name__ == '__main__':
g = BaiduReverse("39.983424,116.32298", key='35d0b72b3e950e5d0b74b037262f8b41')
g.debug()
117 changes: 117 additions & 0 deletions geocoder/gaode.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
#!/usr/bin/python
# coding: utf8

from __future__ import absolute_import

import requests

from geocoder.base import Base
from geocoder.keys import gaode_key


class Gaode(Base):
"""
Gaode AMap Geocoding API
===================
Gaode Maps Geocoding API is a free open the API, the default quota
2000 times / day.
Params
------
:param location: Your search location you want geocoded.
:param key: Gaode API key.
References
----------
API Documentation: http://lbs.amap.com/api/webservice/guide/api/georegeo
Get AMap Key: http://lbs.amap.com/dev/
"""
provider = 'gaode'
method = 'geocode'

def __init__(self, location, **kwargs):
self.url = 'http://restapi.amap.com/v3/geocode/geo'
self.location = location
self.params = {
'address': location,
'output': 'JSON',
'key': self._get_api_key(gaode_key, **kwargs),
}
self.headers = {'Referer': kwargs.get('referer', '')}
self._initialize(**kwargs)

def _initialize(self, **kwargs):
# Remove extra URL from kwargs
if 'url' in kwargs:
kwargs.pop('url')
self.json = {}
self.parse = self.tree()
self.content = None
self.encoding = kwargs.get('encoding', 'utf-8')
self.session = kwargs.get('session', requests.Session())
self._connect(url=self.url, **kwargs)
###
try:
for result in self.content['geocodes']: # Convert to iterator in each of the search tools
self._build_tree(result)
self._exceptions()
self._catch_errors()
self._json()
except:
self._build_tree(self.content)
self._exceptions()
self._catch_errors()
self._json()

@property
def lat(self):
return float(self.parse['location'].replace("'", '').split(',')[1])

@property
def lng(self):
return float(self.parse['location'].replace("'", '').split(',')[0])

@property
def quality(self):
return self.parse['level']

@property
def address(self):
return self.parse['formatted_address']

@property
def country(self):
return '中国'

@property
def province(self):
return self.parse['province']

@property
def state(self):
return self.parse['province']

@property
def city(self):
return self.parse['city']

@property
def district(self):
return self.parse['district']

@property
def street(self):
return self.parse['street']

@property
def adcode(self):
return self.parse['adcode']

@property
def housenumber(self):
return self.parse['number']


if __name__ == '__main__':
g = Gaode('纽约')
g.debug()

0 comments on commit b151960

Please sign in to comment.