65 lines
1.6 KiB
Python
65 lines
1.6 KiB
Python
|
#!/usr/bin/python
|
||
|
#coding=utf8
|
||
|
|
||
|
import os
|
||
|
import sys
|
||
|
import math
|
||
|
import time
|
||
|
|
||
|
z = 10
|
||
|
|
||
|
def download(x,y,z):
|
||
|
import urllib
|
||
|
try:
|
||
|
webFile = urllib.urlopen("http://a.tile.openstreetmap.org/%d/%d/%d.png"%(z,x,y))
|
||
|
if not os.path.exists("%d"%z):
|
||
|
os.mkdir("%d"%z)
|
||
|
if not os.path.exists("%d/%d"%(z,x)):
|
||
|
os.mkdir("%d/%d"%(z,x))
|
||
|
localFile = open("%d/%d/%d.png"%(z,x,y), 'w')
|
||
|
localFile.write(webFile.read())
|
||
|
webFile.close()
|
||
|
localFile.close()
|
||
|
except Exception, e:
|
||
|
print e
|
||
|
|
||
|
def lon2km(lat):
|
||
|
return math.cos(lat*math.pi/180)*2*math.pi*6378.137/360
|
||
|
|
||
|
def getxy(lat,lon,z):
|
||
|
x = (lon+180)/360 * 2**z
|
||
|
y = (1-math.log(math.tan(lat*math.pi/180) + 1/math.cos(lat*math.pi/180))/math.pi)/2 * 2**z
|
||
|
return int(x),int(y)
|
||
|
|
||
|
lat = 49.009051
|
||
|
lon = 8.402481
|
||
|
|
||
|
r = 10
|
||
|
|
||
|
lat1 = lat-r/111.32
|
||
|
lon1 = lon-r/lon2km(49.009051)
|
||
|
lat2 = lat+r/111.32
|
||
|
lon2 = lon+r/lon2km(49.009051)
|
||
|
|
||
|
tiles = 0
|
||
|
#do not download zoom 18
|
||
|
for z in range(5,18):
|
||
|
x1,y1 = getxy(lat1, lon1, z)
|
||
|
x2,y2 = getxy(lat2, lon2, z)
|
||
|
tiles += (x2-x1)*(y1-y2)
|
||
|
|
||
|
print "do you really want to download %d tiles? [Y/n]"%tiles,
|
||
|
data = sys.stdin.read(1)
|
||
|
if data in ("y", "Y"):
|
||
|
i = 1;
|
||
|
for z in range(5,18):
|
||
|
x1,y1 = getxy(lat1, lon1, z)
|
||
|
x2,y2 = getxy(lat2, lon2, z)
|
||
|
for x in xrange(x1,x2+1):
|
||
|
for y in xrange(y2,y1+1):
|
||
|
if not os.path.exists("%d/%d/%d.png"%(z,x,y)):
|
||
|
download(x,y,z)
|
||
|
print "\r%i"%i,
|
||
|
sys.stdout.flush()
|
||
|
i+=1
|