-
Notifications
You must be signed in to change notification settings - Fork 0
/
maprenderer.py
110 lines (101 loc) · 2.92 KB
/
maprenderer.py
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
#!usr/bin/python
import urllib
import math
#import antigravity
import sys
from PIL import Image
topleftx = 0
toplefty = 0
bottomrightx = 0
bottomrighty = 0
minwidth = 0
minheight = 0
zoom = 0
outfile = "karte"
def deg2num(lat_deg, lon_deg, zoom):
lat_rad = math.radians(lat_deg)
n = 2.0 ** zoom
xtile = int((lon_deg + 180.0) / 360.0 * n)
ytile = int((1.0 - math.log(math.tan(lat_rad) + (1 / math.cos(lat_rad))) / math.pi) / 2.0 * n)
return(xtile, ytile)
def parseargs():
state= ""
global topleftx
global toplefty
global bottomrightx
global bottomrighty
global minwidth
global minheight
global outfile
for arg in sys.argv:
print arg
if arg=="-min":
state = "MINSIZE0"
elif state=="MINSIZE0":
minwidth = int(arg)
state="MINSIZE1"
elif state=="MINSIZE1":
minheight= int(arg)
state=""
elif arg == "-rect":
state="RECT0"
elif arg == "-o":
state = "OUT"
elif state == "OUT":
outfile = arg
state = ""
elif state == "RECT0":
topleftx=float(arg)
state= "RECT1"
elif state == "RECT1":
toplefty=float(arg)
state = "RECT2"
elif state == "RECT2":
bottomrightx = float(arg)
state = "RECT3"
elif state == "RECT3":
bottomrighty = float(arg)
state = ""
def calczoom():
global zoom
global topleft
global bottomright
global width
global height
for zoom in range(18):
topleft = deg2num(topleftx, toplefty, zoom)
bottomright = deg2num(bottomrightx, bottomrighty, zoom)
width = abs(topleft[0]-bottomright[0])*256
height = abs(topleft[1]-bottomright[1])*256
if width>=minwidth and height>=minheight:
break
def pulltile(zoom, x, y):
global image
global xcount
global ycount
url = "http://tile.openstreetmap.org/"+repr(zoom)+"/"+repr(x)+"/"+repr(y)+".png"
#print "Pulling Tile "+ url
tile = Image.open(urllib.urlretrieve(url)[0])
#print "Putting it at "+repr(xcount*256)+ ", "+repr(ycount*256)
image.paste(tile,(xcount*256,ycount*256))
parseargs()
calczoom()
#print "Zoom: ",zoom
xcount = 0
ycount = 0
width = abs((bottomright[0]-topleft[0])*256)
height = abs((topleft[1]-bottomright[1])*256)
print "Resulting Map will be "+repr(width)+"x"+repr(height)+"px"
image = Image.new("RGB", (width,height), "white")
#print topleft[0], bottomright[0]
#print topleft[1],bottomright[1]
steps = (bottomright[0]-topleft[0])*(bottomright[1]-topleft[1])
ysteps = (bottomright[1]-topleft[1])
for x in range(topleft[0], bottomright[0]):
for y in range(topleft[1],bottomright[1]):
pulltile(zoom,x,y)
ycount+=1
print int((ysteps*xcount+ycount)/float(steps)*100),"% complete"
ycount = 0
xcount+=1
image.save(outfile+".png", "PNG")