在實(shí)際的cache生成過(guò)程中遇到大地理范圍和多顯示比例的問(wèn)題時(shí),生成tile cache的耗時(shí)是個(gè)頭大的問(wèn)題,越低比例尺的繪制耗時(shí)將成幾何倍數(shù)上升,如果要繪制1:1000的全國(guó)圖的話,完成工作一臺(tái)主機(jī)可能需要幾個(gè)月的時(shí)間,tilecache默認(rèn)的請(qǐng)求tile規(guī)格是256×256,性能實(shí)在太低,所以提高每次向geoserver請(qǐng)求圖塊的規(guī)格來(lái)稍微提高速度,目前我采用2048×2048。
但openlayers里面256×256是最佳的cache規(guī)格,所以tilecache產(chǎn)生的tile必須進(jìn)行切割成256規(guī)格
1 # -*- coding:utf-8 -*-
2
3 #切割大地圖塊到小圖塊,重新索引圖塊文件目錄
4
5 #層名稱/縮放級(jí)別/000/000/列編號(hào)/000/000/行圖塊文件.png
6
7 import sys, traceback,threading,time,struct,os,os.path,shutil,distutils.dir_util,array,base64,zlib
8 import PIL,Image
9
10 g_layerName='east_china'
11
12 srcTiles={'path':'','size':(1024,1024)}
13 destTiles={'path':'','size':(256,256)}
14
15 #layerName - 處理的地圖層名,在tilecache.cfg中定義
16 #scale - 顯示級(jí)別
17 #tileDir - 圖塊存儲(chǔ)目錄
18 #destDir - 切割圖塊存儲(chǔ)目錄
19 #tilesizeFrom - 當(dāng)前圖塊規(guī)格
20 #tilesizeTo - 目標(biāo)圖塊規(guī)格
21 #注意: 維度從下至上遞增
22 #一個(gè)大網(wǎng)格塊列切割成多列,行且歌城多行
23 def splitTile(layerName,scale,tilesDir,destDir,tilesizeFrom=(1024,1024),tilesizeTo=(256,256)):
24 xcols = tilesizeFrom[0]/tilesizeTo[0]
25 xrows = tilesizeFrom[1]/tilesizeTo[1]
26
27 path2 = "%s/%s/%02d/000/000"%(destDir,layerName,scale)
28 if not os.path.exists(path2):
29 os.makedirs(path2)
30 path1 = "%s/%s/%02d/000/000"%(tilesDir,layerName,scale)
31 cols = map(int,os.listdir(path1))
32 for col in cols: #1列要切割成n列
33 path1 = "%s/%s/%02d/000/000/%02d/000/000"%(tilesDir,layerName,scale,col)
34 for x in range(xcols):
35 newcol = col*xcols + x
36 path2 = "%s/%s/%02d/000/000/%02d/000/000"%(destDir,layerName,scale,newcol) #大土快可以切割成多列
37 if not os.path.exists(path2):
38 os.makedirs(path2)
39 #print path1
40 files = os.listdir(path1) #list columns
41 for file in files:
42 name,ext = file.split('.')
43 path3 = "%s/%s/%02d/000/000/%02d/000/000/%s"%(tilesDir,layerName,scale,col,file) #
44 img = Image.open(path3)
45
46 rows = range(xrows)
47 rows.reverse()
48 for y in rows:
49 box = (x*tilesizeTo[0],y*tilesizeTo[1],(x+1)*tilesizeTo[0],(y+1)*tilesizeTo[1])
50 #print box
51 newimg = img.crop(box)
52 y = int(name)*xrows + xrows - y -1
53 print x,y
54 path2 = "%s/%s/%02d/000/000/%02d/000/000/%02d.png"%(destDir,layerName,scale,newcol,y) #注意產(chǎn)生的文件編號(hào)的數(shù)值寬度
55 newimg.save(path2)
56
57 def test(*a,**b):
58 print len(a),b
59 #test(1,2,3,k=100)
60
61 if __name__=='__main__':
62 splitTile('layer1',1,'E:/NewGis/trunk/python/tile1','E:/NewGis/trunk/python/tile2',(512,512),(32,32))