socketref,再见!高德

https://github.com/adoggie

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  246 Posts :: 4 Stories :: 312 Comments :: 0 Trackbacks

常用链接

留言簿(54)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

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









posted on 2011-07-11 22:34 放屁阿狗 阅读(1583) 评论(0)  编辑 收藏 引用 所属分类: MapGisWebGisWebServiceFlexswMap

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理