aboutsummaryrefslogtreecommitdiff
path: root/googlemaps.py
blob: 52f9ac456f0c93b5bde0b55028dacdf65b92c77d (plain)
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)