swMap的Tile缓冲实现

swMap的Tile缓冲实现
学习过MapGuid,MapServer,Qgis等多种开源地图处理服务软件,开发了遵循WMS标准的地图服务,包括wms接入,地图渲染服务。
近1年的时间跑的地图展示都是wms服务器实时请求TileServer进行绘制,Tileserver进程被部署在一台高端的服务器上,同时启动了8个服务进程,访问忙碌的时候机器有点吃不消,就看到cpu那根线飚的很高。
geoserver这个用java做的wms服务器,性能不敢恭维,玩geoserver的时候接触了tilecahce这个开源软件,目前跑啥版本就不清楚了,之前将其研究了个明白,知道自己需要的是什么,所以一切还是得自己写。
对我来讲tilecache不实用的原因有多个:
1.支持过多的cahce 存储方式,什么google的数据库,oracle的也有,虽然代码框架的好,但很多东西都不管用,所以代码维护不够灵活
2.tilecache通过apache提供web的wms服务,然后tilecahe里再请求后端的geoserver服务,产生的cache根据他定 义的一个网格依次按x,y,z的索引存储在文件系统里面,并将图形进行编码分类。这种实现并没有问题,但要知道这些cache出来的图像文件是那么的多且 都零碎,有些图片还够不上一个文件系统基本的一个存储页大小,所以会大量浪费空间;由于文件零碎且多,移动这些文件也是个相当大的问题,一次为了将这些 cahce tile文件从A机器拷贝到B机器尽然花费了1天的时间。

tilecache有这些不如我意的地方,所以之前自己也考虑再写一个tilecache的 backend,将渲染出来的东西直接存储进pgsql数据库,那以后只要导出数据库的tablespace就可以了,嗯!的确可行,也跑了一段时间
最后还是决定放弃tilecahce了,毕竟wms自己已经实现了,要再做个backend也是很简单,做完直接整合进wms服务器。
我考虑采用sqlite来存储这些瓦片图形,由于sqlite处理多线程时天性有点问题,多线程不能共享同一个连接(connection),所以实现的时候在每个线程创建了新的连接,开销是有一些的,那比之前实时请求TileServer要快的多了。
现在wms跑的很开心了,cpu也不忙了,就是累死了硬盘了
一台机器上渲染的地图瓦片数据单独存储在一个文件里面,要部署到另外一台机器也很方便了,只需要拷贝一下就可以了
接着看看将这个sqlite换成pgsql,看看性能哪个更强一点
python代码实现:
 1       def  getBitmapTile3(self,renderTile,mapid,res,xy,size):        
 2           if  not  self.enable:
 3               return  None     # 表示需要实时请求地图数据
 4          
 5          tile  =  None
 6          dbconn  =  sqlite3.connect(self.dbname)
 7           try :            
 8               # dbconn.text_factory = str
 9              cr  =  dbconn.cursor()
10              cr.execute( ' select image from tiles where res=? and x=? and y=? ' ,(res,xy[0],xy[ 1 ]))
11              r  =  cr.fetchone()
12               if  not  r:
13                  tile  =  renderTile(mapid,res,xy,size)
14                   if  tile  and  tile.pixmap:
15                      b  =  sqlite3.Binary(tile.pixmap)
16                       print  ' * ' * 20
17                      cr.execute(u ' insert into tiles (res,x,y,z,image) values(?,?,?,?,?) ' ,(res,xy[0],xy[ 1 ],0,b))                    
18               else :
19                  tile  =  r[0]
20                  self.cacheshooted += 1
21                   print  ' shooted  ' ,self.cacheshooted
22           except :            
23              traceback.print_exc()
24              tile  =  None
25          dbconn.commit()
26           return  tile
27 

记得空的时候在flex端写个自动跑地图的程序,不能让机器闲着,没事的时候把全国地图的瓦片自动产生一下,免得在访问地图系统的时候再去产生瓦片!









你可能感兴趣的:(swMap的Tile缓冲实现)