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()





Dík, celkom milé.
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.
Zaujimave.
Ale tie stringy modrofialovou farbou na sedom pozadi su naozaj necitatelne.
#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
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?
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)