学习过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端写个自动跑地图的程序,不能让机器闲着,没事的时候把全国地图的瓦片自动产生一下,免得在访问地图系统的时候再去产生瓦片!