﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-socketref,再见！高德-随笔分类-WebService</title><link>http://www.cppblog.com/socketref/category/12988.html</link><description>gis,mouse,luolasi</description><language>zh-cn</language><lastBuildDate>Thu, 02 Jul 2015 11:30:25 GMT</lastBuildDate><pubDate>Thu, 02 Jul 2015 11:30:25 GMT</pubDate><ttl>60</ttl><item><title>salesforce的oauth授权</title><link>http://www.cppblog.com/socketref/archive/2015/06/29/211090.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Mon, 29 Jun 2015 12:21:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2015/06/29/211090.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/211090.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2015/06/29/211090.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/211090.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/211090.html</trackback:ping><description><![CDATA[<br />访问sf，记录下一下代码<br /><br />（注册sf的app，登记 callback-url,执行sql查询）<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">#</span><span style="color: #008000; ">coding:utf-8</span><span style="color: #008000; "><br /></span><span style="color: #800080; ">__author__</span>&nbsp;=&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">scott</span><span style="color: #800000; ">'</span><br /><span style="color: #0000FF; ">import</span>&nbsp;imp<br />imp.load_source(<span style="color: #800000; ">'</span><span style="color: #800000; ">init</span><span style="color: #800000; ">'</span>,<span style="color: #800000; ">'</span><span style="color: #800000; ">../init_script.py</span><span style="color: #800000; ">'</span>)<br /><span style="color: #0000FF; ">import</span>&nbsp;urllib2,urllib,json,sys,os<br /><span style="color: #0000FF; ">import</span>&nbsp;traceback,threading,time,struct,os,os.path,shutil,distutils.dir_util,array,base64,zlib,struct,binascii<br /><span style="color: #0000FF; ">import</span>&nbsp;datetime<br /><span style="color: #0000FF; ">from</span>&nbsp;libs.python.lemon&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;webapi<span style="color: #008000; "><br /></span>callback&nbsp;=&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">http://localhost:8002/oauth</span><span style="color: #800000; ">'</span><br />client_id&nbsp;=&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">3MVG9ZL0ppGP5UrC_wQ8U02mOhowPKwjeaaLsWZ3BcYYVqiSsy1rL_D2h6qG.rGPnb_j6IcgLHPdhmvomzDFj</span><span style="color: #800000; ">'</span><br />client_secret&nbsp;=&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">9046731979xxxxxxx</span><span style="color: #800000; ">'</span><br /><br /><span style="color: #0000FF; ">def</span>&nbsp;accessToken(request,code,state):<br />&nbsp;&nbsp;&nbsp;&nbsp;url&nbsp;=&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">https://login.salesforce.com/services/oauth2/token</span><span style="color: #800000; ">'</span><br />&nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;=&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">grant_type</span><span style="color: #800000; ">'</span>:<span style="color: #800000; ">'</span><span style="color: #800000; ">authorization_code</span><span style="color: #800000; ">'</span>,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">code</span><span style="color: #800000; ">'</span>:code,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">client_id</span><span style="color: #800000; ">'</span>:client_id,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">client_secret</span><span style="color: #800000; ">'</span>:client_secret,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">redirect_uri</span><span style="color: #800000; ">'</span>:callback<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;<span style="color: #800000; ">''</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;urllib2.urlopen(url,urllib.urlencode(data)&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">except</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;traceback.print_exc()<br />&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;result.read()<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;json.loads(&nbsp;result&nbsp;)<br /><br /><span style="color: #0000FF; ">def</span>&nbsp;oauth(request):<br />&nbsp;&nbsp;&nbsp;&nbsp;cr&nbsp;=&nbsp;webapi.SuccCallReturn()<br />&nbsp;&nbsp;&nbsp;&nbsp;code&nbsp;=&nbsp;&nbsp;webapi.GET(request,<span style="color: #800000; ">'</span><span style="color: #800000; ">code</span><span style="color: #800000; ">'</span>,<span style="color: #800000; ">''</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;state&nbsp;=&nbsp;webapi.GET(request,<span style="color: #800000; ">'</span><span style="color: #800000; ">state</span><span style="color: #800000; ">'</span>,<span style="color: #800000; ">''</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;cr.result=[code,state]<br />&nbsp;&nbsp;&nbsp;&nbsp;token&nbsp;=&nbsp;accessToken(request,code,state)<br />&nbsp;&nbsp;&nbsp;&nbsp;cr.result.append(token)<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">print</span>&nbsp;token<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>:<span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sqlExecute(token[<span style="color: #800000; ">'</span><span style="color: #800000; ">access_token</span><span style="color: #800000; ">'</span>],token[<span style="color: #800000; ">'</span><span style="color: #800000; ">instance_url</span><span style="color: #800000; ">'</span>])<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">except</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;traceback.print_exc()<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;cr.httpResponse()<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;cookielib<br /><br /><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;-H&nbsp;"Authorization:&nbsp;OAuth&nbsp;token"&nbsp;-H&nbsp;"X-PrettyPrint:1"&nbsp;"</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">def</span>&nbsp;sqlExecute(token,url_host):<br />&nbsp;&nbsp;&nbsp;&nbsp;httpHandler&nbsp;=&nbsp;urllib2.HTTPHandler(debuglevel=1)<br />&nbsp;&nbsp;&nbsp;&nbsp;httpsHandler&nbsp;=&nbsp;urllib2.HTTPSHandler(debuglevel=1)<br />&nbsp;&nbsp;&nbsp;&nbsp;opener&nbsp;=&nbsp;urllib2.build_opener(httpHandler,&nbsp;httpsHandler)<br />&nbsp;&nbsp;&nbsp;&nbsp;urllib2.install_opener(opener)<br />&nbsp;&nbsp;&nbsp;&nbsp;sf_cmd_query=<span style="color: #800000; ">"</span><span style="color: #800000; ">%s/services/data/v20.0/query/?%s</span><span style="color: #800000; ">"</span>%(url_host,&nbsp;urllib.urlencode({<span style="color: #800000; ">'</span><span style="color: #800000; ">q</span><span style="color: #800000; ">'</span>:<span style="color: #800000; ">'</span><span style="color: #800000; ">select&nbsp;count()&nbsp;from&nbsp;account</span><span style="color: #800000; ">'</span>}))<br />&nbsp;&nbsp;&nbsp;&nbsp;headers&nbsp;=&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">Authorization</span><span style="color: #800000; ">'</span>:<span style="color: #800000; ">'</span><span style="color: #800000; ">OAuth&nbsp;%s</span><span style="color: #800000; ">'</span>%token,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">X-PrettyPrint</span><span style="color: #800000; ">'</span>:1<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;httpReq&nbsp;=&nbsp;urllib2.Request(&nbsp;sf_cmd_query,headers=headers&nbsp;)<span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;r&nbsp;=&nbsp;opener.open(httpReq).read()<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">print</span>&nbsp;r<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">pass</span><br /><br />url1&nbsp;=&nbsp;<span style="color: #800000; ">"""</span><span style="color: #800000; ">https://login.salesforce.com/services/oauth2/authorize?response_type=code&amp;client_id=%s&amp;redirect_uri=%s&amp;state=first</span><span style="color: #800000; ">"""</span>%(client_id,callback)<br /><br /><span style="color: #0000FF; ">def</span>&nbsp;launchBrowserForOAuth():<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;webbrowser<br />&nbsp;&nbsp;&nbsp;&nbsp;webbrowser.open(url1)<br /><br /><span style="color: #0000FF; ">if</span>&nbsp;<span style="color: #800080; ">__name__</span>&nbsp;==&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">__main__</span><span style="color: #800000; ">'</span>:<span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;launchBrowserForOAuth()</div><img src ="http://www.cppblog.com/socketref/aggbug/211090.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2015-06-29 20:21 <a href="http://www.cppblog.com/socketref/archive/2015/06/29/211090.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Rpc+Mq实现分布式系统</title><link>http://www.cppblog.com/socketref/archive/2012/11/22/195531.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Thu, 22 Nov 2012 02:50:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2012/11/22/195531.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/195531.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2012/11/22/195531.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/195531.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/195531.html</trackback:ping><description><![CDATA[聊聊草草<br />实现一套通信框架 <br />A - 移动终端； B - 接入服务器(网关) , C,D,E - 内部服务系统 ， M -内部服务系统的消息队列 <br />B 用于接入成千上万的A，B不具备业务能力，只有CDE才能与A进行业务交互，M充当消息管道。<br />一般的做法，各个系统模块指定标准协议，可以是xml或者二进制的，然后各开发各的，socket或者http等部件，开发语言也是cpp，python，java齐上阵。<br />这种开发模式过于繁琐，模块之间的耦合比较紧密，应该把应用和通信细节剥离出来。<br />我的做法是所有有系统对象之间的消息传递都是基于Rpc接口级的调用，更本不设计通信、协议编码，只要根据IDL就可以，A请求C的服务，那A只需要调用C的接口函数即可，底部的工作：<br />A到B的socket通信，B将A的消息转换到M，M再传输到C，这些工作都可以透过Rpc层完成透明，反过来C的调用请求也安原路返回到A。<br />C要发送消息到A，那调用A的接口，rpc层自动将请求转化未MQ协议，被路由到B，B找到A的链接，并将Mq消息转化未socket消息传递到A，A端接收消息转换成Rpc函数回调到A的应用代码。<br /><br />除了简单的调用、返回方式还有<br />单项调用请求、异步调用请求、消息广播请求<br /><br />B端可以通过外部配置使得A的请求路由到C，或者D，或者全部接收，取决与应用需求(应用还是集群)<br />MQ如果系统总线一般，将各个服务子系统链接成网络，是构成整个系统的基础。Rpc可以解脱程序员，让其将经历花在具体业务上，而且基本只要编写若干的服务接口函数即可。<br /><br />当然要实现以上功能特点，很多可用的框架，CORBA，DCOM，ICE等等，但这些过于庞大，对环境要求也有限制，如果要更高效、灵活的运用和包装需要大量修改其底层代码，与第三方的整合只能工作在他们的上层接口上，这个令人很沮丧，会导致产生更多的依赖和复杂的编程技巧。<br />这些全都丢弃，还是自己的rpc<img src ="http://www.cppblog.com/socketref/aggbug/195531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2012-11-22 10:50 <a href="http://www.cppblog.com/socketref/archive/2012/11/22/195531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python编写网络通信框架-基于线程的消息传送</title><link>http://www.cppblog.com/socketref/archive/2012/03/08/167450.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Thu, 08 Mar 2012 15:12:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2012/03/08/167450.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/167450.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2012/03/08/167450.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/167450.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/167450.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 耗时1天，根据公司应用需求，开发一种简易的基础的通信框架，简化系统其它模块在网络通信工作方面的复杂度简单测试network.py service 做服务器，network.py client做客户端，传送多个消息报文，且能响应sock连接和断开状态考虑到性能和实际项目对线程需求，故都采用单连接单线程模式，预留select多路复用接口，可见: service.selectIn()Code highl...&nbsp;&nbsp;<a href='http://www.cppblog.com/socketref/archive/2012/03/08/167450.html'>阅读全文</a><img src ="http://www.cppblog.com/socketref/aggbug/167450.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2012-03-08 23:12 <a href="http://www.cppblog.com/socketref/archive/2012/03/08/167450.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>swMap的Tile缓冲实现</title><link>http://www.cppblog.com/socketref/archive/2011/07/11/150711.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Mon, 11 Jul 2011 14:34:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2011/07/11/150711.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/150711.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2011/07/11/150711.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/150711.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/150711.html</trackback:ping><description><![CDATA[<div> 学习过MapGuid,MapServer,Qgis等多种开源地图处理服务软件，开发了遵循WMS标准的地图服务，包括wms接入，地图渲染服务。<br /> 近1年的时间跑的地图展示都是wms服务器实时请求TileServer进行绘制，Tileserver进程被部署在一台高端的服务器上，同时启动了8个服务进程，访问忙碌的时候机器有点吃不消，就看到cpu那根线飚的很高。<br /> geoserver这个用java做的wms服务器，性能不敢恭维，玩geoserver的时候接触了tilecahce这个开源软件，目前跑啥版本就不清楚了，之前将其研究了个明白，知道自己需要的是什么，所以一切还是得自己写。<br /> 对我来讲tilecache不实用的原因有多个: <br /> 1.支持过多的cahce 存储方式，什么google的数据库，oracle的也有，虽然代码框架的好，但很多东西都不管用，所以代码维护不够灵活<br /> 2.tilecache通过apache提供web的wms服务，然后tilecahe里再请求后端的geoserver服务，产生的cache根据他定 义的一个网格依次按x,y,z的索引存储在文件系统里面，并将图形进行编码分类。这种实现并没有问题，但要知道这些cache出来的图像文件是那么的多且 都零碎，有些图片还够不上一个文件系统基本的一个存储页大小，所以会大量浪费空间；由于文件零碎且多，移动这些文件也是个相当大的问题，一次为了将这些 cahce tile文件从A机器拷贝到B机器尽然花费了1天的时间。<br /> <br /> tilecache有这些不如我意的地方，所以之前自己也考虑再写一个tilecache的 backend，将渲染出来的东西直接存储进pgsql数据库，那以后只要导出数据库的tablespace就可以了，嗯！的确可行，也跑了一段时间<br /> 最后还是决定放弃tilecahce了，毕竟wms自己已经实现了，要再做个backend也是很简单，做完直接整合进wms服务器。<br /> 我考虑采用sqlite来存储这些瓦片图形，由于sqlite处理多线程时天性有点问题，多线程不能共享同一个连接(connection),所以实现的时候在每个线程创建了新的连接，开销是有一些的，那比之前实时请求TileServer要快的多了。<br /> 现在wms跑的很开心了，cpu也不忙了，就是累死了硬盘了<br /> 一台机器上渲染的地图瓦片数据单独存储在一个文件里面，要部署到另外一台机器也很方便了，只需要拷贝一下就可以了<br /> 接着看看将这个sqlite换成pgsql，看看性能哪个更强一点<br /> python代码实现: <br /> <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;getBitmapTile3(self,renderTile,mapid,res,xy,size):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span>&nbsp;<span style="color: #0000FF; ">not</span><span style="color: #000000; ">&nbsp;self.enable:<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;None&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">表示需要实时请求地图数据</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tile&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;None<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbconn&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;sqlite3.connect(self.dbname)<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">dbconn.text_factory&nbsp;=&nbsp;str</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;dbconn.cursor()<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cr.execute(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">select&nbsp;image&nbsp;from&nbsp;tiles&nbsp;where&nbsp;res=?&nbsp;and&nbsp;x=?&nbsp;and&nbsp;y=?</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,(res,xy[0],xy[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]))<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cr.fetchone()<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span>&nbsp;<span style="color: #0000FF; ">not</span><span style="color: #000000; ">&nbsp;r:<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tile&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;renderTile(mapid,res,xy,size)<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;tile&nbsp;</span><span style="color: #0000FF; ">and</span><span style="color: #000000; ">&nbsp;tile.pixmap:<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;sqlite3.Binary(tile.pixmap)<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">print</span>&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">*</span><span style="color: #800000; ">'</span><span style="color: #000000; ">*</span><span style="color: #000000; ">20</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cr.execute(u</span><span style="color: #800000; ">'</span><span style="color: #800000; ">insert&nbsp;into&nbsp;tiles&nbsp;(res,x,y,z,image)&nbsp;values(?,?,?,?,?)</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,(res,xy[0],xy[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">],0,b))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">:<br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tile&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;r[0]<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.cacheshooted</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">1</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">print</span>&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">shooted&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,self.cacheshooted<br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">except</span><span style="color: #000000; ">:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;traceback.print_exc()<br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tile&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;None<br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbconn.commit()<br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;tile<br /></span><span style="color: #008080; ">27</span>&nbsp;</div> <br /> 记得空的时候在flex端写个自动跑地图的程序，不能让机器闲着，没事的时候把全国地图的瓦片自动产生一下，免得在访问地图系统的时候再去产生瓦片！<br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> </div><img src ="http://www.cppblog.com/socketref/aggbug/150711.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2011-07-11 22:34 <a href="http://www.cppblog.com/socketref/archive/2011/07/11/150711.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对Apache Server Status的启用</title><link>http://www.cppblog.com/socketref/archive/2011/05/27/147404.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Fri, 27 May 2011 13:05:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2011/05/27/147404.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/147404.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2011/05/27/147404.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/147404.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/147404.html</trackback:ping><description><![CDATA[<div><p align="left"><strong><span style="font-family: 宋体;">对</span></strong><strong>Apache Server Status</strong><strong><span style="font-family: 宋体;">的启用</span></strong></p> <p align="left"><span style="font-family: 宋体;">对</span>Apache<span style="font-family: 宋体;">的状态管理的模块是</span>LoadModule status_module modules/mod_status.so<span style="font-family: 宋体;">，所以这个需要有，然后打开下面的配置</span></p> <p align="left">ExtendedStatus On</p> <p align="left"><span style="font-family: 宋体;">配置</span>Apache Server Status<span style="font-family: 宋体;">的权限</span></p> <p align="left">&lt;location /server-status&gt;</p> <p align="left"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetHandler server-status</span></p> <p align="left"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Order Deny,Allow</span></p> <p align="left"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Deny from all</span></p> <p align="left"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Allow from .foo.com</span></p> <p align="left">&lt;/location&gt;</p> <p align="left"><span style="font-family: 宋体;">打开查看的话就使用</span>http:// your.server.name/server-status<span style="font-family: 宋体;">来访问，注意</span>VH<span style="font-family: 宋体;">的</span>apache<span style="font-family: 宋体;">要设置在一个</span>VH<span style="font-family: 宋体;">中</span>,<span style="font-family: 宋体;">不然你分不清是那个地址来查看看这个信息</span>.<span style="font-family: 宋体;">但</span>ExtendedStatus<span style="font-family: 宋体;">不能放在</span>VH<span style="font-family: 宋体;">中</span>.</p> <p align="left">&nbsp;</p></div><img src ="http://www.cppblog.com/socketref/aggbug/147404.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2011-05-27 21:05 <a href="http://www.cppblog.com/socketref/archive/2011/05/27/147404.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache gzip 配置</title><link>http://www.cppblog.com/socketref/archive/2011/01/15/138583.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Sat, 15 Jan 2011 13:53:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2011/01/15/138583.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/138583.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2011/01/15/138583.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/138583.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/138583.html</trackback:ping><description><![CDATA[apache gzip 配置<br>2009-08-31 10:38:15<br>标签：apache 配置 gzip<br>版权声明：原创作品，谢绝转载！否则将追究法律责任。<br>1、conf/httpd.conf<br>1) 去掉#LoadModule headers_module modules/mod_headers.so前面的注释#，<br>2) 添加LoadModule deflate_module modules/mod_deflate.so，<br>3) 去掉#Include conf/extra/httpd-vhosts.conf前面的注释#。<br>&nbsp;<br>2、conf/extra/httpd-vhosts.conf<br>在VirtualHost中添加<br>&nbsp;&nbsp;&nbsp; &lt;Location "/"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetOutputFilter DEFLATE<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BrowserMatch ^Mozilla/4 gzip-only-text/html<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BrowserMatch ^Mozilla/4\.0[678] no-gzip<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BrowserMatch \bMSIE !no-gzip !gzip-only-text/html<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Header append Vary User-Agent env=!dont-vary<br>&nbsp;&nbsp;&nbsp; &lt;/Location&gt;<br>例如：<br>&lt;VirtualHost *:80&gt;<br>&nbsp;&nbsp;&nbsp; DocumentRoot "D:/Apache2.2/htdocs/wef"<br>&nbsp;&nbsp;&nbsp; &lt;Location "/"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetOutputFilter DEFLATE<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BrowserMatch ^Mozilla/4 gzip-only-text/html<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BrowserMatch ^Mozilla/4\.0[678] no-gzip<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BrowserMatch \bMSIE !no-gzip !gzip-only-text/html<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Header append Vary User-Agent env=!dont-vary<br>&nbsp;&nbsp;&nbsp; &lt;/Location&gt;<br>&lt;/VirtualHost&gt;<br>&nbsp;<br>&nbsp;<br>注：我使用的apache版本为2.2.13。<br><img src ="http://www.cppblog.com/socketref/aggbug/138583.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2011-01-15 21:53 <a href="http://www.cppblog.com/socketref/archive/2011/01/15/138583.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>swbox 地图渲染完成基本功能</title><link>http://www.cppblog.com/socketref/archive/2010/11/08/132907.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Sun, 07 Nov 2010 17:20:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2010/11/08/132907.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/132907.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2010/11/08/132907.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/132907.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/132907.html</trackback:ping><description><![CDATA[作为替代geoserver的方案，采用python+qt实现地图的加工处理，实时渲染和tilecache缓冲。<br>其中借鉴了geoserver的服务模式，ogc的SLD风格配置，tilecache开源代码的核心，现已用c++完成这些功能，<br>运行效率可谓比geoserver快了好几个数量级<br>未加入道路和多边形文本标注，正在调整标注算法和逻辑； *.xml控制地图，mapsld.xml定义层样式风格<br><br>程序演示：<a style="text-decoration: underline;" title="http://wallizard.vicp.net:9000/swBox_release_2010.11.08.rar" href="http://wallizard.vicp.net:9000/swBox_release_2010.11.08.rar">http://wallizard.vicp.net:9000/swBox_release_2010.11.08.rar</a><br><br><img style="width: 777px; height: 503px;" alt="" src="http://www.cppblog.com/images/cppblog_com/socketref/swbox.2010.11.8.png"><br><br> <img src ="http://www.cppblog.com/socketref/aggbug/132907.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2010-11-08 01:20 <a href="http://www.cppblog.com/socketref/archive/2010/11/08/132907.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>webgis - china 12级缩放 地图</title><link>http://www.cppblog.com/socketref/archive/2010/05/16/115517.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Sun, 16 May 2010 09:08:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2010/05/16/115517.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/115517.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2010/05/16/115517.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/115517.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/115517.html</trackback:ping><description><![CDATA[<a title="http://118.126.7.153/maps/test_map.html"  href="http://118.126.7.153/maps/test_map.html">http://118.126.7.153/maps/test_map.html</a><br>12级别采用tilecache产生图块到postgres存储,绘制过程花费了12天,真希望有海量空间和更多的机器供我使用阿<br><br><br> <img src ="http://www.cppblog.com/socketref/aggbug/115517.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2010-05-16 17:08 <a href="http://www.cppblog.com/socketref/archive/2010/05/16/115517.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>发布中国图到web的开发经历</title><link>http://www.cppblog.com/socketref/archive/2010/04/12/112299.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Mon, 12 Apr 2010 03:18:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2010/04/12/112299.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/112299.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2010/04/12/112299.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/112299.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/112299.html</trackback:ping><description><![CDATA[考虑将shp格式的地图数据发布到webgis上去的想法有一段时间了，正好有空闲时间便忙碌开来，没想到期间遇到了诸多的问题<br><br>1.开发工具: <br>Geoserver,Openlayer,Ext-js,Postgres/Postgis,Python2.6,PIL,TileCache<br>2.地图数据<br>我的地图数据是08年的全国地图，按每个省市分隔开来，每个省市又分了若干个图层文件，格式是mapinfo的Tab，容量10G<br>由于没有全国大比例图，在偶然的一个机会从网上下载到一份C/S的监控系统，没想到安装目录内就有一份全国图，就是比例不高。<br>3.处理过程<br>1.Tab转换成shp: Ogr工具可以完成这两种格式的转换，编写python脚本可以轻易处理完<br>&nbsp; 在转换数据之前需要提醒的是，发现在处理多边形图层时，这个多边形图层并不是简单的多边形，也就是那种mapinfo允许存在polygon和pline的图层，这将导致之后的导入空间数据库的失败，因为postgis要求每个图层数据类型必须是一致的，不能存在多种类型，所以编写mapbasic脚本，将这些pline对象从这多边形图层中剔去即可。<br>2.数据校验：　这个过程非常重要，任何提供的的矢量数据都有可能存在错误数据，所以第一步必须要修复这些可能存在的错误，工具就是ＡｒｃＧｉｓ,使用其工具对每个省市的每个图层文件进行修复。<br>3.导入空间数据库：　编写脚本，将ｓｈｐ数据转成ｓｑｌ文件，此时必须注意空间数据库的字符编码与ｓｑｌ数据字符编码要吻合或者能够自动转换。ｐｇ２ｓｑ由于转换成ｓｑｌ时，由于ｓｈｐ数据中某些图层表存储的字符编码不统一导致产生的非法的ｓｑｌ数据，所以必须对这些数据进行修正，并采用ｕｌｔｒａｅｄｉｔ将数据进行转码成数据的字符集类型，我使用的是utf-8.<br>4.数据分离： 由于提供的全国地理数据是没有根据应用来分层的，所有的道路都合在同一个叫road的图层内，然后通过属性来区分道路的级别，由于我们在控制显示道路时是需要分层分级别的，所以必须将这些数据要分离成不同的道路图层，道路共10级别（0-9），编写脚本将每个省市的道路切割成road_?10级道路层(select into即可搞定)。<br>同样，除了道路之外还有其他的比如河流，POI对象等都需要进行分割到不同图层以便更精确的现实控制。<br>5.配置Geoserver： 数据都有了，接下来就是配置绘制引擎了。Geoserver提供WFS,WMS服务，性能一般，由于是java开发的。不管3721，配置了最新的I5主机，将java虚拟机的内存设置的最大，将postgis的数据库内存也足够调大。手工添加了1，2个图层到geoserver，preview一下，ok！<br>接下来编写控制这些图层的SLD了，这些花了好些时间学习和开发（学习sld对我以前开发嵌入式地图引擎风格配置也是一种帮助，之后的嵌入式地图引擎也全部使用sld进行配置了！）<br>由于全国数据分31个省市，每个省市都配置了21个图层，所以要人工11加到geoserver还真是很大的问题，不过没关系，有python在手，然后对geoserver的配置文件研究了一把便写了脚本将几百个图层全加了进去，然后将这些图层按省市进行分组，再次Preview，ok！<br>6.Cache Tile生成: 使用过GeoWebCache，发现很多地方实在不好理解，幸好找到了TileCache，代码也容易修改，研读了TileCache代码之后修改了N处地方，把效率提高了10倍以上。现在的问题在于Tilecache实现了Disk Cache,Memory Cache,但就是没有DB cache，每个tile将创建一个文件，如果这些文件很小，有的甚至才几十字节也要浪费一个文件块空间，效率不高，如果采用db的话空间就能节省很多，等以后有了时间自己编写一个后端为postgres的Tile Cache吧。<br><br>Tile Cache生成有些问题要注意：<br>１.　空白ｔｉｌｅ：　由于我设置的绘制设置的BBox非常大，所以在绘制的时候有些空白区域也将提交给geoserver进行处理，这样浪费了处理时间，同时这些产生的小规格图块大大占据了磁盘空间，所以修改的代码将不存储这些空白tile，仅仅存储这些tile的文件名称，而不保存内容<br>２.　tilecache的Resolutions，ZoomLevels，BBox和Openlayers的属性必须一样，否则Opnelayers无法显示正确的tile<br>3. tile相交检测： 同样是空白区域的绘制，如果每次都提交给geoserver的话，geoserver将根据配置的layer去相交并绘制一次，这就完全没有必要的，我的解决方式就是提前将31个省市产生他们的MBR，然后再tile进行提交给geoserver之前，将请求的tile的bbox与这些省市的mbr进行相交测试，只有相交的图层才送入geoserver绘制<br>4. 大网格绘制： 每次以256&#215;256的规格给geoserver绘制全国图的话效率实在太低，之后修改成2048&#215;2048规格，整体的绘制效率上升了n倍，绘制完了之后采用split_tile.py将这些大块切割成256规格的小块，必须注意产生的序号<br><br>写得好累<br><br><br><br><img src ="http://www.cppblog.com/socketref/aggbug/112299.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2010-04-12 11:18 <a href="http://www.cppblog.com/socketref/archive/2010/04/12/112299.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python::SocketServer</title><link>http://www.cppblog.com/socketref/archive/2010/02/15/107912.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Mon, 15 Feb 2010 15:42:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2010/02/15/107912.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/107912.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2010/02/15/107912.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/107912.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/107912.html</trackback:ping><description><![CDATA[缘于要做个http代理服务器的需求，开始琢磨SocketServer类，看看其有多优秀<br><br>BaseServer: 定义基础服务器接口，这些功能接口提供给子类继承。同时提供服务处理的骨架<br>&nbsp;&nbsp; serve_forever()&nbsp; 循环调用 handle_request()<br>&nbsp;&nbsp; handle_request()&nbsp; 调用子类的get_request() ，在tcpServer时实则进行accept()应答; 验证处理 verify_request();&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最终处理请求 process_request()，<br>&nbsp;&nbsp; verify_request()&nbsp;&nbsp; 虚函数 <br>&nbsp;&nbsp; process_request()&nbsp; 虚函数，这个函数并没有直接在BaseServer的子类TcpServer中被重载，而是在TcpServer的派生类中通过另一个父类来实<br>现，比如 ThreadingTCPServer的基类ThreadingMixIn.process_request()实现了此功能函数<br>&nbsp;&nbsp; finish_request(request, client_address) 执行一次完整的socket数据读入处理，如果是ThreadMixInTcpServer产生的request，这个方法内必须实行循环读取socket数据,直到socket关闭。(此处 request 就是 socket对象)<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;finish_request(self,&nbsp;request,&nbsp;client_address):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">"""</span><span style="color: #800000;">Finish&nbsp;one&nbsp;request&nbsp;by&nbsp;instantiating&nbsp;RequestHandlerClass.</span><span style="color: #800000;">"""</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.RequestHandlerClass(request,&nbsp;client_address,&nbsp;self)</span></div>
&nbsp;&nbsp; 在finish_request里面便将读取socket数据的任务扔给了RequestHandler去处理了，代码可以跳过去看了<br>##---------------------------------------------<br><br>TcpServer:&nbsp; tcp服务器<br>&nbsp;&nbsp; __init__(self, server_address, RequestHandlerClass) 需要提供服务侦听地址和请求处理类对象<br>&nbsp;&nbsp; server_bind() 绑定服务器地址<br>&nbsp;&nbsp; server_activate() 激活服务器<br>&nbsp;&nbsp; server_close()&nbsp; 关闭服务器 <br>&nbsp;&nbsp; fileno()&nbsp; 返回服务器socket的句柄fd编号<br>&nbsp;&nbsp; get_request() 接收应答accept()<br>&nbsp;&nbsp; close_request(request) 关闭socket,request即为socket对象<br>&nbsp;<br>三种输出处理方式: 阻塞方式、线程处理(ThreadingMixIn)、进程处理(ForkingMixIn)<br><br>ThreadingMixIn: 线程模型<br>&nbsp;&nbsp; process_request( request, client_address) 为请求的链接创建新的线程,在创建线程时直接指定线程入口和参数:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;threading<br>t&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;threading.Thread(target&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;self.process_request_thread,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;args&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(request,&nbsp;client_address))<br></span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;self.daemon_threads:<br>&nbsp;&nbsp;t.setDaemon&nbsp;(</span><span style="color: #000000;">1</span><span style="color: #000000;">)</span></div>
&nbsp;&nbsp; process_request_thread() 线程处理socket入口，负责接收数据，代码实现有点绕，看看代码<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;process_request_thread(self,&nbsp;request,&nbsp;client_address):</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.finish_request(request,&nbsp;client_address)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.close_request(request)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">except</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.handle_error(request,&nbsp;client_address)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.close_request(request)</span></div>
&nbsp;&nbsp;&nbsp; ThreadingMixIn<span style="color: #000000;">其实就是线程代理</span>，还是调用finish_request()进入处理tcp数据的循环，处理完成便close_request()。但是finish_request和close_request并未在ThreadingMinxIn内定义，在哪里呢？ 通过研读ThreadingTcpServer,原来通过ThreadingTcpServer这个finish_request又跑回了BaseServer.finish_request()<br><br>ThreadingTCPServer(ThreadingMixIn, TCPServer) 装配成线程池处理的tcp服务器<br>&nbsp;&nbsp; <br><br>BaseRequestHandler:&nbsp; 请求处理基础对象，提供统一的行为接口实现处理socket数据。 BaseRequestHandler比较好玩，在构造函数内完成了所有的操作，见代码：
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">__init__</span><span style="color: #000000;">(self,&nbsp;request,&nbsp;client_address,&nbsp;server):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.request&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;request<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.client_address&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;client_address<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.server&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;server<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.setup()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.handle()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.finish()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">finally</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sys.exc_traceback&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;None&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;Help&nbsp;garbage&nbsp;collection</span></div>
&nbsp;&nbsp; setup()对应的子类会进行初始化处理<br>&nbsp;&nbsp; self.handle()&nbsp; 直接调用子类的处理函数，可以参考 BaseHTTPRequestHandler(SocketServer.StreamRequestHandler)::handle()<br><br><br>StreamRequestHandler(BaseRequestHandler) 流式socket处理类<br>&nbsp;&nbsp; setup() 设置好socket对象和读写文件句柄 rfile/wfile<br><br><br>HTTPServer(SocketServer.TCPServer) http服务器<br><br>BaseHTTPRequestHandler(SocketServer.StreamRequestHandler) 流式的请求处理类 <br>&nbsp;&nbsp; handle() 处理入口，在基类BaseRequestHandle()的构造函数中直接调用<br>&nbsp;&nbsp; handle_one_request() 如果不是处理一次则返回false。接收一次socket数据，解析parse_request(),调用对应的do_xxx事件<br><br>python 的daemon线程：<br><span id="ContentBody" style="padding: 10px; display: block;">如果一个进程的主线程运行完毕而子线程还在执行的话，那么进程就不会退出，直到所有子线程结束为止，如何让主线程结束的时候其他子线程也乖乖的跟老大撤退呢？那就要把那些不听话的人设置为听话的小弟，使用线程对象的<font color="#99cc00">setDaemon()</font>方法，参数为<font color="#99cc00">bool</font>型。<font color="#99cc00">True</font>的话就代表你要听话，我老大（主线程）扯呼，你也要跟着撤，不能拖后腿。如果是<font color="#99cc00">False</font>的话就不用那么听话了，老大允许你们将在外军命有所不受的。需要注意的是<font color="#99cc00">setDaemon()</font>方法必须在线程对象没有调用<font color="#99cc00">start()</font>方法之前调用，否则没效果。</span><br>&nbsp;&nbsp; <br><br>     <img src ="http://www.cppblog.com/socketref/aggbug/107912.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2010-02-15 23:42 <a href="http://www.cppblog.com/socketref/archive/2010/02/15/107912.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>