aboutsummaryrefslogtreecommitdiff
path: root/googlemaps.py
diff options
context:
space:
mode:
authorWolfgang Draxinger <Wolfgang.Draxinger@draxit.de>2008-06-24 10:25:26 +0200
committerWolfgang Draxinger <Wolfgang.Draxinger@draxit.de>2008-06-24 10:25:26 +0200
commit8949ba5d0ae6f1f1689f0bde7c8f366550a3284d (patch)
treed459e559b7ee8025d0acecf404defabc63ce602c /googlemaps.py
downloadgooglemaps2007_dl-8949ba5d0ae6f1f1689f0bde7c8f366550a3284d.tar.gz
googlemaps2007_dl-8949ba5d0ae6f1f1689f0bde7c8f366550a3284d.tar.bz2
Initial Commit
Diffstat (limited to 'googlemaps.py')
-rw-r--r--googlemaps.py124
1 files changed, 124 insertions, 0 deletions
diff --git a/googlemaps.py b/googlemaps.py
new file mode 100644
index 0000000..0998cfd
--- /dev/null
+++ b/googlemaps.py
@@ -0,0 +1,124 @@
+MIN_SATELLITE_ZOOM = -5
+MIN_MAP_ZOOM = 0
+MIN_OVERLAY_ZOOM = 0
+MIN_RELIEF_ZOOM = 2
+
+def fetch(url):
+ import os
+ img = os.popen('curl -s -f "%(url)s"' % vars(), 'r').read()
+ if len(img):
+ return img
+ return None
+
+def image_number_to_sel(x, y, zoom, sel_t = ['q','r','t','s']):
+ x = int(x)
+ y = int(y)
+ bits = range(17-zoom); bits.reverse()
+ sel = 't'
+ for bit in bits:
+ index = 0
+ if x & (1<<bit):
+ index |= 1
+ if y & (1<<bit):
+ index |= 2
+ sel += sel_t[index]
+ return sel
+
+def fetch_satellite_img(x, y, zoom):
+ if zoom < MIN_SATELLITE_ZOOM:
+ return None
+ x = int(x)
+ y = int(y)
+ num = (x+y)%4
+ sel = image_number_to_sel(x, y, zoom)
+ url = "http://kh%(num)d.google.com/kh?n=404&v&t=%(sel)s" % vars()
+ return fetch(url)
+
+def fetch_map_img(x, y, zoom):
+ if zoom < MIN_MAP_ZOOM:
+ return None
+ x = int(x)
+ y = int(y)
+ num = (x+y)%4
+ mapmode = "w2.75"
+ url = "http://mt%(num)d.google.com/mt?n=404&v=%(mapmode)s&zoom=%(zoom)d&x=%(x)d&y=%(y)d" % vars()
+ return fetch(url)
+
+def fetch_relief_img(x, y, zoom):
+ if zoom < MIN_RELIEF_ZOOM:
+ return None
+ x = int(x)
+ y = int(y)
+ num = (x+y)%4
+ mapmode = "w2p.71"
+ url = "http://mt%(num)d.google.com/mt?n=404&v=%(mapmode)s&zoom=%(zoom)d&x=%(x)d&y=%(y)d" % vars()
+ return fetch(url)
+
+def fetch_overlay_img(x, y, zoom):
+ if zoom < MIN_OVERLAY_ZOOM:
+ return None
+ x = int(x)
+ y = int(y)
+ num = (x+y)%4
+ mapmode = "w2t.75"
+ url = "http://mt%(num)d.google.com/mt?n&v=%(mapmode)s&zoom=%(zoom)d&x=%(x)d&y=%(y)d" % vars()
+ return fetch(url)
+
+def get_image_number(lon, lat, zoom):
+ import math
+ from math import pi
+
+ def deg2rad(a):
+ return a * pi/180.
+
+ def frac(x):
+ return x - math.floor(x)
+
+ def h(lat):
+ lat = deg2rad(lat)
+ # value determined by fitting original google maps
+ # output to mercator map formula
+ a = 0.0795775
+ # mercator projection formula
+ return a * math.log((1. + math.sin(lat)) / (1. - math.sin(lat)))
+
+ t = (2**(17-zoom))
+ off = (2**(16-zoom))
+
+ lat = h(-lat)
+ lon = (lon / 360.)
+
+ x = lon * t + off
+ y = lat * t + off
+
+ xx = int(x)
+ yy = int(y)
+
+ px = frac(x) * 256
+ py = frac(y) * 256
+
+ return (xx, yy, x, y, px, py)
+
+def get_satellite(lon, lat, zoom):
+ if zoom < MIN_SATELLITE_ZOOM:
+ return None
+ img_num = get_image_number(lon, lat, zoom)
+ return fetch_satellite_img(img_num[0], img_num[1], zoom)
+
+def get_map(lon, lat, zoom):
+ if zoom < MIN_MAP_ZOOM:
+ return None
+ img_num = get_image_number(lon, lat, zoom)
+ return fetch_map_img(img_num[0], img_num[1], zoom)
+
+def get_relief(lon, lat, zoom):
+ if zoom < MIN_RELIEF_ZOOM:
+ return None
+ img_num = get_image_number(lon, lat, zoom)
+ return fetch_relief_img(img_num[0], img_num[1], zoom)
+
+def get_overlay(lon, lat, zoom):
+ if zoom < MIN_OVERLAY_ZOOM:
+ return None
+ img_num = get_image_number(lon, lat, zoom)
+ return fetch_overlay_img(img_num[0], img_num[1], zoom)