﻿<?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,再见！高德-随笔分类-WebGis</title><link>http://www.cppblog.com/socketref/category/7484.html</link><description>gis,mouse,luolasi</description><language>zh-cn</language><lastBuildDate>Sat, 31 Aug 2013 08:52:44 GMT</lastBuildDate><pubDate>Sat, 31 Aug 2013 08:52:44 GMT</pubDate><ttl>60</ttl><item><title>移植地图绘制引擎从Qt切换到Cairo</title><link>http://www.cppblog.com/socketref/archive/2013/08/31/202891.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Sat, 31 Aug 2013 07:39:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2013/08/31/202891.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/202891.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2013/08/31/202891.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/202891.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/202891.html</trackback:ping><description><![CDATA[由于最近也是比较有时间，想着将Windows版本的地图绘制引擎移植到Linux。<br />地图Render部分采用的是Qt，所以过程非常顺利，用Eclipse+CDT重建工程，略微几个小改动便完成了移植。<br />但之后发现了Qt带来的问题了，地图绘制引擎支持并发处理多个绘制请求，不同的绘制请求将在不同的线程Thread中被执行，多线程的情况便出现了问题，提示QPixmap不能在非UI线程被构造，如果强行构造，便出现了内存数据访问违例的异常错误，进程直接coredump，这个问题困扰了一些时间；<br />之后改了改代码，将数据处理和绘制代码隔离开，线程thread中进行数据加载、分析、计算，绘制代码采用Qt的signal/slot机制完成，就是工作线程处理好数据之后通过emit signal将绘制请求发送给ui主线程的slot处理函数。这种实现方法的问题在于绘制工作都将被串行执行，性能下降。<br />几年前在移植libsvg到wince时采用过cairo( cairographices.org) ,有点使用经验，且cairo是gnome的标准图形库，性能应该不错，所以直接改为cairo。<br />cairomm是cairo的c++包装，编译还需sig++，cairo的api还是挺丰富的，字体，反走样，矩阵... 操作也是相当简单&nbsp;<br />很快移植完成，运行效果还是比较满意，现在正考虑地图引擎移植到ios设备，目前需要琢磨cairomm，sig++，pixmap之类的东西如何移植问题(或者直接采用ios的Fundation的绘图api)<br /><br /><img src ="http://www.cppblog.com/socketref/aggbug/202891.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2013-08-31 15:39 <a href="http://www.cppblog.com/socketref/archive/2013/08/31/202891.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实现gps坐标地址解析</title><link>http://www.cppblog.com/socketref/archive/2012/07/07/181998.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Fri, 06 Jul 2012 18:26:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2012/07/07/181998.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/181998.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2012/07/07/181998.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/181998.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/181998.html</trackback:ping><description><![CDATA[应用中会有输入gps坐标，计算返回所处地理位置文本描述<br />例如: (x,y) =&gt; 虹梅路2007号 宜山路200号 苏宁电器正南方向300米 <br /><br />当然数据必须要有，包括 poi和道路数据<br />为了实现快速检索，将feature数据进行分幅存储，把全国地图进行切割成固定网格大小，并将不同层feature存储这个网格内<br />切割存储feature到网格，实现的方法很多：<br />&nbsp;postgis ， oracle sde ，arcgis sde ， osge算法库，ogr....<br />我采用postgis将切割的feature放入数据表，建立好相关索引<br />输入gps坐标，先转换成地图坐标，然后检索出以地图坐标为中心的九宫格地理网格，然后在这些网格内计算不同的feature与当前gps坐标的位置描述 <br /><br />例如： 输入 121.20,31.20 <br />返回 ：<br /><div>上海旺而固实业有限公司&nbsp;&nbsp;&nbsp; 71.6009040754&nbsp;&nbsp;&nbsp; 165.190566006 degree正北方<br />上海起帆电缆有限公司&nbsp;&nbsp;&nbsp; 77.4887765243&nbsp;&nbsp;&nbsp; 168.290539492 degree正北方<br />塔星集团新塔星石材&nbsp;&nbsp;&nbsp; 78.9584224298&nbsp;&nbsp;&nbsp; 161.627196901 degree正北方<br />上海大宝化工制品有限公司&nbsp;&nbsp;&nbsp; 87.7190868822&nbsp;&nbsp;&nbsp; 151.671844699 degree东北方</div>第二个参数是距离(米) ,第三个为两点之间的夹角，最后一个表示方位 <br /><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"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;&nbsp;1</span>&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">计算点a,b,c的夹角</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;&nbsp;2</span>&nbsp;<span style="color: #008000; "></span><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;abc_angle(a,b,c):<br /></span><span style="color: #008080; ">&nbsp;&nbsp;3</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;ba</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Vector2.from_points(b,a)<br /></span><span style="color: #008080; ">&nbsp;&nbsp;4</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;bc&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Vector2.from_points(b,c)<br /></span><span style="color: #008080; ">&nbsp;&nbsp;5</span>&nbsp;<span style="color: #000000; ">&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;&nbsp;6</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;dot&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(ba[0]</span><span style="color: #000000; ">*</span><span style="color: #000000; ">bc[0]</span><span style="color: #000000; ">+</span><span style="color: #000000; ">ba[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]</span><span style="color: #000000; ">*</span><span style="color: #000000; ">bc[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;)<br /></span><span style="color: #008080; ">&nbsp;&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;&nbsp;dot</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;(ba.get_magnitude()</span><span style="color: #000000; ">*</span><span style="color: #000000; ">bc.get_magnitude()&nbsp;)<br /></span><span style="color: #008080; ">&nbsp;&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;angle&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;&nbsp;(math.acos(x)&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;math.pi)&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">180</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;angle<br /></span><span style="color: #008080; ">&nbsp;10</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;11</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">#</span><span style="color: #008000; ">print&nbsp;abc_angle(b,a,c)</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;12</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;13</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;14</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;whereis(p1,p2):<br /></span><span style="color: #008080; ">&nbsp;15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; ">'''</span><span style="color: #800000; "><br /></span><span style="color: #008080; ">&nbsp;16</span>&nbsp;<span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;判别p2所处p1的方向位置<br /></span><span style="color: #008080; ">&nbsp;17</span>&nbsp;<span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; ">'''</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;txt</span><span style="color: #000000; ">=</span><span style="color: #800000; ">''</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;a,b,c&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(p1[0],0),p1,p2<br /></span><span style="color: #008080; ">&nbsp;20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;&nbsp;abc_angle(a,b,c)<br /></span><span style="color: #008080; ">&nbsp;21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;a&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">20</span><span style="color: #000000; ">:<br /></span><span style="color: #008080; ">&nbsp;22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txt</span><span style="color: #000000; ">=</span><span style="color: #000000; ">u</span><span style="color: #800000; ">'</span><span style="color: #800000; ">正南方</span><span style="color: #800000; ">'</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">elif</span><span style="color: #000000; ">&nbsp;a</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">160</span><span style="color: #000000; ">:<br /></span><span style="color: #008080; ">&nbsp;24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txt&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;u</span><span style="color: #800000; ">'</span><span style="color: #800000; ">正北方</span><span style="color: #800000; ">'</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">elif</span><span style="color: #000000; ">&nbsp;a</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">20</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">and</span><span style="color: #000000; ">&nbsp;a</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">70</span><span style="color: #000000; ">:<br /></span><span style="color: #008080; ">&nbsp;26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;p2[0]&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;p1[0]:<br /></span><span style="color: #008080; ">&nbsp;27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txt&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">u</span><span style="color: #800000; ">'</span><span style="color: #800000; ">西南方</span><span style="color: #800000; ">'</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;28</span>&nbsp;<span style="color: #000000; ">&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; ">&nbsp;29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txt&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;u</span><span style="color: #800000; ">'</span><span style="color: #800000; ">东南方</span><span style="color: #800000; ">'</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">elif</span><span style="color: #000000; ">&nbsp;a</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">70</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">and</span><span style="color: #000000; ">&nbsp;a</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">110</span><span style="color: #000000; ">:<br /></span><span style="color: #008080; ">&nbsp;31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;p2[0]&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;p1[0]:<br /></span><span style="color: #008080; ">&nbsp;32</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txt&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;u</span><span style="color: #800000; ">'</span><span style="color: #800000; ">正西方</span><span style="color: #800000; ">'</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;33</span>&nbsp;<span style="color: #000000; ">&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; ">&nbsp;34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txt&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;u</span><span style="color: #800000; ">'</span><span style="color: #800000; ">正东方</span><span style="color: #800000; ">'</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">:<br /></span><span style="color: #008080; ">&nbsp;36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;p2[0]&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;p1[0]:<br /></span><span style="color: #008080; ">&nbsp;37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txt&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;u</span><span style="color: #800000; ">'</span><span style="color: #800000; ">西北方</span><span style="color: #800000; ">'</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;38</span>&nbsp;<span style="color: #000000; ">&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; ">&nbsp;39</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txt&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;u</span><span style="color: #800000; ">'</span><span style="color: #800000; ">东北方</span><span style="color: #800000; ">'</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;40</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;a,txt<br /></span><span style="color: #008080; ">&nbsp;41</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;42</span>&nbsp;<span style="color: #000000; "></span><span style="color: #800000; ">'''</span><span style="color: #800000; "><br /></span><span style="color: #008080; ">&nbsp;43</span>&nbsp;<span style="color: #800000; ">设定查找九宫格,xy位置处于MIDDLE_CENTER<br /></span><span style="color: #008080; ">&nbsp;44</span>&nbsp;<span style="color: #800000; ">select&nbsp;name,st_distance(ST_MAKEPOINT(121.2,31.2),the_geom)&nbsp;as&nbsp;dist&nbsp;,&nbsp;*&nbsp;from&nbsp;data_c31_point&nbsp;order&nbsp;by&nbsp;dist&nbsp;limit&nbsp;100;<br /></span><span style="color: #008080; ">&nbsp;45</span>&nbsp;<span style="color: #800000; "><br /></span><span style="color: #008080; ">&nbsp;46</span>&nbsp;<span style="color: #800000; ">cast(x'fff'&nbsp;as&nbsp;int)<br /></span><span style="color: #008080; ">&nbsp;47</span>&nbsp;<span style="color: #800000; "><br /></span><span style="color: #008080; ">&nbsp;48</span>&nbsp;<span style="color: #800000; ">select&nbsp;distinct(layerid),count(*)&nbsp;from&nbsp;data_c31_point&nbsp;group&nbsp;by&nbsp;layerid<br /></span><span style="color: #008080; ">&nbsp;49</span>&nbsp;<span style="color: #800000; "></span><span style="color: #800000; ">'''</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;50</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;searchPoints(xy,layers):<br /></span><span style="color: #008080; ">&nbsp;51</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; ">'''</span><span style="color: #800000; "><br /></span><span style="color: #008080; ">&nbsp;52</span>&nbsp;<span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xy&nbsp;-&nbsp;(lon,lat)&nbsp;gps坐标点<br /></span><span style="color: #008080; ">&nbsp;53</span>&nbsp;<span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layers&nbsp;-&nbsp;()&nbsp;&nbsp;查询的层编号列表<br /></span><span style="color: #008080; ">&nbsp;54</span>&nbsp;<span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; ">'''</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;55</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;xy&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;point_g2m(xy[0],xy[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">])<br /></span><span style="color: #008080; ">&nbsp;56</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;bid&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;breadth.getBreadthId(xy)<br /></span><span style="color: #008080; ">&nbsp;57</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;breadth.getX(bid)<br /></span><span style="color: #008080; ">&nbsp;58</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;breadth.getY(bid)<br /></span><span style="color: #008080; ">&nbsp;59</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;xx&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;x</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,x</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;60</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;yy&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;y</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,y</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">在9个网格内检索</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;61</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;layers&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">,</span><span style="color: #800000; ">'</span><span style="color: #000000; ">.join(map(str,layers))<br /></span><span style="color: #008080; ">&nbsp;62</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;63</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;sql&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #800000; ">'''</span><span style="color: #800000; "><br /></span><span style="color: #008080; ">&nbsp;64</span>&nbsp;<span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select&nbsp;st_x(the_geom)&nbsp;as&nbsp;x,st_y(the_geom)&nbsp;as&nbsp;y,name,st_distance(ST_MAKEPOINT(%s,%s),the_geom)&nbsp;as&nbsp;dist<br /></span><span style="color: #008080; ">&nbsp;65</span>&nbsp;<span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;data_c31_point<br /></span><span style="color: #008080; ">&nbsp;66</span>&nbsp;<span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where<br /></span><span style="color: #008080; ">&nbsp;67</span>&nbsp;<span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layerid&nbsp;in&nbsp;(&nbsp;%s&nbsp;)<br /></span><span style="color: #008080; ">&nbsp;68</span>&nbsp;<span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and<br /></span><span style="color: #008080; ">&nbsp;69</span>&nbsp;<span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;(bid&gt;&gt;12)&nbsp;&amp;4095&nbsp;)&nbsp;&gt;=%s<br /></span><span style="color: #008080; ">&nbsp;70</span>&nbsp;<span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and<br /></span><span style="color: #008080; ">&nbsp;71</span>&nbsp;<span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;(bid&gt;&gt;12)&nbsp;&amp;4095&nbsp;)&nbsp;&lt;=%s<br /></span><span style="color: #008080; ">&nbsp;72</span>&nbsp;<span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and<br /></span><span style="color: #008080; ">&nbsp;73</span>&nbsp;<span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;bid&amp;4095&nbsp;)&nbsp;&gt;=%s<br /></span><span style="color: #008080; ">&nbsp;74</span>&nbsp;<span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and<br /></span><span style="color: #008080; ">&nbsp;75</span>&nbsp;<span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;bid&amp;4095&nbsp;)&nbsp;&lt;=%s<br /></span><span style="color: #008080; ">&nbsp;76</span>&nbsp;<span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;order&nbsp;by&nbsp;dist<br /></span><span style="color: #008080; ">&nbsp;77</span>&nbsp;<span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;limit&nbsp;100;<br /></span><span style="color: #008080; ">&nbsp;78</span>&nbsp;<span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; ">'''</span><span style="color: #000000; ">%</span><span style="color: #000000; ">(xy[0],xy[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">],layers,xx[0],xx[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">],yy[0],yy[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">])<br /></span><span style="color: #008080; ">&nbsp;79</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;80</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">print&nbsp;sql</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;81</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;82</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; ">'''</span><span style="color: #800000; "><br /></span><span style="color: #008080; ">&nbsp;83</span>&nbsp;<span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;不同层检索出的poi要选择性的输出<br /></span><span style="color: #008080; ">&nbsp;84</span>&nbsp;<span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;计算每个点处于输入gps坐标的方向：&nbsp;正南，东南<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />.&nbsp;+&nbsp;距离<br /></span><span style="color: #008080; ">&nbsp;85</span>&nbsp;<span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; ">'''</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;86</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;db&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;getDBConn()<br /></span><span style="color: #008080; ">&nbsp;87</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;cr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;db.cursor()<br /></span><span style="color: #008080; ">&nbsp;88</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;cr.execute(sql)<br /></span><span style="color: #008080; ">&nbsp;89</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;rs</span><span style="color: #000000; ">=</span><span style="color: #000000; ">[]<br /></span><span style="color: #008080; ">&nbsp;90</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;True:<br /></span><span style="color: #008080; ">&nbsp;91</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;dbconn.fetchoneDict(cr)<br /></span><span style="color: #008080; ">&nbsp;92</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">not</span><span style="color: #000000; ">&nbsp;r:<br /></span><span style="color: #008080; ">&nbsp;93</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;94</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a,postxt&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;whereis((r[</span><span style="color: #800000; ">'</span><span style="color: #800000; ">x</span><span style="color: #800000; ">'</span><span style="color: #000000; ">],r[</span><span style="color: #800000; ">'</span><span style="color: #800000; ">y</span><span style="color: #800000; ">'</span><span style="color: #000000; ">]),xy)&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">gps坐标处于地理poi的方位</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;95</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs.append([r[</span><span style="color: #800000; ">'</span><span style="color: #800000; ">name</span><span style="color: #800000; ">'</span><span style="color: #000000; ">],r[</span><span style="color: #800000; ">'</span><span style="color: #800000; ">dist</span><span style="color: #800000; ">'</span><span style="color: #000000; ">],postxt,a]&nbsp;)<br /></span><span style="color: #008080; ">&nbsp;96</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;rs<br /></span><span style="color: #008080; ">&nbsp;97</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;98</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800080; ">__name__</span><span style="color: #000000; ">==</span><span style="color: #800000; ">'</span><span style="color: #800000; ">__main__</span><span style="color: #800000; ">'</span><span style="color: #000000; ">:<br /></span><span style="color: #008080; ">&nbsp;99</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;rs&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;searchPoints((</span><span style="color: #000000; ">121.20</span><span style="color: #000000; ">,</span><span style="color: #000000; ">31.2</span><span style="color: #000000; ">),range(</span><span style="color: #000000; ">17</span><span style="color: #000000; ">,</span><span style="color: #000000; ">22</span><span style="color: #000000; ">))<br /></span><span style="color: #008080; ">100</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;open(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">geotxt.txt</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,</span><span style="color: #800000; ">'</span><span style="color: #800000; ">w</span><span style="color: #800000; ">'</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">101</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;r&nbsp;</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">&nbsp;rs:<br /></span><span style="color: #008080; ">102</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.write(r[0].decode(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">utf8</span><span style="color: #800000; ">'</span><span style="color: #000000; ">).encode(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">gbk</span><span style="color: #800000; ">'</span><span style="color: #000000; ">))<br /></span><span style="color: #008080; ">103</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.write(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;%s&nbsp;&nbsp;&nbsp;&nbsp;%s&nbsp;degree</span><span style="color: #800000; ">'</span><span style="color: #000000; ">%</span><span style="color: #000000; ">(r[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]</span><span style="color: #000000; ">*</span><span style="color: #000000; ">1000</span><span style="color: #000000; ">*</span><span style="color: #000000; ">11</span><span style="color: #000000; ">,r[</span><span style="color: #000000; ">3</span><span style="color: #000000; ">]))<br /></span><span style="color: #008080; ">104</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.write(r[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">].encode(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">gbk</span><span style="color: #800000; ">'</span><span style="color: #000000; ">))<br /></span><span style="color: #008080; ">105</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.write(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">\n</span><span style="color: #800000; ">'</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">106</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">print&nbsp;r[0].decode('utf8').encode('gbk')</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">107</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;f.close()</span></div><img src ="http://www.cppblog.com/socketref/aggbug/181998.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-07-07 02:26 <a href="http://www.cppblog.com/socketref/archive/2012/07/07/181998.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从openscales到高德mapabc地图api</title><link>http://www.cppblog.com/socketref/archive/2012/07/07/181987.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Fri, 06 Jul 2012 16:51:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2012/07/07/181987.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/181987.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2012/07/07/181987.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/181987.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/181987.html</trackback:ping><description><![CDATA[一直以来都是用自己编写的地图渲染引擎，客户端使用openscales做应用展示，支持pc，android，iphone<br />已经实现了多个版本的地图数据处理，包括 高德数据、四维数据从shp编译成物理格式供渲染服务使用，这个过程复杂且费事<br />比较了mapabc的地图，作为成熟的商业公司的产品，当然团队多年积累的东西定是我一个人做的不能比拟的，渲染方面在大比例显示处理的比自己好很多，主要自己没有过多时间投入进去，在做完自己的地图版本之后(sw2us.com/gps)考虑接入高德web地图(sw2us.com/newgps)<br /><br />以下对mapabc使用的经验有感<br />我的应用采用flex技术，之前自己的地图加载采用opensacles，到mapabc了便要换成高德的展示客户端了<br /><br />高德发布的最新flex sdk 2.4版本，可以访问 code.mapabc.com,搞笑的是网站的链接缺只能下载2.3.3版本的sdk<br />高德官网的很多支持方式比较滑稽，根本不能提供任何帮助，QQ讨论区每一个能加入的；bbs论坛根本没人维护，回答问题没有解答，这方面做的还是比较差的。<br />花了2天便完成了地图迁移工作，还是主要是我的应用简单的缘故吧！<br />mapabc的api分公众版本和企业版本，两个版本差异很大，曾经以客户名义联系高德销售，提供给我的一份sdk文档与官网的文档版本和内容差异很大，公众版本除了能显示基础底图之外，基本不具备其他令我满意的设施，提供的api也不敬人意。在我迁移openscales代码为高德sdk时碰到了很多问题。<br /><br />--公众版不具有gps到map坐标的转换功能<br />--不具有地址解析功能(gps到文本地址)，不能使用poi检索功能<br />--访问次数限制<br />--显示层级限制，不能更小的比例尺显示<br />--高德sdk 很多组件采用flash开发的，所以不能通过flex继承图来检索组件的功能和接口，sdk提供的overlay对象居然没有getBounds()方法，在处理多个overlap时检测相交不方便<br />--没有layers概念<br />openscales更像一个gis专业的客户地图展示程序，且随意修改，支持air，我已经部署到iphone和android环境，而高德flex sdk更像一个玩具，一个非专业者使用的玩意儿，某些接口简单但不够灵活，且代码封闭<br />高德现在成为apple在大陆的地图数据供应商了，google也许会另择图商，也许是四维。apple当然会以3d地图领航者的角色刮起新的地图应用旋风，大家都跟着学吧<br />等我的地图渲染优化好之后还是会放弃高德的sdk改用自己的地图技术，当然那些需要付费的功能自己去实现喽，3d是趋势，不能让自己落后了<br /><br /><br /><br /><img src ="http://www.cppblog.com/socketref/aggbug/181987.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-07-07 00:51 <a href="http://www.cppblog.com/socketref/archive/2012/07/07/181987.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Gps监控系统   sw2us.com/gps</title><link>http://www.cppblog.com/socketref/archive/2012/06/30/180822.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Fri, 29 Jun 2012 17:24:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2012/06/30/180822.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/180822.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2012/06/30/180822.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/180822.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/180822.html</trackback:ping><description><![CDATA[<div><div>全格Gps2012监控系统</div><div></div><div>我们是上海全格信息科技公司，我们的团队以Gis位置服务系统为方向，多年来积累开发了多套Gps定位系统等核心产品，且拥有所有的技术能力和版权。</div><div>目前我们正在寻找合作伙伴，我们可以提供系统平台服务且我们的强项也在于此，也可以做gps运维服务。</div><div>如果您用的系统也是同深圳那么多Gps厂家共用的一套系统的话，您可以看看我们的系统，参考一下优缺点。</div><div></div><div>&gt;我们是掌握最新Gis应用服务的技术开发团队</div><div>&gt;我们拥有非常丰富的Gis开发、应用、实施的经验和专业的精神</div><div>&gt;我们提供.灵活的可配置、扩展的系统平台，根据客户需求而定制功能，包括：界面、操作接口、报表或者整合客户的业务</div><div>&gt;我们拥有自主的地图平台，提供B/S模式，不采用google，baidu等互联网地图，不采用geoserver等开源的地图，完全我们自己开发的地图引擎，速度快，效率高，设备运行要求低、灵活可扩展</div><div>&gt;我们的监控系统采用flex技术，监控位置和报警完全实时，服务器主动推送gps信息到浏览器端，这一点是非flex技术绝不能做到的，所以设备运行状态实现零延时&nbsp;</div><div>&gt;我们的系统监控终端除了支持pc浏览器，还支持 android，iphone等移动终端访问控制，可进行手机设防、监控轨迹、报警配置等功能，可通过app store和android市场下载安装</div><div>&gt;我们的有5年的Gps监控运营开发的经验，系统设计容量达2w台终端设备，与多个公司合作OEM我们的系统和终端产品</div><div></div><div>~如果您想做Gps监控或者运营，也许您是个人或者是公司老板</div><div>~如果您需要更灵活、可控、安全、稳定的GPS监控系统</div><div>~如果您的需求规划是低成本的</div><div>~如果您需要部署一整套Gps服务平台在自己的环境中，而不是又去代理使用他人的Gps运营平台或者不想花巨资采用 mapabc，mapbar之类的系统</div><div>。。。。。</div><div></div><div>您可以考虑我们的技术方案，我们可以以最优质的服务、最先进的技术、最灵活的合作模式与您实现共赢</div><div></div><div>请访问我们的网站: <a href="http://www.sw2us.com " target="_blank">www.sw2us.com </a>&nbsp; &nbsp; &nbsp;</div><div>Gps系统访问地址: <a href="http://www.sw2us.com/gps" target="_blank">www.sw2us.com/gps</a></div><div></div><div></div><div>---------------------------------------------------------------------------------------------</div><div>上海全格信息科技有限公司</div><div>Shanghai Triangle Info Tech Co,Ltd.&nbsp;</div><div>地址: 上海市闵行区立跃路2897号1幢302室 &nbsp;邮编: 201114&nbsp;</div><div>电话: &nbsp;86-021-34680553 &nbsp; &nbsp; 传真: &nbsp;86-021-64296802 &nbsp; &nbsp; &nbsp; &nbsp; 邮件: service@sw2us.com</div><div>移动电话: &nbsp;13661913244 &nbsp; &nbsp; 网址: &nbsp;http://www.sw2us.com &nbsp; &nbsp;QQ: 2536588583@qq.com</div><div>---------------------------------------------------------------------------------------------</div><div></div></div><div id="isChromeWebToolbarDiv" style="display:none"></div> <div id="isChromeWebToolbarDiv" style="display:none"></div><img src ="http://www.cppblog.com/socketref/aggbug/180822.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-06-30 01:24 <a href="http://www.cppblog.com/socketref/archive/2012/06/30/180822.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>flex.openscales无法在air显示地图</title><link>http://www.cppblog.com/socketref/archive/2012/06/12/178584.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Tue, 12 Jun 2012 15:50:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2012/06/12/178584.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/178584.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2012/06/12/178584.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/178584.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/178584.html</trackback:ping><description><![CDATA[一直使用openscales 1.2.1版本开发webapp，在浏览器显示地图层，没有问题<br />最近想把应用改到air下跑地图显示，结果死活地图无法加载成功，同样的代码，<br /><div>&nbsp;&nbsp;&nbsp; &lt;Map id="fxMap" width="400" height="300" resolution="0.001911274412400001" <br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; center="121.22,31.3" x="51" y="70" &gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;WMSC name="Nasa" <br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; layers="bluemarble" format="image/jpeg"&nbsp; version="1.1.1"&nbsp; url="http://sw2us.com:8001/wms"/&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;DragHandler/&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;WheelHandler/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/Map&gt;</div>以上代码webapp方式可以显示地图，但改成air方式不行<br />以为1.2.1的bug，所以改换openscales的2.0版本，<br />恶梦来了，2.0与1.2.1版本api变化非常巨大，基本上以前些的代码都要作废掉，坑爹啊<br />耐着性子，看了网上的2.0的api，做了test程序，发现wmsc地图还是只能显示在webapp模式下，air还是不行，肯定我哪里没有琢磨清楚了的缘故。<br />不过还好，flex builder4.6下开发mobile应用没有选择air的提示，直接把wmsc加载成功，phone和android上可以显示出地图来，比较暗自高兴，<br />air的其中缘故还得把openscales的代码翻出来鞭尸一遍才能晓得缘故<br />很想切换到2.0，毕竟看到了很多api的增强，但是应用代码做迁移不容易啊，郁闷<br /><br /><br /><br /><img src ="http://www.cppblog.com/socketref/aggbug/178584.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-06-12 23:50 <a href="http://www.cppblog.com/socketref/archive/2012/06/12/178584.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>影像管理系统开发告一段落，舒口气</title><link>http://www.cppblog.com/socketref/archive/2012/03/27/169198.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Tue, 27 Mar 2012 11:23:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2012/03/27/169198.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/169198.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2012/03/27/169198.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/169198.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/169198.html</trackback:ping><description><![CDATA[花了近3周时间去完成DVR项目的视频影像管理系统。目标容量200T，利用廉价PC实现集群存储，由于存储的是单个的视频段文件且对于文件容灾方面没有特殊的要求，允许单点存储损坏。<br />系统部署一个stoMaster服务器做控制服务，提供影像系统的读写调度分配、系统模块监控管理、系统影像查询服务；若干个stoNodeServer作为单点存储服务器，每个节点服务器下挂载10个2T普通硬盘，单节点支持20T容量，由于采用PC架构，大大节省成本且还能保证一定IO并发能力，保证200T容量需要10台PC做支撑。<br />开发涉及技术: python + ffmpeg + flex + openscales + swMapServer + Vs2008 + Qt + postgis + psycopg2 + comtypes<br />Links: <a title="http://sw2us.com/sites/default/files/dvr.demo.v0.1.0_2012.3.27.zip" href="http://sw2us.com/sites/default/files/dvr.demo.v0.1.0_2012.3.27.zip">http://sw2us.com/sites/default/files/dvr.demo.v0.1.0_2012.3.27.zip</a><br />幸好有了python这个好帮手,不然要干死了，python对我来讲不是简单的当胶水辅助了，通信框架、UI、数据库都采用python，只有那些个点上用了高效点的c++，例如：ffmpeg解码、文件存储等等<br />演示视频:&nbsp; <div><a style="color: #ff0000;" title="http://sw2us.com/sites/default/files/flvshow/dvr.demo.html" href="http://sw2us.com/sites/default/files/flvshow/dvr.demo.html">http://sw2us.com/sites/default/files/flvshow/dvr.demo.html</a></div><br /><br /><br /><img alt="" src="http://www.cppblog.com/images/cppblog_com/socketref/dvr/dvr.1.png" height="446" width="630" /><br /><br /><img alt="" src="http://www.cppblog.com/images/cppblog_com/socketref/dvr.4.png" height="296" width="625" /><br /><br /><img alt="" src="http://www.cppblog.com/images/cppblog_com/socketref/dvr/dvr.2.png" height="302" width="633" /><br /><img alt="" src="http://www.cppblog.com/images/cppblog_com/socketref/dvr/dvr.3.png" height="302" width="625" /><br /><br />系统运行demo: <br /><img alt="" src="http://www.cppblog.com/images/cppblog_com/socketref/dvr/demo.1.png" height="903" width="1150" /><br /><br /><img alt="" src="http://www.cppblog.com/images/cppblog_com/socketref/dvr/demo.2.png" height="543" width="774" /><br /><br /><img alt="" src="http://www.cppblog.com/images/cppblog_com/socketref/dvr/demo.3.png" height="523" width="649" /><br /><br /><img alt="" src="http://www.cppblog.com/images/cppblog_com/socketref/dvr/demo.4.png" height="673" width="978" /><img src ="http://www.cppblog.com/socketref/aggbug/169198.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-27 19:23 <a href="http://www.cppblog.com/socketref/archive/2012/03/27/169198.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>gis:ks102 设备解码</title><link>http://www.cppblog.com/socketref/archive/2012/03/08/167401.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Thu, 08 Mar 2012 07:23:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2012/03/08/167401.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/167401.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2012/03/08/167401.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/167401.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/167401.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 与ks108同一个项目，ks102为编写手持gps模块，个人、宠物使用Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->&nbsp;&nbsp;1&nbsp;#&nbsp;--&nbsp;coding:utf-8&nbsp;--&nbsp;&nbsp;2...&nbsp;&nbsp;<a href='http://www.cppblog.com/socketref/archive/2012/03/08/167401.html'>阅读全文</a><img src ="http://www.cppblog.com/socketref/aggbug/167401.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 15:23 <a href="http://www.cppblog.com/socketref/archive/2012/03/08/167401.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gis::ks108设备接入解码</title><link>http://www.cppblog.com/socketref/archive/2012/03/08/167400.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Thu, 08 Mar 2012 07:20:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2012/03/08/167400.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/167400.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2012/03/08/167400.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/167400.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/167400.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: ks108 Gps定位模块接入服务中心，解码类：Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->&nbsp;&nbsp;1&nbsp;#&nbsp;--&nbsp;coding:utf-8&nbsp;--&nbsp;&nbsp;2&nbsp;#解码器定...&nbsp;&nbsp;<a href='http://www.cppblog.com/socketref/archive/2012/03/08/167400.html'>阅读全文</a><img src ="http://www.cppblog.com/socketref/aggbug/167400.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 15:20 <a href="http://www.cppblog.com/socketref/archive/2012/03/08/167400.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Opensacles::利用网格Tile实现用户feature加载</title><link>http://www.cppblog.com/socketref/archive/2011/10/13/158210.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Thu, 13 Oct 2011 03:37:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2011/10/13/158210.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/158210.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2011/10/13/158210.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/158210.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/158210.html</trackback:ping><description><![CDATA[在应用项目中，我们又很多用户信息点需要被加载到图层上，这些点可以使用CustomMarker来显示。用户点分布密集程度不一致，而且量很大，一次性的全部加载进行图层是不可取的，幸好使用的是openscales的wmsc图层，底图是瓦片(tile)形式加载，所以最简单的方式就是当tile加载和释放的时候通知到用户层，用户层实现加载和释放用户信息点。<br />看了一下openscales的代码，发现tile的申请和释放并没有通知到层对象，所以我们不能直接获取这些事件消息。<br />wmsc类层次结构: wmsc-&gt;wms-&gt;Grid-&gt;HttpRequest-&gt;Layer<br />Grid类维护了瓦片集合的二维数组，当地图extent改变时，openscales将扫描Grid的瓦片数组，如果发现有空洞则调用wms的addTile()创建新的tile，如果发现可废弃tile，则调用Grid.removeExcessTiles()。<br />addTile()之后openscales将通知layer接收TileEvent.TILE_LOAD_START事件，这个TILE_LOAD_START事件是可以利用的，作为tile加载时的通知事件，在使用的wmsc层时添加一个事件侦听便可获取tile加载事件；<br />ImageTile从Tile派生下来，当Grid作废无效Tile时，将调用Tile.destroy()方法，所以我在TileEvent添加新事件TILE_DESTROY，在Tile.destroy()通知layer获取tile销毁的消息<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"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;destroy():void&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;2</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><span style="color: #000000; ">&nbsp;(this.layer</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">null){<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;&nbsp;&nbsp;&nbsp;&nbsp;this.layer.dispatchEvent(new&nbsp;TileEvent(TileEvent.TILE_DESTROY,this));<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;this.layer&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;null;<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.bounds&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;null;<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.size&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;null;<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;this.position&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;null;</span><span style="color: #008080; "></span><span style="color: #000000; "><br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>修改文件 TileEvent.as,Tile.as<br />好了，事件接收只需要在Layer的实例添加如下代码: <br /><div>addEventListener(TileEvent.TILE_LOAD_START,tileLoadHandler);</div><div>addEventListener(TileEvent.TILE_DESTROY,tileDestroyHandler);<br />TileEvent.tile携带了tile的boundle信息可供我们去请求feature对象了<br /><br /></div><img src ="http://www.cppblog.com/socketref/aggbug/158210.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-10-13 11:37 <a href="http://www.cppblog.com/socketref/archive/2011/10/13/158210.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>重新整理2011年地图数据</title><link>http://www.cppblog.com/socketref/archive/2011/08/11/153085.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Thu, 11 Aug 2011 11:56:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2011/08/11/153085.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/153085.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2011/08/11/153085.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/153085.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/153085.html</trackback:ping><description><![CDATA[从朋友处得到一份2011年的四维地图数据，但是数据是未修正偏差的。花了2周时间加工出了效果<br />
有问题请大家指正<br />
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="800" height="500" id="gisDemo">
<param name="movie" value="http://sw2us.com/sites/default/files/flex/simple_map.swf" />
<param name="quality" value="high" />
<param name="bgcolor" value="#666666" />
<param name="allowScriptAccess" value="sameDomain" />
<param name="allowFullScreen" value="true" />
<!--[if !IE]>-->
<object type="application/x-shockwave-flash" data="http://sw2us.com/sites/default/files/flex/simple_map.swf" width="800" height="500">
<param name="quality" value="high" />
<param name="bgcolor" value="#666666" />
<param name="allowScriptAccess" value="sameDomain" />
<param name="allowFullScreen" value="true" />
<!--<![endif]-->
<!--[if gte IE 6]>-->
<p>
Either scripts and active content are not permitted to run or Adobe Flash Player version
10.0.0 or greater is not installed.
</p>
<!--<![endif]-->
<a href="http://www.adobe.com/go/getflashplayer">
<img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash Player" />
</a>
<!--[if !IE]>-->
</object>
<!--<![endif]-->
</object>
<br />
截图 :<br />
<img src="http://www.cppblog.com/images/cppblog_com/socketref/2011-8-11_19-47-57.png" width="959" height="607" alt="" />
<img src ="http://www.cppblog.com/socketref/aggbug/153085.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-08-11 19:56 <a href="http://www.cppblog.com/socketref/archive/2011/08/11/153085.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>火星坐标</title><link>http://www.cppblog.com/socketref/archive/2011/06/29/149713.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Wed, 29 Jun 2011 02:13:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2011/06/29/149713.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/149713.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2011/06/29/149713.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/149713.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/149713.html</trackback:ping><description><![CDATA[<div><div>  					 			<h2>中国特色&nbsp;火星坐标</h2> 			 					<span sg_txtc=""></span><a id="quote_set_sign2" sg_abtn_ico="" sg_turn=""><cite><img sg_icon111="" src="http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif" align="absmiddle" height="15" width="15"  alt="" />转载</cite></a>		</div> 		<div id="sina_keyword_ad_area"> 			<table> 				<tbody><tr> 					<td><br /></td><td><br /></td></tr></tbody></table></div>http://www.unistrong.com/bbs/topic.aspx?topicid=2774<br /> http://www.foooooot.com/club/4/topic/740/<br /> <br /> 我们平时用到的地球坐标系统，叫做WGS84坐标，国家保密插件，也叫做加密插件或者加偏或者SM模组，其实就是对真实坐标系统进行人为的加偏处理，按照 几行代码的算法，将真实的坐标加密成虚假的坐标，而这个加偏并不是线性的加偏，所以各地的偏移情况都会有所不同。而加密后的坐标也常被人称为火星坐标系 统，这是我们的国家又一个伟大的发明，让国外的政府和企业等，都看不懂我们的坐标系统。<br /> <br /> 其实很少有人知道国家保密插件问题，但作为导航电子地图产业或者汽车导航产业中的人，多多少少都会了解到这个问题。国家是出于国家安全考虑，将我们看到的 真实的坐标变成假的虚拟的坐标，这样，我们的国家就安全了，不会被恐怖分子破坏了。最简单的举例来说，比如鸟巢吧，你真实的坐标是这个，加密后就成了那 个，导航电子地图上看到的就是那个，那么人家导弹要是攻击那个的时候，那么导弹就打不中我们的鸟巢啦，我们的鸟巢就安全了。不过，个人担心这样加密后没有 打中鸟巢，会不会打中水立方呢，可能是无心插柳柳成荫了。<br /> <br /> 现在，所有的电子地图所有的导航设备，都需要加入国家保密插件。第一步，地图公司测绘地图，测绘完成后，送到国家测绘局，将真实坐标的电子地图，加密成 &#8220;火星坐标&#8221;，这样的地图才是可以出版和发布的，然后才可以让GPS公司处理。第二步，所有的GPS公司，只要需要汽车导航的，需要用到导航电子地图的， 统统需要在软件中加入国家保密算法，将COM口读出来的真实的坐标信号，加密转换成国家要求的保密的坐标，这样，GPS导航仪和导航电子地图就可以完全匹 配啦，GPS也就可以正常工作啦。<br /> <br /> 所以，所有的导航电子地图公司，像四维图新、瑞图、易图通、高德等等，都需要将自己的电子地图拿到国家测绘局进行加密处理，而所有的导航软件公司，都需要 将自己的导航软件中加入国家测绘局提供的加密算法的代码。而这一段代码，就是国家的机密，不是公开的，每次去国家测绘局加密处理都需要预约并在封闭的环境 中进行，编译完成后需要是在主程序的exe中，而不能编译在外部dll等文件中。<br /> <br /> 当然，国家的保密插件，是需要收费的，早期的时候，一个导航仪就需要10块钱的保密插件许可费，恩，保密插件也不是白用的，毕竟国家花了很多的钱和人力和 物力才做出来的保护国家安全的保密东西怎么可以随便送你用呢，收点钱也就算是正常也算是在预料之中啦。现在的话，好像已经下放到地图数据公司了，就是看这 个地图数据公司的经营状况，大概会出货多少份电子地图，然后一次性收取地图数据公司多少钱，可能是多少百万，然后这个钱呢，你们数据公司就自己找你们的导 航软件公司的客户收吧，算在每一台设备中的许可费，恩，国家的办事效率变高了，一次直接从导航电子地图公司收费比逐个收取导航软件公司的钱要来的容易和不 那么麻烦。<br /> <br /> 现阶段，有些人或者组织，为了自己的利益，将导航软件和导航地图进行破解，并发现了导航电子地图中存在的地图偏差，所以就采取人为的手段，将地图反加密， 将虚假的坐标转换成标准的WGS84坐标，最笨的方法就是线性的平移，大概偏差的距离为500米，基本上能够反回来，但误差较大，特别是南北距离加大的情 况下，而聪明一点的方法，用matlab等工具计算出其中的曲线，然后反转回来。多么的可怕那，这是触犯国家法律的行为，国家的安全就这样被你们破坏了， 这是一个刑事问题，而不是简单的破解软件破解地图的经济犯罪问题了。请大家务必务必遵守国家的法律，不要干出这样的傻事出来，出了事谁都保不了你，毕竟你 将成为国家的敌人。<br /> <br /> 最后，说说保密插件带来的弊端，好处不容忽视，国家为了安全考虑，保密了就安全了，但弊端是，制造了人为的障碍，非常的不好用，比如导航软件出来的坐标， 不能和Google Earth等国际软件匹配，Google Earth和Map在国内基本上就是废物。进一步带来的导航问题是，寻宝、分享等许多好玩的GPS活动，都无法在大陆地区展开，这一点真的让人很无奈。当 然，也有一些时候，由于导航软件的保密插件问题，导致不能导航等等。保密插件，是一个让人哭笑不得的东西，就如同国际的WGS84坐标对我们的54坐标或 者80坐标，就如同<br /> <br /> <br /> 名词总结：<br /> 地球坐标：指WGS84坐标系统<br /> 火星坐标：指使用国家保密插件人为偏移后的坐标<br /> 地球地图：指与地球坐标对应的客观真实的地图<br /> 火星地图：指经过加密偏移后的，与火星坐标对应的地图<br /> <br /> 以上内容浏览后，背景知识大概就明白了。<br /> <br /> 首先，我们手上所有的GPS设备，根据渠道和接口软件的不同，分为火星坐标设备与WGS84坐标设备两种，另外所有GPS设备中的地图以及网上的地图，分为火星地图（即人为偏移）和真实地图两种。<br />  比如国内&#8220;正规渠道的车载GPS&#8221;，采用的是火星坐标配火星地图，完美结合，能够准确的在地球上使用，缺点就是记录的点和轨迹都是火星的，与其他地球人无法交流分享。<br />  多数水货GPS设备，使用的都是地球坐标配火星地图，这样轨迹和航点都是真实坐标的，只不过在火星地图上偏移了<br /> 有些玩家，会将火星地图加入偏移算法（无论准确或不准确），人为纠偏，形成地球坐标配纠偏地图（自制地图），不考虑误差可以正常使用<br />  而目前，所有正式发布的大陆境内电子地图，都是火星地图，所以只有大陆之外地区，才能够用到地球坐标与官方地球地图完美结合的解决方案</div><img src ="http://www.cppblog.com/socketref/aggbug/149713.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-06-29 10:13 <a href="http://www.cppblog.com/socketref/archive/2011/06/29/149713.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gps::ks-108设备协议接入代码</title><link>http://www.cppblog.com/socketref/archive/2011/06/15/148721.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Wed, 15 Jun 2011 08:54:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2011/06/15/148721.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/148721.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2011/06/15/148721.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/148721.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/148721.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->&nbsp;&nbsp;1&nbsp;#&nbsp;--&nbsp;coding:utf-8&nbsp;--&nbsp;&nbsp;2&nbsp;#解码器定义&nbsp;&nbsp;3&nbsp;&nbs...&nbsp;&nbsp;<a href='http://www.cppblog.com/socketref/archive/2011/06/15/148721.html'>阅读全文</a><img src ="http://www.cppblog.com/socketref/aggbug/148721.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-06-15 16:54 <a href="http://www.cppblog.com/socketref/archive/2011/06/15/148721.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>整理之前的webgis demo，提供下载</title><link>http://www.cppblog.com/socketref/archive/2011/05/26/147171.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Thu, 26 May 2011 02:56:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2011/05/26/147171.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/147171.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2011/05/26/147171.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/147171.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/147171.html</trackback:ping><description><![CDATA[webgis地图访问地址 ：　<a href="http://sw2us.com:8520/medias/flex/newgis.html">http://sw2us.com:8520/medias/flex/newgis.html</a><a title="http://sw2us.com:8080/" href="http://sw2us.com:8080/"></a><div>下载地址：　<a title="http://sw2us.com:9090/sw2us.webgis.demo.2011.5.26.7z" href="http://sw2us.com:9090/sw2us.webgis.demo.2011.5.26.7z">http://sw2us.com:9090/sw2us.webgis.demo.2011.5.26.7z</a><br /><br /><img alt="" src="http://www.cppblog.com/images/cppblog_com/socketref/sw2us.webgis.demo.png" height="420" width="892" /><br /><div>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</div>sw2us.webgis 在99年就开始有个做地图引擎的想法，由于忙于公司其他开发项目的事情，一直断断续续进行<br />在5173的时候开始用geoserver来架构wms服务器，发现配置部署性能都差强人意，所以想着自己做个wms服务<br />10年的时候也写了个版本，后来用tilecache进行tile 绘制，中国地图1000的比例两台机器绘制了1个月<br />下半年生病了，到11月份回unistrong上班，工作内容就是写驱动，空闲之余继续写地图渲染代码，以前用wx做的<br />代码全部用qt写了一遍，优化了一些速度。地图换了两版本，08年的全国图和11年的上海图，用python脚本进行预处理<br />切割地图进行网格存储。以前的同事多年前就告诉我他们改进4叉树的存储方式来提高访问数据减少数据加载，我也<br />没好好琢磨过，主要是没有时间和精力，只好做这种傻瓜式的简单网格切分和加载。<br /><br />demo只是简单实现了地图加载和现实，然后用openlayers,extjs,geoext,django做了个框架页面，里面放了个不跑的汽车图标<br /><br />这个东西是10年12月完成的，已经准备放弃这个架构的设想,准备采用flex+openscale+django来重做webgis应用，<br />当然那还是需要花费很多时间和精力<br /><br />zhangbin <br />2011.1.20<br /><br />msn: socketref@hotmail.com<br />qq: 24509826<br /><br />==========================================================================================<br />注意：　sw2us.webgis.demo目录必须存放在c:\根目录下,不能更改目录名<br /><br />安装<br />=============<br />1.配置数据库<br />&nbsp;&nbsp; &nbsp;安装pgsql, postgresql-8.3.5-2-windows.exe，数据库端口保持为5432 ，设置postgres用户，密码为111111<br />&nbsp;&nbsp; &nbsp;安装空间数据库扩展 postgis-pg83-setup-1.5.2-1.exe<br />&nbsp;&nbsp; &nbsp;创建 数据库名 newgis,导入数据库文件 newgis.db.backup <br /><br />2. webserver配置 <br />&nbsp;&nbsp; &nbsp;运行C:\sw2us.webgis.demo\apache2.2.pack\http-install.bat&nbsp; 安装apache服务，侦听 9090端口 <br />&nbsp;&nbsp; &nbsp;C:\sw2us.webgis.demo\apache2.2.pack\http-install.bat &nbsp;&nbsp; &nbsp;启动apache服务<br />&nbsp;&nbsp; &nbsp;<br />3.安装微软雅黑字体<br />&nbsp;&nbsp; &nbsp;bin/vistaFont_chs.exe ,安装之后修改系统默认字体为微软雅黑字体<br /><br />4. 安装vc运行环境 bin\vcredist_x86.exe<br /><br />运行: <br />===============<br />&nbsp;&nbsp; &nbsp;start-gis.bat &nbsp;&nbsp; &nbsp;运行django后台服务<br />&nbsp;&nbsp; &nbsp;wms_start.bat &nbsp;&nbsp; &nbsp;运行wms服务器<br />&nbsp;&nbsp; &nbsp;tileserver-rpcservice-1.bat/tileserver-rpcservice-2.bat 为后台地图渲染服务，目前配置5001,5002端口<br />&nbsp;&nbsp; &nbsp;浏览器录入 http://192.168.14.3:8080/ 即可看到地图界面 <br />&nbsp;&nbsp; &nbsp;<br />系统端口说明: <br />===============<br />&nbsp;&nbsp; &nbsp;9090 &nbsp;&nbsp;&nbsp; &nbsp;apache 服务端口 <br />&nbsp;&nbsp; &nbsp;8080&nbsp;&nbsp; &nbsp;django 服务端口<br />&nbsp;&nbsp; &nbsp;8000&nbsp;&nbsp; &nbsp;wms 服务端口<br />&nbsp;&nbsp; &nbsp;5001,5002 地图渲染服务端口<br /><br />&nbsp;&nbsp; &nbsp;<br />以上端口都被写入了相关服务的配置文件，请确保这些端口没有被占用 <br /><br />--&nbsp;&nbsp; &nbsp;修改apache端口 C:\sw2us.webgis.demo\apache2.2.pack\Apache2.2\conf\httpd.conf ;<br />&nbsp;&nbsp; &nbsp;修改之后必须重新启动apache服务(http-shutdown.bat,http-start.bat)<br />&nbsp;&nbsp; &nbsp;修改apache端口之后必须修改对应django的配置 C:\sw2us.webgis.demo\newgis\gis.py(第14行 JSLIB_PATH的webserver指向)<br />--&nbsp;&nbsp; &nbsp;django服务端口可以任意修改 start-gis.bat<br />--&nbsp;&nbsp; &nbsp;wms服务端口修改 wms_start.bat ,修改之后必须同步C:\sw2us.webgis.demo\newgis\medias\js\gis\gismap.js(第19行)的wms服务器指向<br />--&nbsp;&nbsp; &nbsp;地图渲染服务可以根据负荷的情况启动多个服务进程(复制tileserver-rpcservice-1.bat，修改其端口号，比如 5003),在修改或增加渲染<br />&nbsp;&nbsp; &nbsp;进程之后必须修改wms服务的配置C:\sw2us.webgis.demo\swmap.demo\GisServer\tileservers.txt<br />&nbsp;&nbsp; &nbsp;<br />demo系统默认都是采用localhost做服务接口，如果要提供网络支持或者分布这些服务进程来提高性能，则需要修改这些不同的端口和ip地址<br /><br />&nbsp;&nbsp; &nbsp;<br />系统描述：<br />=============<br />&nbsp;浏览器firefox 直接访问django端口，django的url.py分派请求到gis.py,gis.py加载pages/mainwindow.html<br />&nbsp;mainwindow.html已经是个openlayers+ext的框架界面了，其陆需加载 openlayers,ext等的js脚本，注意：这些js<br />&nbsp;脚本并不存在django的目录下，而是存放在apache的web-root目录下，所以必须要修改gis.py和mapgis.js里面的<br />&nbsp;主机指向信息。<br />&nbsp;当mainwindow.html加载之后，工作就交给了openlayers，openlayers将访问wms服务器(gismap.js 19行),此刻wms服务器<br />&nbsp;提供tile数据给浏览器。<br />&nbsp;地图渲染服务必须在wms服务之前启动，wms通过tileserver.txt的配置 采用ice 与渲染服务进程通讯并获得图块并返回给<br />&nbsp;浏览器。<br />&nbsp;渲染服务器、wms服务器、apache和django服务都可以被分隔存储在不同的主机上<br />&nbsp;<br />&nbsp;好了，demo可以在本机跑起来了，但必须是以 http://locahost:8080方式，如果想以网络方式访问则修改wms服务端口,gis.py,gismap.js及相关.bat配置<br />&nbsp;<br />相关问题 <br />=============<br />&nbsp;如果将这些服务主机都配置成localhost，访问速度大大降低 ， 应配置成独立的ip地址<br />&nbsp;apache已经配置了js压缩输出&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp;</div><img src ="http://www.cppblog.com/socketref/aggbug/147171.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-26 10:56 <a href="http://www.cppblog.com/socketref/archive/2011/05/26/147171.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HttpServer+ TileCache</title><link>http://www.cppblog.com/socketref/archive/2010/11/18/134002.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Thu, 18 Nov 2010 08:49:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2010/11/18/134002.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/134002.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2010/11/18/134002.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/134002.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/134002.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; TileCache从去年开始使用已经有一段时间了，之前是为了配合GeoServer来产生缓存网格块，之后在3-8月份处于停滞状态，到9月份身体开始恢复就重新启动swMap工程，彻底抛弃了GeoServer(效率和安装运行环境不能满足要求)。在使用geoServer期间，采用Tilecache产生了千万的tile图块，默认是存放在文件系统，产生的Tile在备份迁移的时候令我寒心，那么多的文件拷贝每次都要耗费4，5个小时，考虑到这种情况，我自己编写了TileCache的Store Backend，将Tilecache产生的Tile存储进PostGresDB，这样我只要备份DB就可以了。<br>&nbsp;&nbsp;&nbsp; 随即而来的是放弃Geoserver，自己重新开发地图渲染服务器，使用了QT令我效果满意，那再使用那一套GeoServer的东西就不合时宜了，TileCache也是需要绑定Apache+mod_python才能工作，简直太累最了，配置个环境还是不太容易，想想自己只是想提供一个WMS的服务罢了何必那么麻烦呢。 地图服务器也有了，产生CacheTiles也开发了自动化的工具，将全国不同显示比例的图块按256x256规格分别放入多个文件，这样备份起来就快速多了。<br>&nbsp;&nbsp;&nbsp; 之前看过TileCache的代码，那时候只是为了编写一个新的Cache Store backend，现在重新回过头来，我决定抛弃apache，语言还是用python，之前做一个酒店广告投放系统时开发过一个Http代理服务器，所以轻车熟路了，保留其Http服务功能，加上TileCache的WMS服务代码，一个swMap的WMS 服务器就可以诞生了。<br>&nbsp;&nbsp;&nbsp; 端详了一会儿TileCache，发现是多么的简单，几乎不用多修改什么地方就可以完成。<br>&nbsp;&nbsp;&nbsp; 由于我的swMap服务程序提供了预先缓存和实时绘制地图的功能，所以通过Http可以以两种模式进行，当然实时模式是用于调试地图层SLD时派上大用场。<br>&nbsp;&nbsp;&nbsp; 实时绘制的时候我的WMS服务器通过Ice连接到swMap服务器，当缓存访问时我的WMS服务器直接从本地Tile文件中读取，那时多么舒服的事情哪！ <br><br><br><br><br> <img src ="http://www.cppblog.com/socketref/aggbug/134002.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-18 16:49 <a href="http://www.cppblog.com/socketref/archive/2010/11/18/134002.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>下一步swMap的工作内容</title><link>http://www.cppblog.com/socketref/archive/2010/11/18/133998.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Thu, 18 Nov 2010 08:32:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2010/11/18/133998.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/133998.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2010/11/18/133998.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/133998.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/133998.html</trackback:ping><description><![CDATA[1. 修改httpserver+tilecache,使 swMap具有WMS功能，支持openlayers访问<br>2. 继续增加swBox功能，诸如: 测距、围栏、自定义用户兴趣点、面积计算<br>3. 缓冲全国图tile到缓存文件，最低比例1:2000,由于是全国性的预先绘制工作，会消耗很大的磁盘空间和处理时间，估计3台4核的PC连续1个星期工作时间<br>4. 开发基于swBox的基本应用，增加POI搜寻和MapGrab功能(用户可以指定地理范围产生指定显示精度的大幅图像，比如可以抓取1:4000的整个上海城区图到一个jpg文件)<br>5. 增加矢量运算操作进行道路匹配<br>6. 增加GPS简易的定位功能，多个移动对象之间的位置拓扑关机的操作，支持轨迹回放和导出功能<br>7. swBox增加Wince版本<br><br><br> <img src ="http://www.cppblog.com/socketref/aggbug/133998.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-18 16:32 <a href="http://www.cppblog.com/socketref/archive/2010/11/18/133998.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>加了QT绘制地图</title><link>http://www.cppblog.com/socketref/archive/2010/10/19/130501.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Tue, 19 Oct 2010 15:37:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2010/10/19/130501.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/130501.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2010/10/19/130501.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/130501.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/130501.html</trackback:ping><description><![CDATA[之前废弃了wxWidgets，地图用Qt渲染，反锯齿和字体都是现成的<br>加上了SLD控制地图分隔，比之前的效果好了很多<br><br>1.修复了由于判别第一个feature不在可视区域内导致忽略了之后的数据加载的bug<br>2.多边形和线性增加了最小可见宽度，为了加速绘制的速度<br><br>告别了geoserver那种蜗牛和不可控的年月了<br>基本的绘制效果比较满意<br>下一步工作：<br>1.文本绘制和优化<br>2.地图layer压缩减小存储空间以及测试性能上的影响<br>3.优化memheap的算法<br>4.mapcanas从wx移植到qt<br>5.flex 组件优化<br>6.mapserver支持tilecache<br><br><img alt="" src="http://www.cppblog.com/images/cppblog_com/socketref/out_qt.jpg" width="768" height="768"><br><br> <img src ="http://www.cppblog.com/socketref/aggbug/130501.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-10-19 23:37 <a href="http://www.cppblog.com/socketref/archive/2010/10/19/130501.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>地图显示比计算</title><link>http://www.cppblog.com/socketref/archive/2010/10/08/129099.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Fri, 08 Oct 2010 14:39:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2010/10/08/129099.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/129099.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2010/10/08/129099.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/129099.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/129099.html</trackback:ping><description><![CDATA[地图显示可以用缩放比进行表示，也可以用度表示<br>例如在openlayers时，resolutions用于定义显示精度，也就是比例尺。<br>&nbsp;&nbsp;&nbsp; resolutions: [0.17578125,0.087890625,0.0439453125,0.02197265625] ,定义了4级地图显示比例，每个像素表示多少地理宽度<br>&nbsp;如果换算成显示比时，转换方法:&nbsp; 0.17578125*sw_METERS_PER_DEGREE/sw_METERS_PER_PIXEL = 74,143,700 = 74M<br>&nbsp;也是就 1:74M<br><img src ="http://www.cppblog.com/socketref/aggbug/129099.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-10-08 22:39 <a href="http://www.cppblog.com/socketref/archive/2010/10/08/129099.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>TileCache.Cache扩展</title><link>http://www.cppblog.com/socketref/archive/2010/04/14/112600.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Wed, 14 Apr 2010 15:47:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2010/04/14/112600.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/112600.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2010/04/14/112600.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/112600.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/112600.html</trackback:ping><description><![CDATA[TileCache默认是Disk缓存Tile数据，存储和检索的效率远不及数据库，所以要开发数据库Cache，读完TileCache代码，发现其系统结构设计的还算可以<br>tilecache-2.10\TileCache\Caches目录下就是TileCache自带的Cache类型，Cache有个抽象基类，我的数据Cache只要实现这些Cache的接口便能完成到数据库的Tile存取。<br><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: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Cache&nbsp;(object):<br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">__init__</span><span style="color: #000000;">&nbsp;(self,&nbsp;timeout&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">30.0</span><span style="color: #000000;">,&nbsp;stale_interval&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">300.0</span><span style="color: #000000;">,&nbsp;readonly&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;False,&nbsp;</span><span style="color: #000000;">**</span><span style="color: #000000;">kwargs):<br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.stale&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;float(stale_interval)<br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.timeout&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;float(timeout)<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.readonly&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;readonly<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;lock&nbsp;(self,&nbsp;tile,&nbsp;blocking&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;True):<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start_time&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;time.time()<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;self.attemptLock(tile)<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;result:<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;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;True<br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">elif</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">not</span><span style="color: #000000;">&nbsp;blocking:<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;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;False<br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;result&nbsp;</span><span style="color: #0000ff;">is</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">not</span><span style="color: #000000;">&nbsp;True:<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;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;time.time()&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;start_time&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;self.timeout:<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;</span><span style="color: #0000ff;">raise</span><span style="color: #000000;">&nbsp;Exception(</span><span style="color: #800000;">"</span><span style="color: #800000;">You&nbsp;appear&nbsp;to&nbsp;have&nbsp;a&nbsp;stuck&nbsp;lock.&nbsp;You&nbsp;may&nbsp;wish&nbsp;to&nbsp;remove&nbsp;the&nbsp;lock&nbsp;named:\n%s</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;self.getLockName(tile))&nbsp;<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;time.sleep(</span><span style="color: #000000;">0.25</span><span style="color: #000000;">)<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;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;self.attemptLock(tile)<br></span><span style="color: #008080;">19</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;True<br></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;getLockName&nbsp;(self,&nbsp;tile):<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;">return</span><span style="color: #000000;">&nbsp;self.getKey(tile)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">.lck</span><span style="color: #800000;">"</span><span style="color: #000000;"><br></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;getKey&nbsp;(self,&nbsp;tile):<br></span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">raise</span><span style="color: #000000;">&nbsp;NotImplementedError()<br></span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;attemptLock&nbsp;(self,&nbsp;tile):<br></span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">raise</span><span style="color: #000000;">&nbsp;NotImplementedError()<br></span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;unlock&nbsp;(self,&nbsp;tile):<br></span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">raise</span><span style="color: #000000;">&nbsp;NotImplementedError()<br></span><span style="color: #008080;">32</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">33</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;get&nbsp;(self,&nbsp;tile):<br></span><span style="color: #008080;">34</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">raise</span><span style="color: #000000;">&nbsp;NotImplementedError()<br></span><span style="color: #008080;">35</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">36</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;set&nbsp;(self,&nbsp;tile,&nbsp;data):<br></span><span style="color: #008080;">37</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">raise</span><span style="color: #000000;">&nbsp;NotImplementedError()<br></span><span style="color: #008080;">38</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">39</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;delete(self,&nbsp;tile):<br></span><span style="color: #008080;">40</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">raise</span><span style="color: #000000;">&nbsp;NotImplementedError()</span></div>
接口够简单了吧 ，最主要的实现的 是get,set,getKey这3个主要接口<br>tilecache.cfg的Cache.type设置为DB_POSTGRES<br><br><br><br><br><img src ="http://www.cppblog.com/socketref/aggbug/112600.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-14 23:47 <a href="http://www.cppblog.com/socketref/archive/2010/04/14/112600.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>地图处理小结_tilecache_openlayers_geoserver</title><link>http://www.cppblog.com/socketref/archive/2010/04/12/112293.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Mon, 12 Apr 2010 02:37:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2010/04/12/112293.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/112293.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2010/04/12/112293.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/112293.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/112293.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset="utf-8"">
<meta name="ProgId" content="Word.Document">
<meta name="Generator" content="Microsoft Word 11">
<meta name="Originator" content="Microsoft Word 11">
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"><o:smarttagtype namespaceuri="urn:schemas-microsoft-com:office:smarttags" name="chsdate"></o:smarttagtype><!--[if gte mso 9]><xml>
<w:worddocument>
<w:view>Normal</w:view>
<w:zoom>0</w:zoom>
<w:punctuationkerning/>
<w:drawinggridverticalspacing>7.8 磅</w:drawinggridverticalspacing>
<w:displayhorizontaldrawinggridevery>0</w:displayhorizontaldrawinggridevery>
<w:displayverticaldrawinggridevery>2</w:displayverticaldrawinggridevery>
<w:validateagainstschemas/>
<w:saveifxmlinvalid>false</w:saveifxmlinvalid>
<w:ignoremixedcontent>false</w:ignoremixedcontent>
<w:alwaysshowplaceholdertext>false</w:alwaysshowplaceholdertext>
<w:compatibility>
<w:spaceforul/>
<w:balancesinglebytedoublebytewidth/>
<w:donotleavebackslashalone/>
<w:ultrailspace/>
<w:donotexpandshiftreturn/>
<w:adjustlineheightintable/>
<w:breakwrappedtables/>
<w:snaptogridincell/>
<w:wraptextwithpunct/>
<w:useasianbreakrules/>
<w:dontgrowautofit/>
<w:usefelayout/>
</w:compatibility>
<w:browserlevel>MicrosoftInternetExplorer4</w:browserlevel>
</w:worddocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:latentstyles deflockedstate="false" latentstylecount="156">
</w:latentstyles>
</xml><![endif]--><!--[if !mso]><object
classid="clsid:38481807-ca0e-42d2-bf39-b33af135cc4d" id="ieooui"></object>
<style>
st1\:*{behavior:url(#ieooui) }
</style>
<![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
@font-face
{font-family:黑体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimHei;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:1 135135232 16 0 262144 0;}
@font-face
{font-family:"Franklin Gothic Medium";
panose-1:2 11 6 3 2 1 2 2 2 4;
mso-font-charset:0;
mso-generic-font-family:swiss;
mso-font-pitch:variable;
mso-font-signature:647 0 0 0 159 0;}
@font-face
{font-family:Verdana;
panose-1:2 11 6 4 3 5 4 4 2 4;
mso-font-charset:0;
mso-generic-font-family:swiss;
mso-font-pitch:variable;
mso-font-signature:536871559 0 0 0 415 0;}
@font-face
{font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
@font-face
{font-family:"\@黑体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:1 135135232 16 0 262144 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:12.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:宋体;
mso-font-kerning:1.0pt;}
h2
{mso-style-next:正文;
margin-top:13.0pt;
margin-right:0cm;
margin-bottom:13.0pt;
margin-left:0cm;
text-align:justify;
text-justify:inter-ideograph;
line-height:173%;
mso-pagination:lines-together;
page-break-after:avoid;
mso-outline-level:2;
font-size:16.0pt;
font-family:Arial;
mso-fareast-font-family:黑体;
mso-bidi-font-family:"Times New Roman";
mso-font-kerning:1.0pt;}
pre
{margin:0cm;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:宋体;
mso-bidi-font-family:宋体;}
/* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page Section1
{size:595.3pt 841.9pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:42.55pt;
mso-footer-margin:49.6pt;
mso-paper-source:0;
layout-grid:15.6pt;}
div.Section1
{page:Section1;}
/* List Definitions */
@list l0
{mso-list-id:760033398;
mso-list-type:hybrid;
mso-list-template-ids:437031880 -1344083180 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l0:level1
{mso-level-tab-stop:18.0pt;
mso-level-number-position:left;
margin-left:18.0pt;
text-indent:-18.0pt;}
@list l1
{mso-list-id:1801411051;
mso-list-type:hybrid;
mso-list-template-ids:-432114244 -1043271492 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l1:level1
{mso-level-tab-stop:18.0pt;
mso-level-number-position:left;
margin-left:18.0pt;
text-indent:-18.0pt;}
@list l2
{mso-list-id:2126386401;
mso-list-type:hybrid;
mso-list-template-ids:1677230112 1864799760 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l2:level1
{mso-level-tab-stop:18.0pt;
mso-level-number-position:left;
margin-left:18.0pt;
text-indent:-18.0pt;}
ol
{margin-bottom:0cm;}
ul
{margin-bottom:0cm;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
</style>
<![endif]-->
<p class="MsoNormal"><span style="font-family: 宋体;">一下处理过程需要在</span><span lang="EN-US">python2.5</span><span style="font-family: 宋体;">与</span><span lang="EN-US">2.6</span><span style="font-family: 宋体;">之间切换</span></p>
<p class="MsoNormal"><span lang="EN-US">Pgsql<st1:chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on">8.3.5</st1:chsdate></span></p>
<p class="MsoNormal"><span lang="EN-US">postgis1.5</span></p>
<p class="MsoNormal"><span lang="EN-US">tilecache 2.10</span></p>
<p class="MsoNormal"><span lang="EN-US">geoserver2.0</span></p>
<p class="MsoNormal"><span lang="EN-US">openlayers</span></p>
<p class="MsoNormal"><span lang="EN-US">ext-js</span></p>
<p class="MsoNormal"><span lang="EN-US">django</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;<br></o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><!--[if !supportLists]--><span lang="EN-US"><span>1.<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span lang="EN-US">openlayer</span><span style="font-family: 宋体;">显示地图无法显示正确的比例尺</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; color: red;">在访问地图时设置地图显示单位必须为</span><span style="color: red;"> <span lang="EN-US">units:'degrees'<o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="color: red;" lang="EN-US"><o:p>&nbsp;</o:p></span><span lang="EN-US">2. </span><span style="font-family: 宋体;">图层文字标注出现乱码和重复绘制多个相同名称</span></p>
<p class="MsoNormal"><span lang="EN-US">Sld</span><span style="font-family: 宋体;">设置的</span><span lang="EN-US">group=true</span><span style="font-family: 宋体;">似乎没有起作用</span></p>
<pre><span lang="EN-US">layer = new OpenLayers.Layer.WMS( "FirstMap","http://localhost:8080/geoserver/wms",{},<span style="color: red;">{singleTile: true, ratio: 1}</span>)</span></pre>
<p class="MsoNormal"><span style="font-family: 宋体;">必须设置红色部分的参数，能保证文字不被重复显示</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">但是在使用</span><span lang="EN-US">tilecache.py</span><span style="font-family: 宋体;">预缓冲图块时</span><span lang="EN-US">("http://localhost:9000/tilecache/tilecache.py")</span><span style="font-family: 宋体;">，添加了以上红色参数之后导致无法显示地图。</span></p>
<p class="MsoNormal"><span lang="EN-US">SingleTile:true </span><span style="font-family: 宋体;">参数是作为</span><span lang="EN-US">geoserver</span><span style="font-family: 宋体;">的附加属性由</span><span lang="EN-US">openlayer</span><span style="font-family: 宋体;">传递到服务器，</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; color: #3366ff;">所以考虑将此参数通过</span><span style="color: #3366ff;" lang="EN-US">tilecache.cfg</span><span style="font-family: 宋体; color: #3366ff;">传递到</span><span style="color: #3366ff;" lang="EN-US">geoserver</span><span style="font-family: 宋体; color: #3366ff;">是否能够起到相同效果？</span><span style="color: #3366ff;">
<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">发现使用了</span><span lang="EN-US">signleTile</span><span style="font-family: 宋体;">之后，</span><span lang="EN-US">openlayers</span><span style="font-family: 宋体;">将不进行块的缓冲，而是每次请求都到</span><span lang="EN-US">geoserver</span><span style="font-family: 宋体;">上去获取，抓包发现</span><span lang="EN-US">singleTile</span><span style="font-family: 宋体;">开启的话，请求时将不传递</span><span lang="EN-US">width/height</span><span style="font-family: 宋体;">参数，直接请求</span><span lang="EN-US">bbox</span><span style="font-family: 宋体;">大小的地理区域，每次移动地图将重新加载整个区域，效率低下；</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">但是关闭</span><span lang="EN-US">singleTile</span><span style="font-family: 宋体;">的话，依次连续请求多个网格块，默认是</span><span lang="EN-US">256x256,</span><span style="font-family: 宋体;">导致有些图层比如背景层</span><span lang="EN-US">1024</span><span style="font-family: 宋体;">&#215;</span><span lang="EN-US">1024</span><span style="font-family: 宋体;">的话将请求</span><span lang="EN-US">4x4</span><span style="font-family: 宋体;">个网格块，每个块都将绘制背景的文本标识，因为这些块是离散绘制的所以显示在地图上的话将是重复的文本显示出来了，所以避免这个问题只有如下解决：</span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><!--[if !supportLists]--><span lang="EN-US"><span>1.<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span style="font-family: 宋体;">放大网格的大小规格，使一定的地理范围尽可能的处在一个网格内被绘制</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: 宋体; color: red;">目前这种方式似乎是最佳方式，</span><span style="color: red;" lang="EN-US">tilecache </span><span style="font-family: 宋体; color: red;">默认</span><span style="color: red;" lang="EN-US">tile</span><span style="font-family: 宋体; color: red;">规格是</span><span style="color: red;" lang="EN-US">256*256</span><span style="font-family: 宋体; color: red;">，在绘制全国图的时候设置</span><span style="color: red;" lang="EN-US">1024*1024</span><span style="font-family: 宋体; color: red;">方式去请求</span><span style="color: red;" lang="EN-US">geoserver</span><span style="font-family: 宋体; color: red;">，然后使用</span><span style="color: red;" lang="EN-US">split_tile.py</span><span style="font-family: 宋体; color: red;">切割土块即可。</span><span style="color: red;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><!--[if !supportLists]--><span lang="EN-US"><span>2.<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span style="font-family: 宋体;">控制这些层的显示属性，限制只有在某些比例尺时被显示</span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><!--[if !supportLists]--><span lang="EN-US"><span>3.<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span style="font-family: 宋体;">手工编辑地图数据，合并多边形对象，这样就可以防止重复绘制多边形的名称标注，导致一个省份名称绘制多次</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<span lang="EN-US">Tilecache</span><span style="font-family: 宋体;">为了支持</span><span lang="EN-US">apache</span><span style="font-family: 宋体;">访问，必须安装到</span><span lang="EN-US">python/lib/</span><span style="font-family: 宋体;">目录下，并且</span><span lang="EN-US">tilecache.cfg</span><span style="font-family: 宋体;">也在这个安装目录下。</span>
<p class="MsoNormal"><span lang="EN-US">Tilecache.cfg</span><span style="font-family: 宋体;">修改之后必须重新启动</span><span lang="EN-US">apache</span><span style="font-family: 宋体;">服务</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">如果</span><span lang="EN-US">geoserver</span><span style="font-family: 宋体;">实时绘制的话允许同时传递多个层名称给</span><span lang="EN-US">geoserver</span><span style="font-family: 宋体;">进行绘制</span></p>
<div style="border: 1pt solid windowtext; padding: 1pt 4pt; background: none repeat scroll 0% 0% #cccccc;">
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span lang="EN-US">new
OpenLayers.Layer.WMS( "FirstMap",<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>"http://localhost:8080/geoserver/wms",</span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{ layers:&#8217;shanghai,china,&#8230;&#8217;})</span></p>
</div>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体;">如果</span><span lang="EN-US">tilecahce</span><span style="font-family: 宋体;">加载</span><span lang="EN-US">tile</span><span style="font-family: 宋体;">网格块的话，</span><span lang="EN-US">layers</span><span style="font-family: 宋体;">属性不能传递多个图层，因为多个图层就是返回多个</span><span lang="EN-US">tile</span><span style="font-family: 宋体;">块，只有在</span><span lang="EN-US">tilecache.cfg</span><span style="font-family: 宋体;">中配置多个</span><span lang="EN-US">layer</span><span style="font-family: 宋体;">名称</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span lang="EN-US">[east_china]</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span lang="EN-US">type=WMSLayer</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span lang="EN-US">url=http://localhost:8080/geoserver/wms</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span lang="EN-US">layers=shanghai,jiangshu,zejiang</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span lang="EN-US">extension=png</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span lang="EN-US">resolutions=0.17578125,0.087890625,0.0439453125,0.02197265625,0.010986328125,0.0054931640625,0.00274658203125,0.00137329101,0.0006,0.0003,0.00015,0.000075,0.000035,0.000018,0.000009,0.0000045</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span lang="EN-US">bbox=70,10,130,60</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp; <br></o:p></span></p>
<strong><span style="font-size: 16pt; line-height: 173%; font-family: arial;" lang="EN-US"></span></strong><span style="font-family: 黑体;">优化批量自动化绘制地图</span>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><!--[if !supportLists]--><span lang="EN-US"><span>1.<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span lang="EN-US">tilecache_seed.py</span><span style="font-family: 宋体;">提交</span><span lang="EN-US">layers</span><span style="font-family: 宋体;">给</span><span lang="EN-US">geoserver </span><span style="font-family: 宋体;">时，如果提交全国所有</span><span lang="EN-US">layers</span><span style="font-family: 宋体;">，</span><span lang="EN-US">geoserver</span><span style="font-family: 宋体;">将处理每个</span><span lang="EN-US">layer</span><span style="font-family: 宋体;">，即使</span><span lang="EN-US">layer</span><span style="font-family: 宋体;">与当前可见地理区域不想交，但还是会被循环处理；所以必须改写</span><span lang="EN-US">tilecahe_seed.py</span><span style="font-family: 宋体;">程序，检测只有相交的图层传送给</span><span lang="EN-US">geoserver</span><span style="font-family: 宋体;">渲染。</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: 宋体;">改写部分在</span><span lang="EN-US">TileCache/Layers/WMS.py</span><span style="font-family: 宋体;">中，</span></p>
<div style="border: 1pt solid windowtext; padding: 1pt 4pt; background: none repeat scroll 0% 0% silver; margin-left: 18pt; margin-right: 0cm;">
<p class="MsoNormal" style="background: none repeat scroll 0% 0% silver; border: medium none; padding: 0cm;"><span lang="EN-US">def
renderTile(self, tile):</span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% silver; border: medium none; padding: 0cm;"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>wms = WMSClient.WMS( self.url, {</span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% silver; border: medium none; padding: 0cm;"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>"bbox": tile.bbox(),</span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% silver; border: medium none; padding: 0cm;"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>"width": tile.size()[0],</span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% silver; border: medium none; padding: 0cm;"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>"height": tile.size()[1],</span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% silver; border: medium none; padding: 0cm;"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>"srs": self.srs,</span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% silver; border: medium none; padding: 0cm;"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>"format": self.mime_type,</span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% silver; border: medium none; padding: 0cm;"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>"layers": self.layers,</span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% silver; border: medium none; padding: 0cm;"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}, self.user, self.password)</span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% silver; border: medium none; padding: 0cm;"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>tile.data, response = wms.fetch()</span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% silver; border: medium none; padding: 0cm;"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return tile.data</span></p>
</div>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">self.layers</span><span style="font-family: 宋体;">参数就是</span><span lang="EN-US">tilecache.cfg</span><span style="font-family: 宋体;">中参数</span><span lang="EN-US">layers</span><span style="font-family: 宋体;">定义的层列表，所以只需要修改这个参数即可。</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: 宋体;">处理方式：</span>
<span style="font-family: 宋体;">将</span><span lang="EN-US">tile.bbox()</span><span style="font-family: 宋体;">的地理区间与数据库中的省市层最大</span><span lang="EN-US">mbr</span><span style="font-family: 宋体;">进行相交测试，只有相交的才提交给</span><span lang="EN-US">geoserver</span><span style="font-family: 宋体;">进行处理。</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: 宋体;">修改之后</span></p>
<div style="border: 1pt solid windowtext; padding: 1pt 4pt; background: none repeat scroll 0% 0% silver; margin-left: 18pt; margin-right: 0cm;">
<p class="MsoNormal" style="background: none repeat scroll 0% 0% silver; border: medium none; padding: 0cm;"><span style="font-family: 宋体;">测试：</span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% silver; border: medium none; padding: 0cm;"><span style="font-family: 宋体;">将网格规格调整为</span><span lang="EN-US">256*256,</span><span style="font-family: 宋体;">绘制</span><span lang="EN-US">east_china</span><span style="font-family: 宋体;">图层第</span><span lang="EN-US">7</span><span style="font-family: 宋体;">显示级别，花销</span><span lang="EN-US">48</span><span style="font-family: 宋体;">秒</span></p>
</div>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: 宋体;">修改代码如下：</span></p>
<div style="border: 1pt solid windowtext; padding: 1pt 4pt; background: none repeat scroll 0% 0% #cccccc; margin-left: 18pt; margin-right: 0cm;">
<p class="MsoNormal" style="text-indent: 3pt; background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US">def
isIntersect(self,rc1,rc2):<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if rc1[2] &lt; rc2[0] or rc1[3] &lt; rc2[1]
or rc1[0] &gt; rc2[2] or rc1[1] &gt; rc2[3]:<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return False<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return True<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;
</span><o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US">def renderTile(self, tile):<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>import sys,string<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>sys.path.append('c:/')<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>import cities_mbr<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>layers = self.layers.split(',')<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>newLayers=[]<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>for layer in layers:<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>rc = cities_mbr.G_CITIES_MBR[layer]<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>rc2 = tile.bbox().split(',')<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>rc2 = map(float,rc2)<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if self.isIntersect(rc,rc2):<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>newLayers.append(layer)<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>layers = string.join(map(str,newLayers),',')<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if len(newLayers) == 0: #no any
insercted layer<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: red;"><span>&nbsp;</span>layers='china:china_blank_layer'<span>&nbsp; </span>#here i select shanghai as empty city to
fill<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>print layers<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>wms = WMSClient.WMS( self.url, {<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>"bbox": tile.bbox(),<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>"width": tile.size()[0],<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>"height": tile.size()[1],<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>"srs": self.srs,<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>"format": self.mime_type,<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>#"layers": self.layers,<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>"layers": layers,<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}, self.user, self.password)<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>print 'x*'*20<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>print self.url,tile.bbox(),layers<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>#import sys<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>#sys.exit(0);<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>tile.data, response = wms.fetch()<o:p></o:p></span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span style="font-family: &quot;franklin gothic medium&quot;;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return tile.data<o:p></o:p></span></p>
</div>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: 宋体;">注意以上红色代码，当检索不能匹配任何图层时，需要</span><span lang="EN-US">geoserver</span><span style="font-family: 宋体;">返回空白图块，</span><span lang="EN-US">self.layers</span><span style="font-family: 宋体;">必须设置一个数据库中可用的图层名称，这个图层只是为了绘制空白块的，所以可以在</span><span lang="EN-US">postgis</span><span style="font-family: 宋体;">中创建一个</span><span lang="EN-US">point</span><span style="font-family: 宋体;">层即可或者一个空层，然后添加一个远离中国地理区域的一个点即可</span><span lang="EN-US">.</span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><span lang="EN-US"><o:p>&nbsp;</o:p><span>2.<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span style="font-family: 宋体;">显示比例越小的时候，绘制地图需要更多的时间，那是由于显示的越大绘制的图层就越多。</span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span style="font-family: 宋体;">要使多台机器同时分工绘制地图的话，</span>
<span style="font-family: 宋体;">可以按层进行分割处理和划分经纬度的方式进行。前者适用与高比例尺的显示，后者就是小比例尺的显示。</span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span style="font-family: 宋体;">小显示比例时，</span><span lang="EN-US">tilecache</span><span style="font-family: 宋体;">将图层进行网格化处理，由西至东，由下至上。所以提交给处理机器以不同的</span><span lang="EN-US">bbox</span><span style="font-family: 宋体;">即可，处理完成之后再将这些图块重新进行编号即可。（）</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><!--[if !supportLists]--><span lang="EN-US"><span>3.<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span style="font-family: 宋体;">在低缩放比的情况下放大</span><span lang="EN-US">tile</span><span style="font-family: 宋体;">的规格，默认是</span><span lang="EN-US">256</span><span style="font-family: 宋体;">&#215;</span><span lang="EN-US">256</span><span style="font-family: 宋体;">，将其设置为</span><span lang="EN-US">256</span><span style="font-family: 宋体;">&#215;</span><span lang="EN-US">n</span><span style="font-family: 宋体;">大小，这样可以提高每次请求的效率，之后再将图块切割为</span><span lang="EN-US">256</span><span style="font-family: 宋体;">&#215;</span><span lang="EN-US">256</span><span style="font-family: 宋体;">大小的</span><span lang="EN-US">png</span><span style="font-family: 宋体;">图块。</span> <span style="font-family: 宋体;">这就要求</span><span lang="EN-US">geoserver</span><span style="font-family: 宋体;">的</span><span lang="EN-US">sld</span><span style="font-family: 宋体;">关闭</span><span lang="EN-US">
&lt;vendor-group&gt;true&lt;/vendor-group&gt;</span><span style="font-family: 宋体;">开关</span></p>
<div style="border: 1pt solid windowtext; padding: 1pt 4pt; background: none repeat scroll 0% 0% silver; margin-left: 18pt; margin-right: 0cm;">
<p class="MsoNormal" style="background: none repeat scroll 0% 0% silver; border: medium none; padding: 0cm;"><span style="font-family: 宋体;">测试：</span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% silver; border: medium none; padding: 0cm;"><span style="font-family: 宋体;">将网格规格调整为</span><span lang="EN-US">1024*1024,</span><span style="font-family: 宋体;">绘制</span><span lang="EN-US">east_china</span><span style="font-family: 宋体;">图层第</span><span lang="EN-US">7</span><span style="font-family: 宋体;">显示级别，花销</span><span lang="EN-US">30</span><span style="font-family: 宋体;">秒</span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% silver; border: medium none; padding: 0cm;"><span style="font-family: 宋体;">将网格规格调整为</span><span lang="EN-US">256*256,</span><span style="font-family: 宋体;">绘制</span><span lang="EN-US">east_china</span><span style="font-family: 宋体;">图层第</span><span lang="EN-US">7</span><span style="font-family: 宋体;">显示级别，花销</span><span lang="EN-US">200</span><span style="font-family: 宋体;">秒</span></p>
</div>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: 宋体;">图像扩大了</span><span lang="EN-US">16</span><span style="font-family: 宋体;">倍，时间缩短了</span><span lang="EN-US">6</span><span style="font-family: 宋体;">倍</span> </p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: 宋体;">大图块产生之后切割为小图块，需要重新索引文件编号。</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: 宋体;">设</span><span lang="EN-US">A</span><span style="font-family: 宋体;">规格图块和</span><span lang="EN-US">B</span><span style="font-family: 宋体;">规格图块</span><span lang="EN-US">(A*4=B)</span><span style="font-family: 宋体;">，如果</span><span lang="EN-US">A</span><span style="font-family: 宋体;">绘制需要产生</span><span lang="EN-US">400</span><span style="font-family: 宋体;">列</span><span lang="EN-US">(0-399),400</span><span style="font-family: 宋体;">行</span><span lang="EN-US">(0-399),</span><span style="font-family: 宋体;">那</span><span lang="EN-US">B</span><span style="font-family: 宋体;">只需要产生</span><span lang="EN-US">100</span><span style="font-family: 宋体;">列</span><span lang="EN-US">100</span><span style="font-family: 宋体;">行。</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US"><o:p>&nbsp;<br></o:p></span></p>
<h2><span lang="EN-US">Tilecache</span><span style="font-family: 黑体;">预处理数据存储方式：</span></h2>
<p class="MsoNormal"><span style="font-family: 宋体;">图块数据绘制时按照经度从西到东，维度从南到北的顺序依次绘制出网格图块。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">每一列的图块都创建出一个目录，从下标</span><span lang="EN-US">0</span><span style="font-family: 宋体;">开始。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">绘制方式</span><span lang="EN-US">: </span></p>
<div style="border: 1pt solid windowtext; padding: 1pt 4pt; background: none repeat scroll 0% 0% #cccccc;">
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span lang="EN-US">For(x=0;x&lt;columns;x++){</span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>For(y=0;y&lt;rows;y++){</span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Draw_tile()</span></p>
<p class="MsoNormal" style="text-indent: 21pt; background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span lang="EN-US">}</span></p>
<p class="MsoNormal" style="background: none repeat scroll 0% 0% #cccccc; border: medium none; padding: 0cm;"><span lang="EN-US">}</span></p>
</div>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; color: #3366ff;">层名称</span><span style="font-family: verdana; color: #3366ff;" lang="EN-US">/</span><span style="font-family: 宋体; color: #3366ff;">缩放级别</span><span style="font-family: verdana; color: #3366ff;" lang="EN-US">/000/000/</span><span style="font-family: 宋体; color: #3366ff;">列编号</span><span style="font-family: verdana; color: #3366ff;" lang="EN-US">/000/000/</span><span style="font-family: 宋体; color: #3366ff;">行图块文件</span><span style="font-family: verdana; color: #3366ff;" lang="EN-US">.png<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp; </o:p>Tilecache</span><span style="font-family: 宋体;">的数据存储目录在删除时必须注意停止</span><span lang="EN-US">apache</span><span style="font-family: 宋体;">服务</span></p>
<p class="MsoNormal"><span lang="EN-US">Apache</span><span style="font-family: 宋体;">提供</span><span lang="EN-US">tile</span><span style="font-family: 宋体;">服务时将自动使用</span><span lang="EN-US">python2.6</span><span style="font-family: 宋体;">下的</span><span lang="EN-US">tilecache</span><span style="font-family: 宋体;">代码</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">操作数据库是采用的是</span><span lang="EN-US">pgpostgresql,</span><span style="font-family: 宋体;">目前只支持</span><span lang="EN-US">python2.5</span><span style="font-family: 宋体;">，所以必须先注视掉</span><span lang="EN-US">c:/python2.6, </span><span style="font-family: 宋体;">打开</span><span lang="EN-US">c:/python2.5</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp; <br></o:p></span></p><img src ="http://www.cppblog.com/socketref/aggbug/112293.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 10:37 <a href="http://www.cppblog.com/socketref/archive/2010/04/12/112293.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tilecache_切割大图块</title><link>http://www.cppblog.com/socketref/archive/2010/04/12/112292.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Mon, 12 Apr 2010 02:32:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2010/04/12/112292.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/112292.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2010/04/12/112292.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/112292.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/112292.html</trackback:ping><description><![CDATA[在实际的cache生成过程中遇到大地理范围和多显示比例的问题时，生成tile cache的耗时是个头大的问题，越低比例尺的绘制耗时将成几何倍数上升，如果要绘制1：1000的全国图的话，完成工作一台主机可能需要几个月的时间，tilecache默认的请求tile规格是256&#215;256，性能实在太低，所以提高每次向geoserver请求图块的规格来稍微提高速度，目前我采用2048&#215;2048。<br>但openlayers里面256&#215;256是最佳的cache规格，所以tilecache产生的tile必须进行切割成256规格<span style="color: #000000;"></span>
<br><br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;-*-&nbsp;coding:utf-8&nbsp;-*-</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;"></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: #008000;"></span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">#</span><span style="color: #008000;">层名称/缩放级别/000/000/列编号/000/000/行图块文件.png</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;sys,&nbsp;traceback,threading,time,struct,os,os.path,shutil,distutils.dir_util,array,base64,zlib<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;PIL,Image<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">g_layerName</span><span style="color: #000000;">=</span><span style="color: #800000;">'</span><span style="color: #800000;">east_china</span><span style="color: #800000;">'</span><span style="color: #000000;"><br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">srcTiles</span><span style="color: #000000;">=</span><span style="color: #000000;">{</span><span style="color: #800000;">'</span><span style="color: #800000;">path</span><span style="color: #800000;">'</span><span style="color: #000000;">:</span><span style="color: #800000;">''</span><span style="color: #000000;">,</span><span style="color: #800000;">'</span><span style="color: #800000;">size</span><span style="color: #800000;">'</span><span style="color: #000000;">:(</span><span style="color: #000000;">1024</span><span style="color: #000000;">,</span><span style="color: #000000;">1024</span><span style="color: #000000;">)}<br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">destTiles</span><span style="color: #000000;">=</span><span style="color: #000000;">{</span><span style="color: #800000;">'</span><span style="color: #800000;">path</span><span style="color: #800000;">'</span><span style="color: #000000;">:</span><span style="color: #800000;">''</span><span style="color: #000000;">,</span><span style="color: #800000;">'</span><span style="color: #800000;">size</span><span style="color: #800000;">'</span><span style="color: #000000;">:(</span><span style="color: #000000;">256</span><span style="color: #000000;">,</span><span style="color: #000000;">256</span><span style="color: #000000;">)}<br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">#</span><span style="color: #008000;">layerName&nbsp;-&nbsp;处理的地图层名，在tilecache.cfg中定义</span><span style="color: #008000;"><br></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #008000;">#</span><span style="color: #008000;">scale&nbsp;-&nbsp;显示级别</span><span style="color: #008000;"><br></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #008000;">#</span><span style="color: #008000;">tileDir&nbsp;-&nbsp;图块存储目录</span><span style="color: #008000;"><br></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #008000;">#</span><span style="color: #008000;">destDir&nbsp;-&nbsp;切割图块存储目录</span><span style="color: #008000;"><br></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #008000;">#</span><span style="color: #008000;">tilesizeFrom&nbsp;-&nbsp;当前图块规格</span><span style="color: #008000;"><br></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #008000;">#</span><span style="color: #008000;">tilesizeTo&nbsp;-&nbsp;目标图块规格</span><span style="color: #008000;"><br></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #008000;">#</span><span style="color: #008000;">注意：&nbsp;维度从下至上递增</span><span style="color: #008000;"><br></span><span style="color: #008080;">22</span>&nbsp;<span style="color: #008000;">#</span><span style="color: #008000;">一个大网格块列切割成多列，行且歌城多行</span><span style="color: #008000;"><br></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #008000;"></span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;splitTile(layerName,scale,tilesDir,destDir,tilesizeFrom</span><span style="color: #000000;">=</span><span style="color: #000000;">(</span><span style="color: #000000;">1024</span><span style="color: #000000;">,</span><span style="color: #000000;">1024</span><span style="color: #000000;">),tilesizeTo</span><span style="color: #000000;">=</span><span style="color: #000000;">(</span><span style="color: #000000;">256</span><span style="color: #000000;">,</span><span style="color: #000000;">256</span><span style="color: #000000;">)):<br></span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;xcols&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;tilesizeFrom[0]</span><span style="color: #000000;">/</span><span style="color: #000000;">tilesizeTo[0]<br></span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;xrows&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;tilesizeFrom[</span><span style="color: #000000;">1</span><span style="color: #000000;">]</span><span style="color: #000000;">/</span><span style="color: #000000;">tilesizeTo[</span><span style="color: #000000;">1</span><span style="color: #000000;">]<br></span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;path2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">%s/%s/%02d/000/000</span><span style="color: #800000;">"</span><span style="color: #000000;">%</span><span style="color: #000000;">(destDir,layerName,scale)<br></span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">not</span><span style="color: #000000;">&nbsp;os.path.exists(path2):<br></span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.makedirs(path2)<br></span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;path1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">%s/%s/%02d/000/000</span><span style="color: #800000;">"</span><span style="color: #000000;">%</span><span style="color: #000000;">(tilesDir,layerName,scale)<br></span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;cols&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;map(int,os.listdir(path1))<br></span><span style="color: #008080;">32</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;col&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;cols:&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">1列要切割成n列</span><span style="color: #008000;"><br></span><span style="color: #008080;">33</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;path1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">%s/%s/%02d/000/000/%02d/000/000</span><span style="color: #800000;">"</span><span style="color: #000000;">%</span><span style="color: #000000;">(tilesDir,layerName,scale,col)<br></span><span style="color: #008080;">34</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;x&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;range(xcols):<br></span><span style="color: #008080;">35</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newcol&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;col</span><span style="color: #000000;">*</span><span style="color: #000000;">xcols&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;x<br></span><span style="color: #008080;">36</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;path2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">%s/%s/%02d/000/000/%02d/000/000</span><span style="color: #800000;">"</span><span style="color: #000000;">%</span><span style="color: #000000;">(destDir,layerName,scale,newcol)&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">大土快可以切割成多列</span><span style="color: #008000;"><br></span><span style="color: #008080;">37</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">not</span><span style="color: #000000;">&nbsp;os.path.exists(path2):<br></span><span style="color: #008080;">38</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.makedirs(path2)<br></span><span style="color: #008080;">39</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;">print&nbsp;path1</span><span style="color: #008000;"><br></span><span style="color: #008080;">40</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;files&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;os.listdir(path1)&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">list&nbsp;columns</span><span style="color: #008000;"><br></span><span style="color: #008080;">41</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;file&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;files:<br></span><span style="color: #008080;">42</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name,ext&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;file.split(</span><span style="color: #800000;">'</span><span style="color: #800000;">.</span><span style="color: #800000;">'</span><span style="color: #000000;">)<br></span><span style="color: #008080;">43</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;path3&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">%s/%s/%02d/000/000/%02d/000/000/%s</span><span style="color: #800000;">"</span><span style="color: #000000;">%</span><span style="color: #000000;">(tilesDir,layerName,scale,col,file)&nbsp;</span><span style="color: #008000;">#<br></span><span style="color: #008080;">44</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;img&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Image.open(path3)<br></span><span style="color: #008080;">45</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">46</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rows&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;range(xrows)<br></span><span style="color: #008080;">47</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rows.reverse()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">48</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;">for</span><span style="color: #000000;">&nbsp;y&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;rows:&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;">49</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;box&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(x</span><span style="color: #000000;">*</span><span style="color: #000000;">tilesizeTo[0],y</span><span style="color: #000000;">*</span><span style="color: #000000;">tilesizeTo[</span><span style="color: #000000;">1</span><span style="color: #000000;">],(x</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">)</span><span style="color: #000000;">*</span><span style="color: #000000;">tilesizeTo[0],(y</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">)</span><span style="color: #000000;">*</span><span style="color: #000000;">tilesizeTo[</span><span style="color: #000000;">1</span><span style="color: #000000;">])<br></span><span style="color: #008080;">50</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: #008000;">#</span><span style="color: #008000;">print&nbsp;box</span><span style="color: #008000;"><br></span><span style="color: #008080;">51</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newimg&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;img.crop(box)<br></span><span style="color: #008080;">52</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;y&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;int(name)</span><span style="color: #000000;">*</span><span style="color: #000000;">xrows&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;xrows&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;y&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;"><br></span><span style="color: #008080;">53</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><span style="color: #000000;">&nbsp;x,y<br></span><span style="color: #008080;">54</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;path2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">%s/%s/%02d/000/000/%02d/000/000/%02d.png</span><span style="color: #800000;">"</span><span style="color: #000000;">%</span><span style="color: #000000;">(destDir,layerName,scale,newcol,y)&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">注意产生的文件编号的数值宽度</span><span style="color: #008000;"><br></span><span style="color: #008080;">55</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newimg.save(path2)<br></span><span style="color: #008080;">56</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">57</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;test(</span><span style="color: #000000;">*</span><span style="color: #000000;">a,</span><span style="color: #000000;">**</span><span style="color: #000000;">b):<br></span><span style="color: #008080;">58</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;len(a),b<br></span><span style="color: #008080;">59</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">#</span><span style="color: #008000;">test(1,2,3,k=100)</span><span style="color: #008000;"><br></span><span style="color: #008080;">60</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;"><br></span><span style="color: #008080;">61</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">__name__</span><span style="color: #000000;">==</span><span style="color: #800000;">'</span><span style="color: #800000;">__main__</span><span style="color: #800000;">'</span><span style="color: #000000;">:<br></span><span style="color: #008080;">62</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;splitTile(</span><span style="color: #800000;">'</span><span style="color: #800000;">layer1</span><span style="color: #800000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #800000;">'</span><span style="color: #800000;">E:/NewGis/trunk/python/tile1</span><span style="color: #800000;">'</span><span style="color: #000000;">,</span><span style="color: #800000;">'</span><span style="color: #800000;">E:/NewGis/trunk/python/tile2</span><span style="color: #800000;">'</span><span style="color: #000000;">,(</span><span style="color: #000000;">512</span><span style="color: #000000;">,</span><span style="color: #000000;">512</span><span style="color: #000000;">),(</span><span style="color: #000000;">32</span><span style="color: #000000;">,</span><span style="color: #000000;">32</span><span style="color: #000000;">))</span></div>
<br><br><br> <img src ="http://www.cppblog.com/socketref/aggbug/112292.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 10:32 <a href="http://www.cppblog.com/socketref/archive/2010/04/12/112292.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tilecache_计算网格耗时（中国大图，多缩放等级）</title><link>http://www.cppblog.com/socketref/archive/2010/04/12/112291.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Mon, 12 Apr 2010 02:27:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2010/04/12/112291.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/112291.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2010/04/12/112291.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/112291.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/112291.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;-*-&nbsp;coding:utf-8&nbsp;-*-</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;"></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: #008000;"></span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;sys,&nbsp;traceback,threading,time,struct,os,os.path,shutil,distutils.dir_util,array,base64,zlib<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">DPI</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">90.0</span><span style="color: #000000;">&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">每英寸的像素数量</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">METRER_PER_INCH&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2.54</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">100.0</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">每英寸多少米</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">PIXEL_WIDTH&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;METRER_PER_INCH&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;DPI&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">每个象素多少米</span><span style="color: #008000;"><br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;"><br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">METERS_PER_DEGREE&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1862</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">60</span><span style="color: #000000;"><br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">SCALE&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">100000</span><span style="color: #000000;">&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">缩放比</span><span style="color: #008000;"><br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;"><br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">GEO_RECT&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">70</span><span style="color: #000000;">,</span><span style="color: #000000;">10</span><span style="color: #000000;">,</span><span style="color: #000000;">134</span><span style="color: #000000;">,</span><span style="color: #000000;">60</span><span style="color: #000000;">)<br></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">w&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(GEO_RECT[</span><span style="color: #000000;">2</span><span style="color: #000000;">]</span><span style="color: #000000;">-</span><span style="color: #000000;">GEO_RECT[0])&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;METERS_PER_DEGREE<br></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">h&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(GEO_RECT[</span><span style="color: #000000;">3</span><span style="color: #000000;">]</span><span style="color: #000000;">-</span><span style="color: #000000;">GEO_RECT[</span><span style="color: #000000;">1</span><span style="color: #000000;">])&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;METERS_PER_DEGREE<br></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">TILE_WIDTH&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1024</span><span style="color: #000000;">*</span><span style="color: #000000;">4</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">图块规格</span><span style="color: #008000;"><br></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">TILE_HEIGHT&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;TILE_WIDTH<br></span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">RENDER_TILE_TIME&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">ynum&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;h&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;(TILE_HEIGHT</span><span style="color: #000000;">*</span><span style="color: #000000;">PIXEL_WIDTH</span><span style="color: #000000;">*</span><span style="color: #000000;">SCALE)&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;SCALE&nbsp;缩放比例下tile规格的数量</span><span style="color: #008000;"><br></span><span style="color: #008080;">26</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">xnum&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;w&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">(TILE_WIDTH</span><span style="color: #000000;">*</span><span style="color: #000000;">PIXEL_WIDTH</span><span style="color: #000000;">*</span><span style="color: #000000;">SCALE)&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;tile的列数量</span><span style="color: #008000;"><br></span><span style="color: #008080;">27</span>&nbsp;<span style="color: #008000;"></span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">scale:%s,tiles(%s,%s)</span><span style="color: #800000;">"</span><span style="color: #000000;">%</span><span style="color: #000000;">(SCALE,int(xnum),int(ynum))<br></span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;u</span><span style="color: #800000;">"</span><span style="color: #800000;">总图块数量:</span><span style="color: #800000;">"</span><span style="color: #000000;">,xnum</span><span style="color: #000000;">*</span><span style="color: #000000;">ynum,u</span><span style="color: #800000;">"</span><span style="color: #800000;">消耗时长</span><span style="color: #800000;">"</span><span style="color: #000000;">,xnum</span><span style="color: #000000;">*</span><span style="color: #000000;">ynum</span><span style="color: #000000;">*</span><span style="color: #000000;">RENDER_TILE_TIME</span><span style="color: #000000;">/</span><span style="color: #000000;">3600.0</span><span style="color: #000000;">,u</span><span style="color: #800000;">"</span><span style="color: #800000;">小时(每图块耗时%s秒)</span><span style="color: #800000;">"</span><span style="color: #000000;">%</span><span style="color: #000000;">RENDER_TILE_TIME<br></span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">#</span><span style="color: #008000;">-----------------------------------------</span><span style="color: #008000;"><br></span><span style="color: #008080;">31</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">RESOLUTION&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0.000018</span><span style="color: #000000;">&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">显示精度&nbsp;每像素多少度</span><span style="color: #008000;"><br></span><span style="color: #008080;">32</span>&nbsp;<span style="color: #008000;">#</span><span style="color: #008000;">RESOLUTION&nbsp;=&nbsp;0.0003&nbsp;#显示精度&nbsp;每像素多少度</span><span style="color: #008000;"><br></span><span style="color: #008080;">33</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">SCALE&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;RESOLUTION&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;METERS_PER_DEGREE&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;PIXEL_WIDTH&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">计算显示比例</span><span style="color: #008000;"><br></span><span style="color: #008080;">34</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">ynum&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;h&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;(TILE_HEIGHT</span><span style="color: #000000;">*</span><span style="color: #000000;">PIXEL_WIDTH</span><span style="color: #000000;">*</span><span style="color: #000000;">SCALE)&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;SCALE&nbsp;缩放比例下tile规格的数量</span><span style="color: #008000;"><br></span><span style="color: #008080;">35</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">xnum&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;w&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">(TILE_WIDTH</span><span style="color: #000000;">*</span><span style="color: #000000;">PIXEL_WIDTH</span><span style="color: #000000;">*</span><span style="color: #000000;">SCALE)&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;tile的列数量</span><span style="color: #008000;"><br></span><span style="color: #008080;">36</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">ynum&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;int(ynum)<br></span><span style="color: #008080;">37</span>&nbsp;<span style="color: #000000;">xnum&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;int(xnum)<br></span><span style="color: #008080;">38</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;xnum,ynum,&nbsp;TILE_WIDTH</span><span style="color: #000000;">*</span><span style="color: #000000;">PIXEL_WIDTH</span><span style="color: #000000;">*</span><span style="color: #000000;">SCALE&nbsp;<br></span><span style="color: #008080;">39</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;str(RESOLUTION),</span><span style="color: #800000;">"</span><span style="color: #800000;">scale:%s,tiles(%s,%s)</span><span style="color: #800000;">"</span><span style="color: #000000;">%</span><span style="color: #000000;">(SCALE,int(xnum),int(ynum))<br></span><span style="color: #008080;">40</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">41</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;u</span><span style="color: #800000;">"</span><span style="color: #800000;">总图块数量:</span><span style="color: #800000;">"</span><span style="color: #000000;">,xnum</span><span style="color: #000000;">*</span><span style="color: #000000;">ynum,u</span><span style="color: #800000;">"</span><span style="color: #800000;">消耗时长</span><span style="color: #800000;">"</span><span style="color: #000000;">,xnum</span><span style="color: #000000;">*</span><span style="color: #000000;">ynum</span><span style="color: #000000;">*</span><span style="color: #000000;">RENDER_TILE_TIME</span><span style="color: #000000;">/</span><span style="color: #000000;">3600.0</span><span style="color: #000000;">,u</span><span style="color: #800000;">"</span><span style="color: #800000;">小时(每图块耗时%s秒)</span><span style="color: #800000;">"</span><span style="color: #000000;">%</span><span style="color: #000000;">RENDER_TILE_TIME<br></span><span style="color: #008080;">42</span>&nbsp;<span style="color: #000000;"></span></div>
<br><img src ="http://www.cppblog.com/socketref/aggbug/112291.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 10:27 <a href="http://www.cppblog.com/socketref/archive/2010/04/12/112291.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebGis::数据处理</title><link>http://www.cppblog.com/socketref/archive/2010/02/07/107423.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Sun, 07 Feb 2010 02:52:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2010/02/07/107423.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/107423.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2010/02/07/107423.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/107423.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/107423.html</trackback:ping><description><![CDATA[手头一份08年的mapinfo格式中国全图，容量10G<br>去年3个月时间启动swMap开发计划，就是使用这份地图，目的是重新设计地图引擎，考虑支持嵌入式环境，桌面和web地图的需求，<br>开发语言c++，地图处理采用python+postgis<br>python现在成了手头开发、管理、协作的第一号助手，几乎没有特定要求的需求全部采用python<br><br>在家干了半年的工作成果和流程:<br>1. tab2tab : 将 mif转换成tab文件<br>2. ogr2gr 将tab转换成shp<br>3. arcgis9.1对shp进行验证和修复，这一步非常重要，在之后采用geos进行集合计算时，如果错误的图元导致很多操作的失败<br>4. shp2pgsql,psql 将shp导入postgis数据库<br>5. python对数据进行过滤，修正，裁剪<br>6. python加工地图数据存储到自己设计的地图存储文件中（网格存储）<br>7. wxwidgets开发地图渲染服务器，提供web、ice、socket访问接口，并实现wms，wfs一些基本协议功能<br>8. 开发前端flex地图显示组件，类似google map flex一样提供cache buffered功能，使地图显示来得更平滑<br>9. openlayers开发展示前端，通过wms访问swMapserver<br>10.最终叠加不同的应用，jquery/django/pgsql开发webservice应用<br><br>至今未加入消锯齿、Halo等绘制效果，绘制道路还有不太美观，实在是没时间<br>计划增加远程视频<br><br> <img src ="http://www.cppblog.com/socketref/aggbug/107423.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-07 10:52 <a href="http://www.cppblog.com/socketref/archive/2010/02/07/107423.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>地图比例计算</title><link>http://www.cppblog.com/socketref/archive/2009/09/26/97269.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Fri, 25 Sep 2009 21:45:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2009/09/26/97269.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/97269.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2009/09/26/97269.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/97269.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/97269.html</trackback:ping><description><![CDATA[<br>地图比例表：<br>G_SCALE_UNITS=[ 0.200000,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 0.600000,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 1.000000,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 2.000000,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 4.000000,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 8.000000,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 15.000000,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 30.000000,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 60.000000,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 120.000000,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 300.000000,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 600.000000,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 1200.000000,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 2000.000000,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 3000.000000,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 5000.000000]<br>表示 1个像素代表0.2米<br>屏幕通常的DPI 是每英寸 96像素<br>每英寸 2.54厘米<br>这样就能换算出显示比例了:&nbsp; 0.2*100/2.54*96 = 755.9 = 756<br>也就是显示比例是 1:756<br><br><br><img src ="http://www.cppblog.com/socketref/aggbug/97269.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2009-09-26 05:45 <a href="http://www.cppblog.com/socketref/archive/2009/09/26/97269.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>地图路名的计算绘制</title><link>http://www.cppblog.com/socketref/archive/2009/09/25/97191.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Thu, 24 Sep 2009 19:09:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2009/09/25/97191.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/97191.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2009/09/25/97191.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/97191.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/97191.html</trackback:ping><description><![CDATA[打开google，照抄他的绘制风格，没有启用小锯齿功能，所以画出来也是比较难看<br>基本完成了道路的曲线绘制<br><br>google的Skia看了看，似乎比cario更轻量级，不过文档也是只能通过doxygen来看了，资料还是太少，还是用cairo来小锯齿吧<br><img alt="" src="http://www.cppblog.com/images/cppblog_com/socketref/road_draw.jpg" width="600" height="500"><br>选择一个好的字体也许效果会好很多<br><img alt=""  src="http://www.cppblog.com/images/cppblog_com/socketref/road_draw2.jpg" width="600" height="500"><br>等着下一版本的优化结果<br><br><br> <img src ="http://www.cppblog.com/socketref/aggbug/97191.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2009-09-25 03:09 <a href="http://www.cppblog.com/socketref/archive/2009/09/25/97191.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>