# -*- coding: utf-8 -*-
import re, sys, urllib, locale
reload(sys)
sys.setdefaultencoding('utf-8')
locale.setlocale(locale.LC_ALL, '')
system_language = locale.getlocale()[0].split("_")[1]
api_key = ""
def distance(a, b):
try:
data = {"q" : "from: %s to: %s" % (a, b), "output" : "json", "oe" : "utf8", "sensor" : "false", "key" : api_key, "hl" : system_language.lower(), "gl" : system_language.upper()}
data = urllib.urlencode(data)
req = "http://maps.google.com/maps/nav?" + data
info = urllib.urlopen(req).read().decode()
info = eval(info)
if not info["Status"]["code"] == 200:
return None
a = info["Placemark"][0]["address"]
b = info["Placemark"][1]["address"]
seconds = info["Directions"]["Duration"]["seconds"]
meters = info["Directions"]["Distance"]["meters"]
return {"a" : a, "b" : b, "time" : getInHMS(seconds), "meters" : meters}
except:
return None
def coordinates(address):
try:
data = {"q" : address, "output" : "json", "oe" : "utf8", "sensor" : "false", "key" : api_key}
data = urllib.urlencode(data)
req = "http://maps.google.com/maps/geo?" + data
info = urllib.urlopen(req).read().decode()
info = eval(info)
if not info["Status"]["code"] == 200:
return None
coordinates = info["Placemark"][0]["Point"]["coordinates"]
coordinates.pop(2)
return coordinates
except:
pass
def address(coordinates):
try:
if type(coordinates) != list or len(coordinates) != 2:
return None
xml = urllib.urlopen("http://maps.google.com/cbk?output=xml&ll=%s,%s" % (coordinates[1], coordinates[0])).read().decode()
if len(xml) < 60:
return None
xml = xml.encode("utf-8")
lat = re.findall('lat="(-?\d+\.\d+)"', xml)[0]
lng = re.findall('lng="(-?\d+\.\d+)"', xml)[0]
text = re.findall('<text>(.*?)</text>', xml)[0]
region = re.findall('<region>(.*?)</region>', xml)[0]
country = re.findall('<country>(.*?)</country>', xml)[0]
return {"latitude" : lat, "longitude" : lng, "text" : text, "region" : region, "country" : country}
except:
return None
def street_view(location, x=1, y=1):
try:
coords = coordinates(location)
xml = urllib.urlopen("http://maps.google.com/cbk?output=xml&ll=%s,%s" % (coords[1], coords[0])).read().decode()
xml = xml.encode("utf-8")
if len(xml) < 60:
return None
zoom = re.findall('num_zoom_levels="(\d+)"', xml)[0]
pano_ids = re.findall('pano_id="(.*?)"', xml)
urls = []
for panoid in pano_ids:
urls.append("http://cbk1.google.com/cbk?output=tile&zoom=%s&x=%s&y=%s&panoid=%s" % (zoom, x, y, panoid))
return urls
except:
return None
def route(a, b):
try:
data = {"q" : "from: %s to: %s" % (a, b), "output" : "json", "oe" : "utf8", "sensor" : "false", "key" : api_key, "hl" : system_language.lower(), "gl" : system_language.upper()}
data = urllib.urlencode(data)
req = "http://maps.google.com/maps/nav?" + data
info = urllib.urlopen(req).read().decode()
res = info.encode("utf-8")
if '"Status":{"code":602' in res:
return None
replace_chars = {'\\u003C' : '<', '\\u003E' : '>', '\\u0026' : '&'}
for key in replace_chars.keys():
res = res.replace(key, replace_chars[key])
res = res.replace('\\', '').replace('<wbr/>', '')
res = res.replace(' ', ' ')
res = re.sub('&#(\d+);', lambda x: chr(int(x.groups()[0])), res)
res = re.sub('<div class="google_note".*?</div>', '', res)
res = re.sub('<.*?>', '', res)
res = eval(res)
(total_meters, total_seconds, summary, steps) = (res['Directions']['Distance']['meters'], res['Directions']['Duration']['seconds'], res['Directions']['summaryHtml'], res['Directions']['Routes'][0]['Steps'])
nice_steps = []
counter = 1
for step in steps:
coords = tuple(map(lambda x: str(x)[:str(x).index('.')+5], step['Point']['coordinates'][:2]))
distance = str(step['Distance']['meters'])
nice_steps.append({'duration' : step['Duration']['seconds'], 'distance' : distance, 'description' : step['descriptionHtml'], 'coordinates' : coords, 'stepnum' : counter})
counter += 1
return {'meters' : total_meters, 'seconds' : total_seconds, 'summary' : summary, 'steps' : nice_steps}
except:
return None
def getInHMS(seconds):
hours = seconds / 3600
seconds -= 3600*hours
minutes = seconds / 60
seconds -= 60*minutes
if hours == 0:
return "%02d:%02d" % (minutes, seconds)
return "%02d:%02d:%02d" % (hours, minutes, seconds)