• Stars
    star
    1,619
  • Rank 28,903 (Top 0.6 %)
  • Language
    Python
  • License
    MIT License
  • Created almost 11 years ago
  • Updated 7 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

🌏 Python Geocoder

Markdownify
Python Geocoder

Simple and consistent geocoding library written in Python.

RDT PyPi Snap Travis Codecov


Table of content

Overview

Many online providers such as Google & Bing have geocoding services, these providers do not include Python libraries and have different JSON responses between each other.

It can be very difficult sometimes to parse a particular geocoding provider since each one of them have their own JSON schema.

Here is a typical example of retrieving a Lat & Lng from Google using Python, things shouldn't be this hard.

>>> import requests
>>> url = 'https://maps.googleapis.com/maps/api/geocode/json'
>>> params = {'sensor': 'false', 'address': 'Mountain View, CA'}
>>> r = requests.get(url, params=params)
>>> results = r.json()['results']
>>> location = results[0]['geometry']['location']
>>> location['lat'], location['lng']
(37.3860517, -122.0838511)

Now lets use Geocoder to do the same task

>>> import geocoder
>>> g = geocoder.google('Mountain View, CA')
>>> g.latlng
(37.3860517, -122.0838511)

A glimpse at the API

Many properties are available once the geocoder object is created.

Forward

>>> import geocoder
>>> g = geocoder.google('Mountain View, CA')
>>> g.geojson
>>> g.json
>>> g.wkt
>>> g.osm

Multiple queries ('batch' geocoding)

>>> import geocoder
>>> g = geocoder.mapquest(['Mountain View, CA', 'Boulder, Co'], method='batch')
>>> for result in g:
...   print(result.address, result.latlng)
...
('Mountain View', [37.39008, -122.08139])
('Boulder', [40.015831, -105.27927])

Multiple results

>>> import geocoder
>>> g = geocoder.geonames('Mountain View, CA', maxRows=5)
>>> print(len(g))
5
>>> for result in g:
...   print(result.address, result.latlng)
...
Mountain View ['37.38605', '-122.08385']
Mountain View Elementary School ['34.0271', '-117.59116']
Best Western Plus Mountainview Inn and Suites ['51.79516', '-114.62793']
Best Western Mountainview Inn ['49.3338', '-123.1446']
Mountain View Post Office ['37.393', '-122.07774']

The providers currently supporting multiple results are listed in the table below.

Reverse

>>> g = geocoder.google([45.15, -75.14], method='reverse')
>>> g.city
>>> g.state
>>> g.state_long
>>> g.country
>>> g.country_long

House Addresses

>>> g = geocoder.google("453 Booth Street, Ottawa ON")
>>> g.housenumber
>>> g.postal
>>> g.street
>>> g.street_long

IP Addresses

>>> g = geocoder.ip('199.7.157.0')
>>> g = geocoder.ip('me')
>>> g.latlng
>>> g.city

Bounding Box

Accessing the JSON & GeoJSON attributes will be different

>>> g = geocoder.google("Ottawa")
>>> g.bbox
{"northeast": [45.53453, -75.2465979], "southwest": [44.962733, -76.3539158]}

>>> g.geojson['bbox']
[-76.3539158, 44.962733, -75.2465979, 45.53453]

>>> g.southwest
[44.962733, -76.3539158]

Command Line Interface

$ geocode "Ottawa, ON"  >> ottawa.geojson
$ geocode "Ottawa, ON" \
    --provide google \
    --out geojson \
    --method geocode

Providers

Provider Optimal Usage Policy Multiple results Reverse Proximity Batch
ArcGIS World yes yes
Baidu China API key yes
Bing World API key yes yes yes
CanadaPost Canada API key yes
FreeGeoIP This API endpoint is deprecated and will stop working on July 1st, 2018. World Rate Limit, Policy
Gaode China API key yes
Geocoder.ca (Geolytica) CA & US Rate Limit
GeocodeFarm World Policy yes yes
GeoNames World Username yes yes
GeoOttawa Ottawa yes
Gisgraphy World API key yes yes yes
Google World Rate Limit, Policy yes yes yes
HERE World API key yes yes
IPInfo World Rate Limit, Plans
Komoot (OSM powered) World yes yes
LocationIQ World API Key yes yes
Mapbox World API key yes yes yes
MapQuest World API key yes yes yes
Mapzen Shutdown API key yes yes
MaxMind World
OpenCage World API key yes yes
OpenStreetMap World Policy yes yes
Tamu US API key
TGOS Taiwan
TomTom World API key yes
USCensus US yes yes
What3Words World API key yes
Yahoo World
Yandex Russia yes yes

Installation

PyPi Install

To install Geocoder, simply:

$ pip install geocoder
...

GitHub Install

Installing the latest version from Github:

$ git clone https://github.com/DenisCarriere/geocoder
...
$ cd geocoder
$ python setup.py install
...

Snap Install

To install the stable geocoder snap in any of the supported Linux distros:

$ sudo snap install geocoder
...

If you want to help testing the latest changes from the master branch, you can install it from the edge channel:

$ sudo snap install geocoder --edge
...

The installed snap will be updated automatically every time a new version is pushed to the store.

Feedback

Please feel free to give any feedback on this module.

Speak up on Twitter @DenisCarriere and tell me how you use this Python Geocoder. New updates will be pushed to Twitter Hashtags #python.

Contribution

If you find any bugs or any enhancements to recommend please send some of your comments/suggestions to the Github Issues Page.

Some way to contribute, from the most generic to the most detailed:

Documenting

If you are not comfortable with development, you can still contribute with the documentation.

  • review the documentation of a specific provider. Most of the time they are lacking details...
  • review the parameters for a specific method, compared to what is supported by the provider
  • review documentation for command line

If you miss any feature, just create an issue accordingly. Be sure to describe your use case clearly, and to provide links to the correct sources.

Coding

  • add support for a new provider. Documentation TBD, starting point possible with wip_guide.
  • extend methods for an existing support, i.e support an additionnal API). Documentation TBD
  • extend support of an existing API, i.e, support more (json) fields from the response, or more parameters. Documentation TBD

ChangeLog

See CHANGELOG.md

More Repositories

1

mbtiles-server

Provides a compatible WMTS Tile Server from MBTiles.
JavaScript
94
star
2

gopro

πŸ“· GoPro Hero 4 - Python API
Python
86
star
3

geojson-rbush

GeoJSON implementation of RBush β€” a high-performance JavaScript R-tree-based 2D spatial index for points and rectangles
JavaScript
68
star
4

global-mercator

A set of tools geospatial tools to help with TMS, Google (XYZ) Tiles & Quadkeys.
JavaScript
60
star
5

postgis

πŸ“– PostGIS - Geo Cookbook
24
star
6

sqlite3-offline

Bundled SQLite3 library for offline environments
JavaScript
23
star
7

geocoder-geojson

Geocoding results in GeoJSON format
JavaScript
21
star
8

Leaflet.draw.locales

πŸ‡«πŸ‡· Localization for Leaflet.draw, changing between languages is now effortless.
TypeScript
19
star
9

mbtiles-offline

MBTiles binding for NodeJS 4+ using Callbacks and/or Promises.
JavaScript
17
star
10

ogc-parser

Parser to convert OGC WMTS/WMS XML schemas to human friendly JSON.
JavaScript
15
star
11

Geoserver-Docker

GeoServer Docker with GDAL (ECW & MrSID)
Python
13
star
12

mapillary

πŸ“Ή Mapillary - Python API
Python
11
star
13

turf-jsts

JSTS used in TurfJS (Refactored to ES6)
JavaScript
9
star
14

geonames

Geonames parser into OGR Shapefile
Python
8
star
15

slippy-grid

Generates an iterator of TMS tiles from BBox or GeoJSON
JavaScript
8
star
16

gpsimage

πŸ“· GPSImage - Retrieves GPS data from Geo-referenced Photos
Python
8
star
17

jsts-es6-example

JSTS ES6 Examples
JavaScript
7
star
18

wmts

WMTS scheme for Javascript applications
JavaScript
7
star
19

geojson-writer

Reads & writes GeoJSON files based on RFC 7946
TypeScript
6
star
20

mbtiles2gpkg

MBTiles to OGC GeoPackage
JavaScript
5
star
21

slippy-tile

Slippy Tile helps parse a Tile scheme URL from a given Tile [x, y, zoom].
TypeScript
5
star
22

turf-example-clusters-dbscan

Turf Example of Clusters DBSCAN
JavaScript
4
star
23

permits

🚧 Construction Permits - City of Ottawa
Python
4
star
24

tensorflow-hello-world

Tensorflow Hello World
Python
3
star
25

eventlogger

Cross-platform Event Logger for NodeJS written in pure ES5 Javascript.
JavaScript
3
star
26

deep-slice

Recursive Array.prototype.slice()
JavaScript
2
star
27

bbox-dateline

Modifies a BBox to fit within 180Β° longitude & 90Β° latitude.
JavaScript
1
star
28

boolean-shapely

Boolean Shapely - Used for TurfJS boolean testing
JavaScript
1
star
29

DenisCarriere

1
star
30

osm

OpenStreetMap
Python
1
star
31

next-auth

TypeScript
1
star
32

.bashrc

.bashrc config
Shell
1
star
33

map-providers

List of Map Tile Providers
JavaScript
1
star
34

Name-Generator

Creates a list of random names
Python
1
star
35

map-scale

Human readable Map Scale based on zoom level
JavaScript
1
star
36

crawlers

Python Applications
Python
1
star
37

machine-learning-building-or-road

Machine Learning - Building or Road?
JavaScript
1
star
38

enf

1
star