Feed subscription » blog | » comments | » irc | » mobi | » twitter

Google Geocoding

Pri mojom poslednom projekte potrebujem získať geografickú pozíciu danej lokality, aby som mohol vykonať následne výpočty. K tomuto účelu som sa rozhodol využiť štedrej ponuky Googlu, ktorý umožňuje získať geografické údaje jednoduchým zavolaním danej linky.

K tomu slúži ich API, kde sú určené všetky potrebné údaje, vďaka ktorým získate geografickú pozíciu žiadanej lokality. Vytvoril som teda veľmi jednoduchú funkciu, ktorá tieto údaje získa vo formáte JSON, ktorý následne prevedie do kombinácie slovníkov (dictionaries) a zoznamov (lists). Z nich už potom nie je veľmi zložité získať potrebné dáta.

#!/usr/bin/python
# This Python file uses the following encoding: utf-8
#
# created by Rastislav Turek (turek@synopsi.com)
#
# accuracy constans from api
# http://www.google.com/apis/maps/documentation/reference.html#GGeoAddressAccuracy
#
# 0  Unknown location.
# 1  Country level accuracy.
# 2  Region (state, province, prefecture, etc.) level accuracy.
# 3  Sub-region (county, municipality, etc.) level accuracy.
# 4  Town (city, village) level accuracy.
# 5  Post code (zip code) level accuracy.
# 6  Street level accuracy.
# 7  Intersection level accuracy.
# 8  Address level accuracy.
# 9  Premise (building name, property name, shopping center, etc.) level accuracy.
 
__version__ = '0.1'
__author__ = "Rastislav Turek"
 
from random import choice
import simplejson
import urllib
import urllib2
from pprint import pprint
 
class GoogleGEOcodeError(Exception):
    """ Error handling for Google Maps Geocode Api """
 
def GetGoogleGeocode(adress, city, key, user_agents=None, sensor=False):
    query_args = { 'q':adress+","+city, 'sensor':sensor, 'key':key}
    encoded_args = urllib.urlencode(query_args)
    url = "http://maps.google.com/maps/geo?%s" % encoded_args
    if user_agents is None:
        user_agent = 'Python Google GEOcode (made by synopsi.com)'
        headers = {'User-Agent' : user_agent}
    else:
        headers = {'User-Agent' : choice(user_agents)}
 
    req = urllib2.Request(url, headers=headers)
    s = urllib2.urlopen(req).read()
    data = simplejson.loads(s, 'iso8859-2')
 
    return data

Ako môžete vidieť, skript je skutočne veľmi jednoduchý. Umožňuje zadať aj vlastného USER AGENTA, pre váš lepší pocit (aby tam nebola verzia pythonu, iný význam to nemá).

Čo so získanými dátami? Tie môžete celkom jednoducho vybrať, no nie je to ten najdokonalejší spôsob. Možno sa niekomu z vás bude chcieť napísať rozšírenie, ktoré dáta rozparsruje a ponúkne ako jednotliate. Pre moju potrebu som to nevyžadoval, ale niekomu by sa to mohlo hodiť. Ak teda chcete, môžete sa podeliť o svoj výtvor (prosím cez pastebin).

def main():
 
    user_agents = [
        'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11',
        'Opera/9.25 (Windows NT 5.1; U; en)',
        'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',
        'Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.5 (like Gecko) (Kubuntu)',
        'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12',
        'Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.2.9'
    ]
 
 
    key = "your key"
 
    adress = "rosemary rd 27"
    city = "boston"
    sensor = "false"
 
    data = GetGoogleGeocode(adress, city, key, user_gents=user_agents)
 
    status_code = data['Status']["code"]
    status_request = data['Status']["request"]
 
    if status_code == 602:
        raise GoogleGEOcodeError("Geocode for this location was not found")
 
    if status_code == 200:
 
        name = data['name']
        # Placemark
        id = data['Placemark'][0]["id"]
        # AddressDetails
        address = data['Placemark'][0]["address"]
        Accuracy = data['Placemark'][0]["AddressDetails"]["Accuracy"]
        # Country
        CountryNameCode = data['Placemark'][0]["AddressDetails"]["Country"]["CountryNameCode"]
        CountryName = data['Placemark'][0]["AddressDetails"]["Country"]["CountryName"]
        # AdministrativeArea
        AdministrativeAreaName = data['Placemark'][0]["AddressDetails"]["Country"]["AdministrativeArea"]["AdministrativeAreaName"]
        # Locality
        LocalityName = data['Placemark'][0]["AddressDetails"]["Country"]["AdministrativeArea"]["Locality"]["LocalityName"]
        try:
            #DependentLocality
            DependentLocalityName = data['Placemark'][0]["AddressDetails"]["Country"]["AdministrativeArea"]["Locality"]["DependentLocality"]["DependentLocalityName"]
            # Thoroughfare
            ThoroughfareName = data['Placemark'][0]["AddressDetails"]["Country"]["AdministrativeArea"]["Locality"]["DependentLocality"]["Thoroughfare"]["ThoroughfareName"]
        except KeyError:
            # Thoroughfare
            ThoroughfareName = data['Placemark'][0]["AddressDetails"]["Country"]["AdministrativeArea"]["Locality"]["Thoroughfare"]["ThoroughfareName"]
        # ExtendedData
        # LatLonBox
        north = data['Placemark'][0]["ExtendedData"]["LatLonBox"]["north"]
        south = data['Placemark'][0]["ExtendedData"]["LatLonBox"]["south"]
        east = data['Placemark'][0]["ExtendedData"]["LatLonBox"]["east"]
        west = data['Placemark'][0]["ExtendedData"]["LatLonBox"]["west"]
        # Point
        # coordinates
        latitude = data['Placemark'][0]["Point"]["coordinates"][0]
        longitude = data['Placemark'][0]["Point"]["coordinates"][1]
        distance = data['Placemark'][0]["Point"]["coordinates"][2]
 
if __name__ == '__main__':
    main()


Príbuzné články:
  • Google Language Detection
  • What exactly does Google know about you?
  • CrimeReports.com – zaujímavý Google Maps mashup
  • Google Earth dostupný už aj v prehliadači
  • Predaj drog zachytený na Google Maps Street View


  • 6 Responses to “Google Geocoding”


    1. 1 pierre^ Jan 12th, 2009 at 17:13

      Dík, celkom milé.

    2. 2 starenka Jan 13th, 2009 at 02:22

      A co ja se toho api nahledal! Musel jsem to tahat primo z html ( http://blog.starenka.net/python/2008-09-12-jak-ziskat-povicero-gps-souradnic-z-google-maps ). Diky.

    3. 3 Marki Jan 13th, 2009 at 10:37

      Zaujimave.
      Ale tie stringy modrofialovou farbou na sedom pozadi su naozaj necitatelne.

    4. 4 oooo Jan 13th, 2009 at 11:03

      #3 Marki: pravda pravduca. ono to funguje dobre vo firefoxe, ale inde moc nie. musim to nejak vyspekulovat
      doplnene:
      uz je to snad v poriadku, tato tema je trosku dost nechutne spravena a nieco v nej poriesit je porod

    5. 5 dd Mar 3rd, 2010 at 18:50

      Ako zaciatnocik v Pythone len cumim co vsetko sa da spravit..
      Islo by urobit aj nieco na tento styl, co by meralo vzdialenost 2 ulic v ramci 1 mesta?

    6. 6 oooo Mar 3rd, 2010 at 21:04

      vsetko ide. toto je len v podstate komunikacia v pythone nad api samotneho googlu. ak mu povies, ake dve ulice z jedneho mesta chces, tak on ti da ich suradnice a potom zistis ich vzdialenost (samozrejme vzdusnou ciarou)

    Zanechajte odkaz

    • na ďalšie komentáre odkazujte za použitia čísla komentáru v hranatej zátvorke, napríklad [3]
    • vaša IP adresa je logovaná a zneužívaná na výskumné účely
    • môžete mi tykať
    • komentáre sú moderované, kritiku prijímam, snažte sa prosím strániť invektív