diff options
author | Wolfgang Draxinger <Wolfgang.Draxinger@draxit.de> | 2008-06-24 10:25:26 +0200 |
---|---|---|
committer | Wolfgang Draxinger <Wolfgang.Draxinger@draxit.de> | 2008-06-24 10:25:26 +0200 |
commit | 8949ba5d0ae6f1f1689f0bde7c8f366550a3284d (patch) | |
tree | d459e559b7ee8025d0acecf404defabc63ce602c /googlemaps.py | |
download | googlemaps2007_dl-8949ba5d0ae6f1f1689f0bde7c8f366550a3284d.tar.gz googlemaps2007_dl-8949ba5d0ae6f1f1689f0bde7c8f366550a3284d.tar.bz2 |
Initial Commit
Diffstat (limited to 'googlemaps.py')
-rw-r--r-- | googlemaps.py | 124 |
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) |