1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
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://khm%(num)d.google.com/kh?n=404&v=30&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.80"
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.81"
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.80"
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)
|