一级a性色生活片久久无少妇一级婬片免费放 ,久久精品无码专区免费青青,国产精品无码久久久久久http://www.shnenglu.com/socketref/category/7484.htmlgis,mouse,luolasizh-cnSat, 31 Aug 2013 08:52:44 GMTSat, 31 Aug 2013 08:52:44 GMT60移植地圖繪制引擎從Qt切換到Cairohttp://www.shnenglu.com/socketref/archive/2013/08/31/202891.html放屁阿狗 放屁阿狗 Sat, 31 Aug 2013 07:39:00 GMThttp://www.shnenglu.com/socketref/archive/2013/08/31/202891.htmlhttp://www.shnenglu.com/socketref/comments/202891.htmlhttp://www.shnenglu.com/socketref/archive/2013/08/31/202891.html#Feedback0http://www.shnenglu.com/socketref/comments/commentRss/202891.htmlhttp://www.shnenglu.com/socketref/services/trackbacks/202891.html地圖Render部分采用的是Qt,所以過程非常順利,用Eclipse+CDT重建工程,略微幾個小改動便完成了移植。
但之后發現了Qt帶來的問題了,地圖繪制引擎支持并發處理多個繪制請求,不同的繪制請求將在不同的線程Thread中被執行,多線程的情況便出現了問題,提示QPixmap不能在非UI線程被構造,如果強行構造,便出現了內存數據訪問違例的異常錯誤,進程直接coredump,這個問題困擾了一些時間;
之后改了改代碼,將數據處理和繪制代碼隔離開,線程thread中進行數據加載、分析、計算,繪制代碼采用Qt的signal/slot機制完成,就是工作線程處理好數據之后通過emit signal將繪制請求發送給ui主線程的slot處理函數。這種實現方法的問題在于繪制工作都將被串行執行,性能下降。
幾年前在移植libsvg到wince時采用過cairo( cairographices.org) ,有點使用經驗,且cairo是gnome的標準圖形庫,性能應該不錯,所以直接改為cairo。
cairomm是cairo的c++包裝,編譯還需sig++,cairo的api還是挺豐富的,字體,反走樣,矩陣... 操作也是相當簡單 
很快移植完成,運行效果還是比較滿意,現在正考慮地圖引擎移植到ios設備,目前需要琢磨cairomm,sig++,pixmap之類的東西如何移植問題(或者直接采用ios的Fundation的繪圖api)



放屁阿狗 2013-08-31 15:39 發表評論
]]>
實現gps坐標地址解析http://www.shnenglu.com/socketref/archive/2012/07/07/181998.html放屁阿狗 放屁阿狗 Fri, 06 Jul 2012 18:26:00 GMThttp://www.shnenglu.com/socketref/archive/2012/07/07/181998.htmlhttp://www.shnenglu.com/socketref/comments/181998.htmlhttp://www.shnenglu.com/socketref/archive/2012/07/07/181998.html#Feedback1http://www.shnenglu.com/socketref/comments/commentRss/181998.htmlhttp://www.shnenglu.com/socketref/services/trackbacks/181998.html例如: (x,y) => 虹梅路2007號 宜山路200號 蘇寧電器正南方向300米

當然數據必須要有,包括 poi和道路數據
為了實現快速檢索,將feature數據進行分幅存儲,把全國地圖進行切割成固定網格大小,并將不同層feature存儲這個網格內
切割存儲feature到網格,實現的方法很多:
 postgis , oracle sde ,arcgis sde , osge算法庫,ogr....
我采用postgis將切割的feature放入數據表,建立好相關索引
輸入gps坐標,先轉換成地圖坐標,然后檢索出以地圖坐標為中心的九宮格地理網格,然后在這些網格內計算不同的feature與當前gps坐標的位置描述

例如: 輸入 121.20,31.20
返回 :
上海旺而固實業有限公司    71.6009040754    165.190566006 degree正北方
上海起帆電纜有限公司    77.4887765243    168.290539492 degree正北方
塔星集團新塔星石材    78.9584224298    161.627196901 degree正北方
上海大寶化工制品有限公司    87.7190868822    151.671844699 degree東北方
第二個參數是距離(米) ,第三個為兩點之間的夾角,最后一個表示方位

  1 #計算點a,b,c的夾角
  2 def abc_angle(a,b,c):
  3     ba= Vector2.from_points(b,a)
  4     bc = Vector2.from_points(b,c)
  5     #點乘計算夾角
  6     dot = (ba[0]*bc[0]+ba[1]*bc[1] )
  7     x =  dot/ (ba.get_magnitude()*bc.get_magnitude() )
  8     angle =  (math.acos(x) / math.pi) * 180
  9     return angle
 10 
 11 #print abc_angle(b,a,c)
 12 
 13 
 14 def whereis(p1,p2):
 15     '''
 16         判別p2所處p1的方向位置
 17     '''
 18     txt=''
 19     a,b,c = (p1[0],0),p1,p2
 20     a =  abc_angle(a,b,c)
 21     if a <= 20:
 22         txt=u'正南方'
 23     elif a>=160:
 24         txt = u'正北方'
 25     elif a>20 and a<=70:
 26         if p2[0] <= p1[0]:
 27             txt =u'西南方'
 28         else:
 29             txt = u'東南方'
 30     elif a>=70 and a<=110:
 31         if p2[0] <= p1[0]:
 32             txt = u'正西方'
 33         else:
 34             txt = u'正東方'
 35     else:
 36         if p2[0] <= p1[0]:
 37             txt = u'西北方'
 38         else:
 39             txt = u'東北方'
 40     return a,txt
 41 
 42 '''
 43 設定查找九宮格,xy位置處于MIDDLE_CENTER
 44 select name,st_distance(ST_MAKEPOINT(121.2,31.2),the_geom) as dist , * from data_c31_point order by dist limit 100;
 45 
 46 cast(x'fff' as int)
 47 
 48 select distinct(layerid),count(*) from data_c31_point group by layerid
 49 '''
 50 def searchPoints(xy,layers):
 51     '''
 52         xy - (lon,lat) gps坐標點
 53         layers - ()  查詢的層編號列表
 54     '''
 55     xy = point_g2m(xy[0],xy[1])
 56     bid = breadth.getBreadthId(xy)
 57     x = breadth.getX(bid)
 58     y = breadth.getY(bid)
 59     xx = x-1,x+1
 60     yy = y-1,y+1 #在9個網格內檢索
 61     layers = ','.join(map(str,layers))
 62 
 63     sql ='''
 64         select st_x(the_geom) as x,st_y(the_geom) as y,name,st_distance(ST_MAKEPOINT(%s,%s),the_geom) as dist
 65         from data_c31_point
 66         where
 67         layerid in ( %s )
 68         and
 69         ( (bid>>12) &4095 ) >=%s
 70         and
 71         ( (bid>>12) &4095 ) <=%s
 72         and
 73         ( bid&4095 ) >=%s
 74         and
 75         ( bid&4095 ) <=%s
 76         order by dist
 77         limit 100;
 78         '''%(xy[0],xy[1],layers,xx[0],xx[1],yy[0],yy[1])
 79 
 80     #print sql
 81 
 82     '''
 83     不同層檢索出的poi要選擇性的輸出
 84     計算每個點處于輸入gps坐標的方向: 正南,東南. + 距離
 85     '''
 86     db = getDBConn()
 87     cr = db.cursor()
 88     cr.execute(sql)
 89     rs=[]
 90     while True:
 91         r = dbconn.fetchoneDict(cr)
 92         if not r:
 93             break
 94         a,postxt = whereis((r['x'],r['y']),xy)  #gps坐標處于地理poi的方位
 95         rs.append([r['name'],r['dist'],postxt,a] )
 96     return rs
 97 
 98 if __name__=='__main__':
 99     rs = searchPoints((121.20,31.2),range(17,22))
100     f = open('geotxt.txt','w')
101     for r in rs:
102         f.write(r[0].decode('utf8').encode('gbk'))
103         f.write('    %s    %s degree'%(r[1]*1000*11,r[3]))
104         f.write(r[2].encode('gbk'))
105         f.write('\n')
106         #print r[0].decode('utf8').encode('gbk')
107     f.close()


放屁阿狗 2012-07-07 02:26 發表評論
]]>
從openscales到高德mapabc地圖apihttp://www.shnenglu.com/socketref/archive/2012/07/07/181987.html放屁阿狗 放屁阿狗 Fri, 06 Jul 2012 16:51:00 GMThttp://www.shnenglu.com/socketref/archive/2012/07/07/181987.htmlhttp://www.shnenglu.com/socketref/comments/181987.htmlhttp://www.shnenglu.com/socketref/archive/2012/07/07/181987.html#Feedback0http://www.shnenglu.com/socketref/comments/commentRss/181987.htmlhttp://www.shnenglu.com/socketref/services/trackbacks/181987.html已經實現了多個版本的地圖數據處理,包括 高德數據、四維數據從shp編譯成物理格式供渲染服務使用,這個過程復雜且費事
比較了mapabc的地圖,作為成熟的商業公司的產品,當然團隊多年積累的東西定是我一個人做的不能比擬的,渲染方面在大比例顯示處理的比自己好很多,主要自己沒有過多時間投入進去,在做完自己的地圖版本之后(sw2us.com/gps)考慮接入高德web地圖(sw2us.com/newgps)

以下對mapabc使用的經驗有感
我的應用采用flex技術,之前自己的地圖加載采用opensacles,到mapabc了便要換成高德的展示客戶端了

高德發布的最新flex sdk 2.4版本,可以訪問 code.mapabc.com,搞笑的是網站的鏈接缺只能下載2.3.3版本的sdk
高德官網的很多支持方式比較滑稽,根本不能提供任何幫助,QQ討論區每一個能加入的;bbs論壇根本沒人維護,回答問題沒有解答,這方面做的還是比較差的。
花了2天便完成了地圖遷移工作,還是主要是我的應用簡單的緣故吧!
mapabc的api分公眾版本和企業版本,兩個版本差異很大,曾經以客戶名義聯系高德銷售,提供給我的一份sdk文檔與官網的文檔版本和內容差異很大,公眾版本除了能顯示基礎底圖之外,基本不具備其他令我滿意的設施,提供的api也不敬人意。在我遷移openscales代碼為高德sdk時碰到了很多問題。

--公眾版不具有gps到map坐標的轉換功能
--不具有地址解析功能(gps到文本地址),不能使用poi檢索功能
--訪問次數限制
--顯示層級限制,不能更小的比例尺顯示
--高德sdk 很多組件采用flash開發的,所以不能通過flex繼承圖來檢索組件的功能和接口,sdk提供的overlay對象居然沒有getBounds()方法,在處理多個overlap時檢測相交不方便
--沒有layers概念
openscales更像一個gis專業的客戶地圖展示程序,且隨意修改,支持air,我已經部署到iphone和android環境,而高德flex sdk更像一個玩具,一個非專業者使用的玩意兒,某些接口簡單但不夠靈活,且代碼封閉
高德現在成為apple在大陸的地圖數據供應商了,google也許會另擇圖商,也許是四維。apple當然會以3d地圖領航者的角色刮起新的地圖應用旋風,大家都跟著學吧
等我的地圖渲染優化好之后還是會放棄高德的sdk改用自己的地圖技術,當然那些需要付費的功能自己去實現嘍,3d是趨勢,不能讓自己落后了





放屁阿狗 2012-07-07 00:51 發表評論
]]>
Gps監控系統 sw2us.com/gpshttp://www.shnenglu.com/socketref/archive/2012/06/30/180822.html放屁阿狗 放屁阿狗 Fri, 29 Jun 2012 17:24:00 GMThttp://www.shnenglu.com/socketref/archive/2012/06/30/180822.htmlhttp://www.shnenglu.com/socketref/comments/180822.htmlhttp://www.shnenglu.com/socketref/archive/2012/06/30/180822.html#Feedback0http://www.shnenglu.com/socketref/comments/commentRss/180822.htmlhttp://www.shnenglu.com/socketref/services/trackbacks/180822.html
全格Gps2012監控系統
我們是上海全格信息科技公司,我們的團隊以Gis位置服務系統為方向,多年來積累開發了多套Gps定位系統等核心產品,且擁有所有的技術能力和版權。
目前我們正在尋找合作伙伴,我們可以提供系統平臺服務且我們的強項也在于此,也可以做gps運維服務。
如果您用的系統也是同深圳那么多Gps廠家共用的一套系統的話,您可以看看我們的系統,參考一下優缺點。
>我們是掌握最新Gis應用服務的技術開發團隊
>我們擁有非常豐富的Gis開發、應用、實施的經驗和專業的精神
>我們提供.靈活的可配置、擴展的系統平臺,根據客戶需求而定制功能,包括:界面、操作接口、報表或者整合客戶的業務
>我們擁有自主的地圖平臺,提供B/S模式,不采用google,baidu等互聯網地圖,不采用geoserver等開源的地圖,完全我們自己開發的地圖引擎,速度快,效率高,設備運行要求低、靈活可擴展
>我們的監控系統采用flex技術,監控位置和報警完全實時,服務器主動推送gps信息到瀏覽器端,這一點是非flex技術絕不能做到的,所以設備運行狀態實現零延時 
>我們的系統監控終端除了支持pc瀏覽器,還支持 android,iphone等移動終端訪問控制,可進行手機設防、監控軌跡、報警配置等功能,可通過app store和android市場下載安裝
>我們的有5年的Gps監控運營開發的經驗,系統設計容量達2w臺終端設備,與多個公司合作OEM我們的系統和終端產品
~如果您想做Gps監控或者運營,也許您是個人或者是公司老板
~如果您需要更靈活、可控、安全、穩定的GPS監控系統
~如果您的需求規劃是低成本的
~如果您需要部署一整套Gps服務平臺在自己的環境中,而不是又去代理使用他人的Gps運營平臺或者不想花巨資采用 mapabc,mapbar之類的系統
。。。。。
您可以考慮我們的技術方案,我們可以以最優質的服務、最先進的技術、最靈活的合作模式與您實現共贏
請訪問我們的網站: www.sw2us.com      
Gps系統訪問地址: www.sw2us.com/gps
---------------------------------------------------------------------------------------------
上海全格信息科技有限公司
Shanghai Triangle Info Tech Co,Ltd. 
地址: 上海市閔行區立躍路2897號1幢302室  郵編: 201114 
電話:  86-021-34680553     傳真:  86-021-64296802         郵件: service@sw2us.com
移動電話:  13661913244     網址:  http://www.sw2us.com    QQ: 2536588583@qq.com
---------------------------------------------------------------------------------------------


放屁阿狗 2012-06-30 01:24 發表評論
]]>
flex.openscales無法在air顯示地圖http://www.shnenglu.com/socketref/archive/2012/06/12/178584.html放屁阿狗 放屁阿狗 Tue, 12 Jun 2012 15:50:00 GMThttp://www.shnenglu.com/socketref/archive/2012/06/12/178584.htmlhttp://www.shnenglu.com/socketref/comments/178584.htmlhttp://www.shnenglu.com/socketref/archive/2012/06/12/178584.html#Feedback0http://www.shnenglu.com/socketref/comments/commentRss/178584.htmlhttp://www.shnenglu.com/socketref/services/trackbacks/178584.html最近想把應用改到air下跑地圖顯示,結果死活地圖無法加載成功,同樣的代碼,
    <Map id="fxMap" width="400" height="300" resolution="0.001911274412400001"
         center="121.22,31.3" x="51" y="70" >
        <WMSC name="Nasa"
              layers="bluemarble" format="image/jpeg"  version="1.1.1"  url="http://sw2us.com:8001/wms"/>
        <DragHandler/>
        <WheelHandler/>
    </Map>
以上代碼webapp方式可以顯示地圖,但改成air方式不行
以為1.2.1的bug,所以改換openscales的2.0版本,
惡夢來了,2.0與1.2.1版本api變化非常巨大,基本上以前些的代碼都要作廢掉,坑爹啊
耐著性子,看了網上的2.0的api,做了test程序,發現wmsc地圖還是只能顯示在webapp模式下,air還是不行,肯定我哪里沒有琢磨清楚了的緣故。
不過還好,flex builder4.6下開發mobile應用沒有選擇air的提示,直接把wmsc加載成功,phone和android上可以顯示出地圖來,比較暗自高興,
air的其中緣故還得把openscales的代碼翻出來鞭尸一遍才能曉得緣故
很想切換到2.0,畢竟看到了很多api的增強,但是應用代碼做遷移不容易啊,郁悶





放屁阿狗 2012-06-12 23:50 發表評論
]]>
影像管理系統開發告一段落,舒口氣http://www.shnenglu.com/socketref/archive/2012/03/27/169198.html放屁阿狗 放屁阿狗 Tue, 27 Mar 2012 11:23:00 GMThttp://www.shnenglu.com/socketref/archive/2012/03/27/169198.htmlhttp://www.shnenglu.com/socketref/comments/169198.htmlhttp://www.shnenglu.com/socketref/archive/2012/03/27/169198.html#Feedback2http://www.shnenglu.com/socketref/comments/commentRss/169198.htmlhttp://www.shnenglu.com/socketref/services/trackbacks/169198.html系統部署一個stoMaster服務器做控制服務,提供影像系統的讀寫調度分配、系統模塊監控管理、系統影像查詢服務;若干個stoNodeServer作為單點存儲服務器,每個節點服務器下掛載10個2T普通硬盤,單節點支持20T容量,由于采用PC架構,大大節省成本且還能保證一定IO并發能力,保證200T容量需要10臺PC做支撐。
開發涉及技術: python + ffmpeg + flex + openscales + swMapServer + Vs2008 + Qt + postgis + psycopg2 + comtypes
Links: http://sw2us.com/sites/default/files/dvr.demo.v0.1.0_2012.3.27.zip
幸好有了python這個好幫手,不然要干死了,python對我來講不是簡單的當膠水輔助了,通信框架、UI、數據庫都采用python,只有那些個點上用了高效點的c++,例如:ffmpeg解碼、文件存儲等等
演示視頻: 
http://sw2us.com/sites/default/files/flvshow/dvr.demo.html










系統運行demo:








放屁阿狗 2012-03-27 19:23 發表評論
]]>
python編寫網絡通信框架-基于線程的消息傳送http://www.shnenglu.com/socketref/archive/2012/03/08/167450.html放屁阿狗 放屁阿狗 Thu, 08 Mar 2012 15:12:00 GMThttp://www.shnenglu.com/socketref/archive/2012/03/08/167450.htmlhttp://www.shnenglu.com/socketref/comments/167450.htmlhttp://www.shnenglu.com/socketref/archive/2012/03/08/167450.html#Feedback0http://www.shnenglu.com/socketref/comments/commentRss/167450.htmlhttp://www.shnenglu.com/socketref/services/trackbacks/167450.html閱讀全文

放屁阿狗 2012-03-08 23:12 發表評論
]]>
gis:ks102 設備解碼http://www.shnenglu.com/socketref/archive/2012/03/08/167401.html放屁阿狗 放屁阿狗 Thu, 08 Mar 2012 07:23:00 GMThttp://www.shnenglu.com/socketref/archive/2012/03/08/167401.htmlhttp://www.shnenglu.com/socketref/comments/167401.htmlhttp://www.shnenglu.com/socketref/archive/2012/03/08/167401.html#Feedback0http://www.shnenglu.com/socketref/comments/commentRss/167401.htmlhttp://www.shnenglu.com/socketref/services/trackbacks/167401.html  1 # -- coding:utf-8 --  2...  閱讀全文

放屁阿狗 2012-03-08 15:23 發表評論
]]>
gis::ks108設備接入解碼http://www.shnenglu.com/socketref/archive/2012/03/08/167400.html放屁阿狗 放屁阿狗 Thu, 08 Mar 2012 07:20:00 GMThttp://www.shnenglu.com/socketref/archive/2012/03/08/167400.htmlhttp://www.shnenglu.com/socketref/comments/167400.htmlhttp://www.shnenglu.com/socketref/archive/2012/03/08/167400.html#Feedback0http://www.shnenglu.com/socketref/comments/commentRss/167400.htmlhttp://www.shnenglu.com/socketref/services/trackbacks/167400.html  1 # -- coding:utf-8 --  2 #解碼器定...  閱讀全文

放屁阿狗 2012-03-08 15:20 發表評論
]]>
Opensacles::利用網格Tile實現用戶feature加載http://www.shnenglu.com/socketref/archive/2011/10/13/158210.html放屁阿狗 放屁阿狗 Thu, 13 Oct 2011 03:37:00 GMThttp://www.shnenglu.com/socketref/archive/2011/10/13/158210.htmlhttp://www.shnenglu.com/socketref/comments/158210.htmlhttp://www.shnenglu.com/socketref/archive/2011/10/13/158210.html#Feedback0http://www.shnenglu.com/socketref/comments/commentRss/158210.htmlhttp://www.shnenglu.com/socketref/services/trackbacks/158210.html看了一下openscales的代碼,發現tile的申請和釋放并沒有通知到層對象,所以我們不能直接獲取這些事件消息。
wmsc類層次結構: wmsc->wms->Grid->HttpRequest->Layer
Grid類維護了瓦片集合的二維數組,當地圖extent改變時,openscales將掃描Grid的瓦片數組,如果發現有空洞則調用wms的addTile()創建新的tile,如果發現可廢棄tile,則調用Grid.removeExcessTiles()。
addTile()之后openscales將通知layer接收TileEvent.TILE_LOAD_START事件,這個TILE_LOAD_START事件是可以利用的,作為tile加載時的通知事件,在使用的wmsc層時添加一個事件偵聽便可獲取tile加載事件;
ImageTile從Tile派生下來,當Grid作廢無效Tile時,將調用Tile.destroy()方法,所以我在TileEvent添加新事件TILE_DESTROY,在Tile.destroy()通知layer獲取tile銷毀的消息
 1         public function destroy():void {
 2             if (this.layer!=null){
 3                 this.layer.dispatchEvent(new TileEvent(TileEvent.TILE_DESTROY,this));
 4             }
 5             this.layer = null;
 6             this.bounds = null;
 7             this.size = null;
 8             this.position = null;
10         }
修改文件 TileEvent.as,Tile.as
好了,事件接收只需要在Layer的實例添加如下代碼:
addEventListener(TileEvent.TILE_LOAD_START,tileLoadHandler);
addEventListener(TileEvent.TILE_DESTROY,tileDestroyHandler);
TileEvent.tile攜帶了tile的boundle信息可供我們去請求feature對象了



放屁阿狗 2011-10-13 11:37 發表評論
]]>
重新整理2011年地圖數據http://www.shnenglu.com/socketref/archive/2011/08/11/153085.html放屁阿狗 放屁阿狗 Thu, 11 Aug 2011 11:56:00 GMThttp://www.shnenglu.com/socketref/archive/2011/08/11/153085.htmlhttp://www.shnenglu.com/socketref/comments/153085.htmlhttp://www.shnenglu.com/socketref/archive/2011/08/11/153085.html#Feedback2http://www.shnenglu.com/socketref/comments/commentRss/153085.htmlhttp://www.shnenglu.com/socketref/services/trackbacks/153085.html 有問題請大家指正

Either scripts and active content are not permitted to run or Adobe Flash Player version 10.0.0 or greater is not installed.

Get Adobe Flash Player

截圖 :


放屁阿狗 2011-08-11 19:56 發表評論
]]>
swMap的Tile緩沖實現http://www.shnenglu.com/socketref/archive/2011/07/11/150711.html放屁阿狗 放屁阿狗 Mon, 11 Jul 2011 14:34:00 GMThttp://www.shnenglu.com/socketref/archive/2011/07/11/150711.htmlhttp://www.shnenglu.com/socketref/comments/150711.htmlhttp://www.shnenglu.com/socketref/archive/2011/07/11/150711.html#Feedback0http://www.shnenglu.com/socketref/comments/commentRss/150711.htmlhttp://www.shnenglu.com/socketref/services/trackbacks/150711.html 學習過MapGuid,MapServer,Qgis等多種開源地圖處理服務軟件,開發了遵循WMS標準的地圖服務,包括wms接入,地圖渲染服務。
近1年的時間跑的地圖展示都是wms服務器實時請求TileServer進行繪制,Tileserver進程被部署在一臺高端的服務器上,同時啟動了8個服務進程,訪問忙碌的時候機器有點吃不消,就看到cpu那根線飚的很高。
geoserver這個用java做的wms服務器,性能不敢恭維,玩geoserver的時候接觸了tilecahce這個開源軟件,目前跑啥版本就不清楚了,之前將其研究了個明白,知道自己需要的是什么,所以一切還是得自己寫。
對我來講tilecache不實用的原因有多個:
1.支持過多的cahce 存儲方式,什么google的數據庫,oracle的也有,雖然代碼框架的好,但很多東西都不管用,所以代碼維護不夠靈活
2.tilecache通過apache提供web的wms服務,然后tilecahe里再請求后端的geoserver服務,產生的cache根據他定 義的一個網格依次按x,y,z的索引存儲在文件系統里面,并將圖形進行編碼分類。這種實現并沒有問題,但要知道這些cache出來的圖像文件是那么的多且 都零碎,有些圖片還夠不上一個文件系統基本的一個存儲頁大小,所以會大量浪費空間;由于文件零碎且多,移動這些文件也是個相當大的問題,一次為了將這些 cahce tile文件從A機器拷貝到B機器盡然花費了1天的時間。

tilecache有這些不如我意的地方,所以之前自己也考慮再寫一個tilecache的 backend,將渲染出來的東西直接存儲進pgsql數據庫,那以后只要導出數據庫的tablespace就可以了,嗯!的確可行,也跑了一段時間
最后還是決定放棄tilecahce了,畢竟wms自己已經實現了,要再做個backend也是很簡單,做完直接整合進wms服務器。
我考慮采用sqlite來存儲這些瓦片圖形,由于sqlite處理多線程時天性有點問題,多線程不能共享同一個連接(connection),所以實現的時候在每個線程創建了新的連接,開銷是有一些的,那比之前實時請求TileServer要快的多了。
現在wms跑的很開心了,cpu也不忙了,就是累死了硬盤了
一臺機器上渲染的地圖瓦片數據單獨存儲在一個文件里面,要部署到另外一臺機器也很方便了,只需要拷貝一下就可以了
接著看看將這個sqlite換成pgsql,看看性能哪個更強一點
python代碼實現:
 1     def getBitmapTile3(self,renderTile,mapid,res,xy,size):        
 2         if not self.enable:
 3             return None    #表示需要實時請求地圖數據
 4         
 5         tile = None
 6         dbconn = sqlite3.connect(self.dbname)
 7         try:            
 8             #dbconn.text_factory = str
 9             cr = dbconn.cursor()
10             cr.execute('select image from tiles where res=? and x=? and y=?',(res,xy[0],xy[1]))
11             r = cr.fetchone()
12             if not r:
13                 tile = renderTile(mapid,res,xy,size)
14                 if tile and tile.pixmap:
15                     b = sqlite3.Binary(tile.pixmap)
16                     print '*'*20
17                     cr.execute(u'insert into tiles (res,x,y,z,image) values(?,?,?,?,?)',(res,xy[0],xy[1],0,b))                    
18             else:
19                 tile = r[0]
20                 self.cacheshooted+=1
21                 print 'shooted ',self.cacheshooted
22         except:            
23             traceback.print_exc()
24             tile = None
25         dbconn.commit()
26         return tile
27 

記得空的時候在flex端寫個自動跑地圖的程序,不能讓機器閑著,沒事的時候把全國地圖的瓦片自動產生一下,免得在訪問地圖系統的時候再去產生瓦片!











放屁阿狗 2011-07-11 22:34 發表評論
]]>
火星坐標http://www.shnenglu.com/socketref/archive/2011/06/29/149713.html放屁阿狗 放屁阿狗 Wed, 29 Jun 2011 02:13:00 GMThttp://www.shnenglu.com/socketref/archive/2011/06/29/149713.htmlhttp://www.shnenglu.com/socketref/comments/149713.htmlhttp://www.shnenglu.com/socketref/archive/2011/06/29/149713.html#Feedback0http://www.shnenglu.com/socketref/comments/commentRss/149713.htmlhttp://www.shnenglu.com/socketref/services/trackbacks/149713.html

中國特色 火星坐標

轉載


http://www.unistrong.com/bbs/topic.aspx?topicid=2774
http://www.foooooot.com/club/4/topic/740/

我們平時用到的地球坐標系統,叫做WGS84坐標,國家保密插件,也叫做加密插件或者加偏或者SM模組,其實就是對真實坐標系統進行人為的加偏處理,按照 幾行代碼的算法,將真實的坐標加密成虛假的坐標,而這個加偏并不是線性的加偏,所以各地的偏移情況都會有所不同。而加密后的坐標也常被人稱為火星坐標系 統,這是我們的國家又一個偉大的發明,讓國外的政府和企業等,都看不懂我們的坐標系統。

其實很少有人知道國家保密插件問題,但作為導航電子地圖產業或者汽車導航產業中的人,多多少少都會了解到這個問題。國家是出于國家安全考慮,將我們看到的 真實的坐標變成假的虛擬的坐標,這樣,我們的國家就安全了,不會被恐怖分子破壞了。最簡單的舉例來說,比如鳥巢吧,你真實的坐標是這個,加密后就成了那 個,導航電子地圖上看到的就是那個,那么人家導彈要是攻擊那個的時候,那么導彈就打不中我們的鳥巢啦,我們的鳥巢就安全了。不過,個人擔心這樣加密后沒有 打中鳥巢,會不會打中水立方呢,可能是無心插柳柳成蔭了。

現在,所有的電子地圖所有的導航設備,都需要加入國家保密插件。第一步,地圖公司測繪地圖,測繪完成后,送到國家測繪局,將真實坐標的電子地圖,加密成 “火星坐標”,這樣的地圖才是可以出版和發布的,然后才可以讓GPS公司處理。第二步,所有的GPS公司,只要需要汽車導航的,需要用到導航電子地圖的, 統統需要在軟件中加入國家保密算法,將COM口讀出來的真實的坐標信號,加密轉換成國家要求的保密的坐標,這樣,GPS導航儀和導航電子地圖就可以完全匹 配啦,GPS也就可以正常工作啦。

所以,所有的導航電子地圖公司,像四維圖新、瑞圖、易圖通、高德等等,都需要將自己的電子地圖拿到國家測繪局進行加密處理,而所有的導航軟件公司,都需要 將自己的導航軟件中加入國家測繪局提供的加密算法的代碼。而這一段代碼,就是國家的機密,不是公開的,每次去國家測繪局加密處理都需要預約并在封閉的環境 中進行,編譯完成后需要是在主程序的exe中,而不能編譯在外部dll等文件中。

當然,國家的保密插件,是需要收費的,早期的時候,一個導航儀就需要10塊錢的保密插件許可費,恩,保密插件也不是白用的,畢竟國家花了很多的錢和人力和 物力才做出來的保護國家安全的保密東西怎么可以隨便送你用呢,收點錢也就算是正常也算是在預料之中啦。現在的話,好像已經下放到地圖數據公司了,就是看這 個地圖數據公司的經營狀況,大概會出貨多少份電子地圖,然后一次性收取地圖數據公司多少錢,可能是多少百萬,然后這個錢呢,你們數據公司就自己找你們的導 航軟件公司的客戶收吧,算在每一臺設備中的許可費,恩,國家的辦事效率變高了,一次直接從導航電子地圖公司收費比逐個收取導航軟件公司的錢要來的容易和不 那么麻煩。

現階段,有些人或者組織,為了自己的利益,將導航軟件和導航地圖進行破解,并發現了導航電子地圖中存在的地圖偏差,所以就采取人為的手段,將地圖反加密, 將虛假的坐標轉換成標準的WGS84坐標,最笨的方法就是線性的平移,大概偏差的距離為500米,基本上能夠反回來,但誤差較大,特別是南北距離加大的情 況下,而聰明一點的方法,用matlab等工具計算出其中的曲線,然后反轉回來。多么的可怕那,這是觸犯國家法律的行為,國家的安全就這樣被你們破壞了, 這是一個刑事問題,而不是簡單的破解軟件破解地圖的經濟犯罪問題了。請大家務必務必遵守國家的法律,不要干出這樣的傻事出來,出了事誰都保不了你,畢竟你 將成為國家的敵人。

最后,說說保密插件帶來的弊端,好處不容忽視,國家為了安全考慮,保密了就安全了,但弊端是,制造了人為的障礙,非常的不好用,比如導航軟件出來的坐標, 不能和Google Earth等國際軟件匹配,Google Earth和Map在國內基本上就是廢物。進一步帶來的導航問題是,尋寶、分享等許多好玩的GPS活動,都無法在大陸地區展開,這一點真的讓人很無奈。當 然,也有一些時候,由于導航軟件的保密插件問題,導致不能導航等等。保密插件,是一個讓人哭笑不得的東西,就如同國際的WGS84坐標對我們的54坐標或 者80坐標,就如同


名詞總結:
地球坐標:指WGS84坐標系統
火星坐標:指使用國家保密插件人為偏移后的坐標
地球地圖:指與地球坐標對應的客觀真實的地圖
火星地圖:指經過加密偏移后的,與火星坐標對應的地圖

以上內容瀏覽后,背景知識大概就明白了。

首先,我們手上所有的GPS設備,根據渠道和接口軟件的不同,分為火星坐標設備與WGS84坐標設備兩種,另外所有GPS設備中的地圖以及網上的地圖,分為火星地圖(即人為偏移)和真實地圖兩種。
比如國內“正規渠道的車載GPS”,采用的是火星坐標配火星地圖,完美結合,能夠準確的在地球上使用,缺點就是記錄的點和軌跡都是火星的,與其他地球人無法交流分享。
多數水貨GPS設備,使用的都是地球坐標配火星地圖,這樣軌跡和航點都是真實坐標的,只不過在火星地圖上偏移了
有些玩家,會將火星地圖加入偏移算法(無論準確或不準確),人為糾偏,形成地球坐標配糾偏地圖(自制地圖),不考慮誤差可以正常使用
而目前,所有正式發布的大陸境內電子地圖,都是火星地圖,所以只有大陸之外地區,才能夠用到地球坐標與官方地球地圖完美結合的解決方案

放屁阿狗 2011-06-29 10:13 發表評論
]]>
gps::ks-108設備協議接入代碼http://www.shnenglu.com/socketref/archive/2011/06/15/148721.html放屁阿狗 放屁阿狗 Wed, 15 Jun 2011 08:54:00 GMThttp://www.shnenglu.com/socketref/archive/2011/06/15/148721.htmlhttp://www.shnenglu.com/socketref/comments/148721.htmlhttp://www.shnenglu.com/socketref/archive/2011/06/15/148721.html#Feedback0http://www.shnenglu.com/socketref/comments/commentRss/148721.htmlhttp://www.shnenglu.com/socketref/services/trackbacks/148721.html  1 # -- coding:utf-8 --  2 #解碼器定義  3 &nbs...  閱讀全文

放屁阿狗 2011-06-15 16:54 發表評論
]]>
對Apache Server Status的啟用http://www.shnenglu.com/socketref/archive/2011/05/27/147404.html放屁阿狗 放屁阿狗 Fri, 27 May 2011 13:05:00 GMThttp://www.shnenglu.com/socketref/archive/2011/05/27/147404.htmlhttp://www.shnenglu.com/socketref/comments/147404.htmlhttp://www.shnenglu.com/socketref/archive/2011/05/27/147404.html#Feedback0http://www.shnenglu.com/socketref/comments/commentRss/147404.htmlhttp://www.shnenglu.com/socketref/services/trackbacks/147404.html

Apache Server Status的啟用

Apache的狀態管理的模塊是LoadModule status_module modules/mod_status.so,所以這個需要有,然后打開下面的配置

ExtendedStatus On

配置Apache Server Status的權限

<location /server-status>

         SetHandler server-status

         Order Deny,Allow

         Deny from all

         Allow from .foo.com

</location>

打開查看的話就使用http:// your.server.name/server-status來訪問,注意VHapache要設置在一個VH,不然你分不清是那個地址來查看看這個信息.ExtendedStatus不能放在VH.

 



放屁阿狗 2011-05-27 21:05 發表評論
]]>
整理之前的webgis demo,提供下載http://www.shnenglu.com/socketref/archive/2011/05/26/147171.html放屁阿狗 放屁阿狗 Thu, 26 May 2011 02:56:00 GMThttp://www.shnenglu.com/socketref/archive/2011/05/26/147171.htmlhttp://www.shnenglu.com/socketref/comments/147171.htmlhttp://www.shnenglu.com/socketref/archive/2011/05/26/147171.html#Feedback5http://www.shnenglu.com/socketref/comments/commentRss/147171.htmlhttp://www.shnenglu.com/socketref/services/trackbacks/147171.htmlhttp://sw2us.com:8520/medias/flex/newgis.html
下載地址: http://sw2us.com:9090/sw2us.webgis.demo.2011.5.26.7z


----------------------------------------
sw2us.webgis 在99年就開始有個做地圖引擎的想法,由于忙于公司其他開發項目的事情,一直斷斷續續進行
在5173的時候開始用geoserver來架構wms服務器,發現配置部署性能都差強人意,所以想著自己做個wms服務
10年的時候也寫了個版本,后來用tilecache進行tile 繪制,中國地圖1000的比例兩臺機器繪制了1個月
下半年生病了,到11月份回unistrong上班,工作內容就是寫驅動,空閑之余繼續寫地圖渲染代碼,以前用wx做的
代碼全部用qt寫了一遍,優化了一些速度。地圖換了兩版本,08年的全國圖和11年的上海圖,用python腳本進行預處理
切割地圖進行網格存儲。以前的同事多年前就告訴我他們改進4叉樹的存儲方式來提高訪問數據減少數據加載,我也
沒好好琢磨過,主要是沒有時間和精力,只好做這種傻瓜式的簡單網格切分和加載。

demo只是簡單實現了地圖加載和現實,然后用openlayers,extjs,geoext,django做了個框架頁面,里面放了個不跑的汽車圖標

這個東西是10年12月完成的,已經準備放棄這個架構的設想,準備采用flex+openscale+django來重做webgis應用,
當然那還是需要花費很多時間和精力

zhangbin
2011.1.20

msn: socketref@hotmail.com
qq: 24509826

==========================================================================================
注意: sw2us.webgis.demo目錄必須存放在c:\根目錄下,不能更改目錄名

安裝
=============
1.配置數據庫
    安裝pgsql, postgresql-8.3.5-2-windows.exe,數據庫端口保持為5432 ,設置postgres用戶,密碼為111111
    安裝空間數據庫擴展 postgis-pg83-setup-1.5.2-1.exe
    創建 數據庫名 newgis,導入數據庫文件 newgis.db.backup

2. webserver配置
    運行C:\sw2us.webgis.demo\apache2.2.pack\http-install.bat  安裝apache服務,偵聽 9090端口
    C:\sw2us.webgis.demo\apache2.2.pack\http-install.bat     啟動apache服務
    
3.安裝微軟雅黑字體
    bin/vistaFont_chs.exe ,安裝之后修改系統默認字體為微軟雅黑字體

4. 安裝vc運行環境 bin\vcredist_x86.exe

運行:
===============
    start-gis.bat     運行django后臺服務
    wms_start.bat     運行wms服務器
    tileserver-rpcservice-1.bat/tileserver-rpcservice-2.bat 為后臺地圖渲染服務,目前配置5001,5002端口
    瀏覽器錄入 http://192.168.14.3:8080/ 即可看到地圖界面
    
系統端口說明:
===============
    9090      apache 服務端口
    8080    django 服務端口
    8000    wms 服務端口
    5001,5002 地圖渲染服務端口

    
以上端口都被寫入了相關服務的配置文件,請確保這些端口沒有被占用

--    修改apache端口 C:\sw2us.webgis.demo\apache2.2.pack\Apache2.2\conf\httpd.conf ;
    修改之后必須重新啟動apache服務(http-shutdown.bat,http-start.bat)
    修改apache端口之后必須修改對應django的配置 C:\sw2us.webgis.demo\newgis\gis.py(第14行 JSLIB_PATH的webserver指向)
--    django服務端口可以任意修改 start-gis.bat
--    wms服務端口修改 wms_start.bat ,修改之后必須同步C:\sw2us.webgis.demo\newgis\medias\js\gis\gismap.js(第19行)的wms服務器指向
--    地圖渲染服務可以根據負荷的情況啟動多個服務進程(復制tileserver-rpcservice-1.bat,修改其端口號,比如 5003),在修改或增加渲染
    進程之后必須修改wms服務的配置C:\sw2us.webgis.demo\swmap.demo\GisServer\tileservers.txt
    
demo系統默認都是采用localhost做服務接口,如果要提供網絡支持或者分布這些服務進程來提高性能,則需要修改這些不同的端口和ip地址

    
系統描述:
=============
 瀏覽器firefox 直接訪問django端口,django的url.py分派請求到gis.py,gis.py加載pages/mainwindow.html
 mainwindow.html已經是個openlayers+ext的框架界面了,其陸需加載 openlayers,ext等的js腳本,注意:這些js
 腳本并不存在django的目錄下,而是存放在apache的web-root目錄下,所以必須要修改gis.py和mapgis.js里面的
 主機指向信息。
 當mainwindow.html加載之后,工作就交給了openlayers,openlayers將訪問wms服務器(gismap.js 19行),此刻wms服務器
 提供tile數據給瀏覽器。
 地圖渲染服務必須在wms服務之前啟動,wms通過tileserver.txt的配置 采用ice 與渲染服務進程通訊并獲得圖塊并返回給
 瀏覽器。
 渲染服務器、wms服務器、apache和django服務都可以被分隔存儲在不同的主機上
 
 好了,demo可以在本機跑起來了,但必須是以 http://locahost:8080方式,如果想以網絡方式訪問則修改wms服務端口,gis.py,gismap.js及相關.bat配置
 
相關問題
=============
 如果將這些服務主機都配置成localhost,訪問速度大大降低 , 應配置成獨立的ip地址
 apache已經配置了js壓縮輸出    
   


放屁阿狗 2011-05-26 10:56 發表評論
]]>
HttpServer+ TileCachehttp://www.shnenglu.com/socketref/archive/2010/11/18/134002.html放屁阿狗 放屁阿狗 Thu, 18 Nov 2010 08:49:00 GMThttp://www.shnenglu.com/socketref/archive/2010/11/18/134002.htmlhttp://www.shnenglu.com/socketref/comments/134002.htmlhttp://www.shnenglu.com/socketref/archive/2010/11/18/134002.html#Feedback0http://www.shnenglu.com/socketref/comments/commentRss/134002.htmlhttp://www.shnenglu.com/socketref/services/trackbacks/134002.html    隨即而來的是放棄Geoserver,自己重新開發地圖渲染服務器,使用了QT令我效果滿意,那再使用那一套GeoServer的東西就不合時宜了,TileCache也是需要綁定Apache+mod_python才能工作,簡直太累最了,配置個環境還是不太容易,想想自己只是想提供一個WMS的服務罷了何必那么麻煩呢。 地圖服務器也有了,產生CacheTiles也開發了自動化的工具,將全國不同顯示比例的圖塊按256x256規格分別放入多個文件,這樣備份起來就快速多了。
    之前看過TileCache的代碼,那時候只是為了編寫一個新的Cache Store backend,現在重新回過頭來,我決定拋棄apache,語言還是用python,之前做一個酒店廣告投放系統時開發過一個Http代理服務器,所以輕車熟路了,保留其Http服務功能,加上TileCache的WMS服務代碼,一個swMap的WMS 服務器就可以誕生了。
    端詳了一會兒TileCache,發現是多么的簡單,幾乎不用多修改什么地方就可以完成。
    由于我的swMap服務程序提供了預先緩存和實時繪制地圖的功能,所以通過Http可以以兩種模式進行,當然實時模式是用于調試地圖層SLD時派上大用場。
    實時繪制的時候我的WMS服務器通過Ice連接到swMap服務器,當緩存訪問時我的WMS服務器直接從本地Tile文件中讀取,那時多么舒服的事情哪!






放屁阿狗 2010-11-18 16:49 發表評論
]]>
下一步swMap的工作內容http://www.shnenglu.com/socketref/archive/2010/11/18/133998.html放屁阿狗 放屁阿狗 Thu, 18 Nov 2010 08:32:00 GMThttp://www.shnenglu.com/socketref/archive/2010/11/18/133998.htmlhttp://www.shnenglu.com/socketref/comments/133998.htmlhttp://www.shnenglu.com/socketref/archive/2010/11/18/133998.html#Feedback0http://www.shnenglu.com/socketref/comments/commentRss/133998.htmlhttp://www.shnenglu.com/socketref/services/trackbacks/133998.html2. 繼續增加swBox功能,諸如: 測距、圍欄、自定義用戶興趣點、面積計算
3. 緩沖全國圖tile到緩存文件,最低比例1:2000,由于是全國性的預先繪制工作,會消耗很大的磁盤空間和處理時間,估計3臺4核的PC連續1個星期工作時間
4. 開發基于swBox的基本應用,增加POI搜尋和MapGrab功能(用戶可以指定地理范圍產生指定顯示精度的大幅圖像,比如可以抓取1:4000的整個上海城區圖到一個jpg文件)
5. 增加矢量運算操作進行道路匹配
6. 增加GPS簡易的定位功能,多個移動對象之間的位置拓撲關機的操作,支持軌跡回放和導出功能
7. swBox增加Wince版本




放屁阿狗 2010-11-18 16:32 發表評論
]]>
swbox 地圖渲染完成基本功能http://www.shnenglu.com/socketref/archive/2010/11/08/132907.html放屁阿狗 放屁阿狗 Sun, 07 Nov 2010 17:20:00 GMThttp://www.shnenglu.com/socketref/archive/2010/11/08/132907.htmlhttp://www.shnenglu.com/socketref/comments/132907.htmlhttp://www.shnenglu.com/socketref/archive/2010/11/08/132907.html#Feedback1http://www.shnenglu.com/socketref/comments/commentRss/132907.htmlhttp://www.shnenglu.com/socketref/services/trackbacks/132907.html其中借鑒了geoserver的服務模式,ogc的SLD風格配置,tilecache開源代碼的核心,現已用c++完成這些功能,
運行效率可謂比geoserver快了好幾個數量級
未加入道路和多邊形文本標注,正在調整標注算法和邏輯; *.xml控制地圖,mapsld.xml定義層樣式風格

程序演示:http://wallizard.vicp.net:9000/swBox_release_2010.11.08.rar





放屁阿狗 2010-11-08 01:20 發表評論
]]>
加了QT繪制地圖http://www.shnenglu.com/socketref/archive/2010/10/19/130501.html放屁阿狗 放屁阿狗 Tue, 19 Oct 2010 15:37:00 GMThttp://www.shnenglu.com/socketref/archive/2010/10/19/130501.htmlhttp://www.shnenglu.com/socketref/comments/130501.htmlhttp://www.shnenglu.com/socketref/archive/2010/10/19/130501.html#Feedback2http://www.shnenglu.com/socketref/comments/commentRss/130501.htmlhttp://www.shnenglu.com/socketref/services/trackbacks/130501.html加上了SLD控制地圖分隔,比之前的效果好了很多

1.修復了由于判別第一個feature不在可視區域內導致忽略了之后的數據加載的bug
2.多邊形和線性增加了最小可見寬度,為了加速繪制的速度

告別了geoserver那種蝸牛和不可控的年月了
基本的繪制效果比較滿意
下一步工作:
1.文本繪制和優化
2.地圖layer壓縮減小存儲空間以及測試性能上的影響
3.優化memheap的算法
4.mapcanas從wx移植到qt
5.flex 組件優化
6.mapserver支持tilecache





放屁阿狗 2010-10-19 23:37 發表評論
]]>
地圖顯示比計算http://www.shnenglu.com/socketref/archive/2010/10/08/129099.html放屁阿狗 放屁阿狗 Fri, 08 Oct 2010 14:39:00 GMThttp://www.shnenglu.com/socketref/archive/2010/10/08/129099.htmlhttp://www.shnenglu.com/socketref/comments/129099.htmlhttp://www.shnenglu.com/socketref/archive/2010/10/08/129099.html#Feedback0http://www.shnenglu.com/socketref/comments/commentRss/129099.htmlhttp://www.shnenglu.com/socketref/services/trackbacks/129099.html例如在openlayers時,resolutions用于定義顯示精度,也就是比例尺。
    resolutions: [0.17578125,0.087890625,0.0439453125,0.02197265625] ,定義了4級地圖顯示比例,每個像素表示多少地理寬度
 如果換算成顯示比時,轉換方法:  0.17578125*sw_METERS_PER_DEGREE/sw_METERS_PER_PIXEL = 74,143,700 = 74M
 也是就 1:74M


放屁阿狗 2010-10-08 22:39 發表評論
]]>
webgis - china 12級縮放 地圖http://www.shnenglu.com/socketref/archive/2010/05/16/115517.html放屁阿狗 放屁阿狗 Sun, 16 May 2010 09:08:00 GMThttp://www.shnenglu.com/socketref/archive/2010/05/16/115517.htmlhttp://www.shnenglu.com/socketref/comments/115517.htmlhttp://www.shnenglu.com/socketref/archive/2010/05/16/115517.html#Feedback0http://www.shnenglu.com/socketref/comments/commentRss/115517.htmlhttp://www.shnenglu.com/socketref/services/trackbacks/115517.htmlhttp://118.126.7.153/maps/test_map.html
12級別采用tilecache產生圖塊到postgres存儲,繪制過程花費了12天,真希望有海量空間和更多的機器供我使用阿




放屁阿狗 2010-05-16 17:08 發表評論
]]>
TileCache.Cache擴展http://www.shnenglu.com/socketref/archive/2010/04/14/112600.html放屁阿狗 放屁阿狗 Wed, 14 Apr 2010 15:47:00 GMThttp://www.shnenglu.com/socketref/archive/2010/04/14/112600.htmlhttp://www.shnenglu.com/socketref/comments/112600.htmlhttp://www.shnenglu.com/socketref/archive/2010/04/14/112600.html#Feedback0http://www.shnenglu.com/socketref/comments/commentRss/112600.htmlhttp://www.shnenglu.com/socketref/services/trackbacks/112600.htmltilecache-2.10\TileCache\Caches目錄下就是TileCache自帶的Cache類型,Cache有個抽象基類,我的數據Cache只要實現這些Cache的接口便能完成到數據庫的Tile存取。

 1 class Cache (object):
 2     def __init__ (self, timeout = 30.0, stale_interval = 300.0, readonly = False, **kwargs):
 3         self.stale    = float(stale_interval)
 4         self.timeout = float(timeout)
 5         self.readonly = readonly
 6                 
 7     def lock (self, tile, blocking = True):
 8         start_time = time.time()
 9         result = self.attemptLock(tile)
10         if result:
11             return True
12         elif not blocking:
13             return False
14         while result is not True:
15             if time.time() - start_time > self.timeout:
16                 raise Exception("You appear to have a stuck lock. You may wish to remove the lock named:\n%s" % self.getLockName(tile)) 
17             time.sleep(0.25)
18             result = self.attemptLock(tile)
19         return True
20 
21     def getLockName (self, tile):
22         return self.getKey(tile) + ".lck"
23 
24     def getKey (self, tile):
25         raise NotImplementedError()
26 
27     def attemptLock (self, tile):
28         raise NotImplementedError()
29 
30     def unlock (self, tile):
31         raise NotImplementedError()
32 
33     def get (self, tile):
34         raise NotImplementedError()
35 
36     def set (self, tile, data):
37         raise NotImplementedError()
38     
39     def delete(self, tile):
40         raise NotImplementedError()
接口夠簡單了吧 ,最主要的實現的 是get,set,getKey這3個主要接口
tilecache.cfg的Cache.type設置為DB_POSTGRES






放屁阿狗 2010-04-14 23:47 發表評論
]]>
發布中國圖到web的開發經歷http://www.shnenglu.com/socketref/archive/2010/04/12/112299.html放屁阿狗 放屁阿狗 Mon, 12 Apr 2010 03:18:00 GMThttp://www.shnenglu.com/socketref/archive/2010/04/12/112299.htmlhttp://www.shnenglu.com/socketref/comments/112299.htmlhttp://www.shnenglu.com/socketref/archive/2010/04/12/112299.html#Feedback2http://www.shnenglu.com/socketref/comments/commentRss/112299.htmlhttp://www.shnenglu.com/socketref/services/trackbacks/112299.html
1.開發工具:
Geoserver,Openlayer,Ext-js,Postgres/Postgis,Python2.6,PIL,TileCache
2.地圖數據
我的地圖數據是08年的全國地圖,按每個省市分隔開來,每個省市又分了若干個圖層文件,格式是mapinfo的Tab,容量10G
由于沒有全國大比例圖,在偶然的一個機會從網上下載到一份C/S的監控系統,沒想到安裝目錄內就有一份全國圖,就是比例不高。
3.處理過程
1.Tab轉換成shp: Ogr工具可以完成這兩種格式的轉換,編寫python腳本可以輕易處理完
  在轉換數據之前需要提醒的是,發現在處理多邊形圖層時,這個多邊形圖層并不是簡單的多邊形,也就是那種mapinfo允許存在polygon和pline的圖層,這將導致之后的導入空間數據庫的失敗,因為postgis要求每個圖層數據類型必須是一致的,不能存在多種類型,所以編寫mapbasic腳本,將這些pline對象從這多邊形圖層中剔去即可。
2.數據校驗: 這個過程非常重要,任何提供的的矢量數據都有可能存在錯誤數據,所以第一步必須要修復這些可能存在的錯誤,工具就是ArcGis,使用其工具對每個省市的每個圖層文件進行修復。
3.導入空間數據庫: 編寫腳本,將shp數據轉成sql文件,此時必須注意空間數據庫的字符編碼與sql數據字符編碼要吻合或者能夠自動轉換。pg2sq由于轉換成sql時,由于shp數據中某些圖層表存儲的字符編碼不統一導致產生的非法的sql數據,所以必須對這些數據進行修正,并采用ultraedit將數據進行轉碼成數據的字符集類型,我使用的是utf-8.
4.數據分離: 由于提供的全國地理數據是沒有根據應用來分層的,所有的道路都合在同一個叫road的圖層內,然后通過屬性來區分道路的級別,由于我們在控制顯示道路時是需要分層分級別的,所以必須將這些數據要分離成不同的道路圖層,道路共10級別(0-9),編寫腳本將每個省市的道路切割成road_?10級道路層(select into即可搞定)。
同樣,除了道路之外還有其他的比如河流,POI對象等都需要進行分割到不同圖層以便更精確的現實控制。
5.配置Geoserver: 數據都有了,接下來就是配置繪制引擎了。Geoserver提供WFS,WMS服務,性能一般,由于是java開發的。不管3721,配置了最新的I5主機,將java虛擬機的內存設置的最大,將postgis的數據庫內存也足夠調大。手工添加了1,2個圖層到geoserver,preview一下,ok!
接下來編寫控制這些圖層的SLD了,這些花了好些時間學習和開發(學習sld對我以前開發嵌入式地圖引擎風格配置也是一種幫助,之后的嵌入式地圖引擎也全部使用sld進行配置了!)
由于全國數據分31個省市,每個省市都配置了21個圖層,所以要人工11加到geoserver還真是很大的問題,不過沒關系,有python在手,然后對geoserver的配置文件研究了一把便寫了腳本將幾百個圖層全加了進去,然后將這些圖層按省市進行分組,再次Preview,ok!
6.Cache Tile生成: 使用過GeoWebCache,發現很多地方實在不好理解,幸好找到了TileCache,代碼也容易修改,研讀了TileCache代碼之后修改了N處地方,把效率提高了10倍以上。現在的問題在于Tilecache實現了Disk Cache,Memory Cache,但就是沒有DB cache,每個tile將創建一個文件,如果這些文件很小,有的甚至才幾十字節也要浪費一個文件塊空間,效率不高,如果采用db的話空間就能節省很多,等以后有了時間自己編寫一個后端為postgres的Tile Cache吧。

Tile Cache生成有些問題要注意:
1. 空白tile: 由于我設置的繪制設置的BBox非常大,所以在繪制的時候有些空白區域也將提交給geoserver進行處理,這樣浪費了處理時間,同時這些產生的小規格圖塊大大占據了磁盤空間,所以修改的代碼將不存儲這些空白tile,僅僅存儲這些tile的文件名稱,而不保存內容
2. tilecache的Resolutions,ZoomLevels,BBox和Openlayers的屬性必須一樣,否則Opnelayers無法顯示正確的tile
3. tile相交檢測: 同樣是空白區域的繪制,如果每次都提交給geoserver的話,geoserver將根據配置的layer去相交并繪制一次,這就完全沒有必要的,我的解決方式就是提前將31個省市產生他們的MBR,然后再tile進行提交給geoserver之前,將請求的tile的bbox與這些省市的mbr進行相交測試,只有相交的圖層才送入geoserver繪制
4. 大網格繪制: 每次以256×256的規格給geoserver繪制全國圖的話效率實在太低,之后修改成2048×2048規格,整體的繪制效率上升了n倍,繪制完了之后采用split_tile.py將這些大塊切割成256規格的小塊,必須注意產生的序號

寫得好累





放屁阿狗 2010-04-12 11:18 發表評論
]]>
地圖處理小結_tilecache_openlayers_geoserverhttp://www.shnenglu.com/socketref/archive/2010/04/12/112293.html放屁阿狗 放屁阿狗 Mon, 12 Apr 2010 02:37:00 GMThttp://www.shnenglu.com/socketref/archive/2010/04/12/112293.htmlhttp://www.shnenglu.com/socketref/comments/112293.htmlhttp://www.shnenglu.com/socketref/archive/2010/04/12/112293.html#Feedback0http://www.shnenglu.com/socketref/comments/commentRss/112293.htmlhttp://www.shnenglu.com/socketref/services/trackbacks/112293.html

一下處理過程需要在python2.52.6之間切換

Pgsql8.3.5

postgis1.5

tilecache 2.10

geoserver2.0

openlayers

ext-js

django

 

1.       openlayer顯示地圖無法顯示正確的比例尺

在訪問地圖時設置地圖顯示單位必須為 units:'degrees'

 2. 圖層文字標注出現亂碼和重復繪制多個相同名稱

Sld設置的group=true似乎沒有起作用

layer = new OpenLayers.Layer.WMS( "FirstMap","http://localhost:8080/geoserver/wms",{},{singleTile: true, ratio: 1})

必須設置紅色部分的參數,能保證文字不被重復顯示

但是在使用tilecache.py預緩沖圖塊時("http://localhost:9000/tilecache/tilecache.py"),添加了以上紅色參數之后導致無法顯示地圖。

SingleTile:true 參數是作為geoserver的附加屬性由openlayer傳遞到服務器,

所以考慮將此參數通過tilecache.cfg傳遞到geoserver是否能夠起到相同效果?

發現使用了signleTile之后,openlayers將不進行塊的緩沖,而是每次請求都到geoserver上去獲取,抓包發現singleTile開啟的話,請求時將不傳遞width/height參數,直接請求bbox大小的地理區域,每次移動地圖將重新加載整個區域,效率低下;

但是關閉singleTile的話,依次連續請求多個網格塊,默認是256x256,導致有些圖層比如背景層1024×1024的話將請求4x4個網格塊,每個塊都將繪制背景的文本標識,因為這些塊是離散繪制的所以顯示在地圖上的話將是重復的文本顯示出來了,所以避免這個問題只有如下解決:

1.       放大網格的大小規格,使一定的地理范圍盡可能的處在一個網格內被繪制

目前這種方式似乎是最佳方式,tilecache 默認tile規格是256*256,在繪制全國圖的時候設置1024*1024方式去請求geoserver,然后使用split_tile.py切割土塊即可。

2.       控制這些層的顯示屬性,限制只有在某些比例尺時被顯示

3.       手工編輯地圖數據,合并多邊形對象,這樣就可以防止重復繪制多邊形的名稱標注,導致一個省份名稱繪制多次

 

Tilecache為了支持apache訪問,必須安裝到python/lib/目錄下,并且tilecache.cfg也在這個安裝目錄下。

Tilecache.cfg修改之后必須重新啟動apache服務

 

如果geoserver實時繪制的話允許同時傳遞多個層名稱給geoserver進行繪制

new OpenLayers.Layer.WMS( "FirstMap",                  

                                   "http://localhost:8080/geoserver/wms",

                                   { layers:’shanghai,china,…’})

 

如果tilecahce加載tile網格塊的話,layers屬性不能傳遞多個圖層,因為多個圖層就是返回多個tile塊,只有在tilecache.cfg中配置多個layer名稱

[east_china]

type=WMSLayer

url=http://localhost:8080/geoserver/wms

layers=shanghai,jiangshu,zejiang

extension=png

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

bbox=70,10,130,60

 

優化批量自動化繪制地圖

 

1.       tilecache_seed.py提交layersgeoserver 時,如果提交全國所有layersgeoserver將處理每個layer,即使layer與當前可見地理區域不想交,但還是會被循環處理;所以必須改寫tilecahe_seed.py程序,檢測只有相交的圖層傳送給geoserver渲染。

改寫部分在TileCache/Layers/WMS.py中,

def renderTile(self, tile):

        wms = WMSClient.WMS( self.url, {

          "bbox": tile.bbox(),

          "width": tile.size()[0],

          "height": tile.size()[1],

          "srs": self.srs,

          "format": self.mime_type,

          "layers": self.layers,

        }, self.user, self.password)

        tile.data, response = wms.fetch()

        return tile.data

self.layers參數就是tilecache.cfg中參數layers定義的層列表,所以只需要修改這個參數即可。

處理方式: tile.bbox()的地理區間與數據庫中的省市層最大mbr進行相交測試,只有相交的才提交給geoserver進行處理。

修改之后

測試:

將網格規格調整為256*256,繪制east_china圖層第7顯示級別,花銷48

修改代碼如下:

def isIntersect(self,rc1,rc2):

        if rc1[2] < rc2[0] or rc1[3] < rc2[1] or rc1[0] > rc2[2] or rc1[1] > rc2[3]:

            return False

        return True

   

def renderTile(self, tile):

        import sys,string

        sys.path.append('c:/')

        import cities_mbr

        layers = self.layers.split(',')

 

        newLayers=[]

        for layer in layers:           

            rc = cities_mbr.G_CITIES_MBR[layer]

            rc2 = tile.bbox().split(',')

            rc2 = map(float,rc2)

            if self.isIntersect(rc,rc2):

                newLayers.append(layer)

        layers = string.join(map(str,newLayers),',')

        if len(newLayers) == 0: #no any insercted layer

            layers='china:china_blank_layer'  #here i select shanghai as empty city to fill              

        print layers

       

        wms = WMSClient.WMS( self.url, {

          "bbox": tile.bbox(),

          "width": tile.size()[0],

          "height": tile.size()[1],

          "srs": self.srs,

          "format": self.mime_type,

          #"layers": self.layers,

          "layers": layers,

        }, self.user, self.password)

        print 'x*'*20       

        print self.url,tile.bbox(),layers

        #import sys

        #sys.exit(0);

        tile.data, response = wms.fetch()

        return tile.data

注意以上紅色代碼,當檢索不能匹配任何圖層時,需要geoserver返回空白圖塊,self.layers必須設置一個數據庫中可用的圖層名稱,這個圖層只是為了繪制空白塊的,所以可以在postgis中創建一個point層即可或者一個空層,然后添加一個遠離中國地理區域的一個點即可.

 2.       顯示比例越小的時候,繪制地圖需要更多的時間,那是由于顯示的越大繪制的圖層就越多。

要使多臺機器同時分工繪制地圖的話, 可以按層進行分割處理和劃分經緯度的方式進行。前者適用與高比例尺的顯示,后者就是小比例尺的顯示。

小顯示比例時,tilecache將圖層進行網格化處理,由西至東,由下至上。所以提交給處理機器以不同的bbox即可,處理完成之后再將這些圖塊重新進行編號即可。()

 

3.       在低縮放比的情況下放大tile的規格,默認是256×256,將其設置為256×n大小,這樣可以提高每次請求的效率,之后再將圖塊切割為256×256大小的png圖塊。 這就要求geoserversld關閉 <vendor-group>true</vendor-group>開關

測試:

將網格規格調整為1024*1024,繪制east_china圖層第7顯示級別,花銷30

將網格規格調整為256*256,繪制east_china圖層第7顯示級別,花銷200

圖像擴大了16倍,時間縮短了6

大圖塊產生之后切割為小圖塊,需要重新索引文件編號。

A規格圖塊和B規格圖塊(A*4=B),如果A繪制需要產生400(0-399),400(0-399),B只需要產生100100行。

 

Tilecache預處理數據存儲方式:

圖塊數據繪制時按照經度從西到東,維度從南到北的順序依次繪制出網格圖塊。

每一列的圖塊都創建出一個目錄,從下標0開始。

繪制方式:

For(x=0;x<columns;x++){

       For(y=0;y<rows;y++){

              Draw_tile()

}

}

 

層名稱/縮放級別/000/000/列編號/000/000/行圖塊文件.png

  Tilecache的數據存儲目錄在刪除時必須注意停止apache服務

Apache提供tile服務時將自動使用python2.6下的tilecache代碼

操作數據庫是采用的是pgpostgresql,目前只支持python2.5,所以必須先注視掉c:/python2.6, 打開c:/python2.5

 



放屁阿狗 2010-04-12 10:37 發表評論
]]>
tilecache_切割大圖塊http://www.shnenglu.com/socketref/archive/2010/04/12/112292.html放屁阿狗 放屁阿狗 Mon, 12 Apr 2010 02:32:00 GMThttp://www.shnenglu.com/socketref/archive/2010/04/12/112292.htmlhttp://www.shnenglu.com/socketref/comments/112292.htmlhttp://www.shnenglu.com/socketref/archive/2010/04/12/112292.html#Feedback0http://www.shnenglu.com/socketref/comments/commentRss/112292.htmlhttp://www.shnenglu.com/socketref/services/trackbacks/112292.html但openlayers里面256×256是最佳的cache規格,所以tilecache產生的tile必須進行切割成256規格

 1 # -*- coding:utf-8 -*-
 2 
 3 #切割大地圖塊到小圖塊,重新索引圖塊文件目錄
 4 
 5 #層名稱/縮放級別/000/000/列編號/000/000/行圖塊文件.png
 6 
 7 import sys, traceback,threading,time,struct,os,os.path,shutil,distutils.dir_util,array,base64,zlib
 8 import PIL,Image
 9 
10 g_layerName='east_china'
11 
12 srcTiles={'path':'','size':(1024,1024)}
13 destTiles={'path':'','size':(256,256)}
14 
15 #layerName - 處理的地圖層名,在tilecache.cfg中定義
16 #scale - 顯示級別
17 #tileDir - 圖塊存儲目錄
18 #destDir - 切割圖塊存儲目錄
19 #tilesizeFrom - 當前圖塊規格
20 #tilesizeTo - 目標圖塊規格
21 #注意: 維度從下至上遞增
22 #一個大網格塊列切割成多列,行且歌城多行
23 def splitTile(layerName,scale,tilesDir,destDir,tilesizeFrom=(1024,1024),tilesizeTo=(256,256)):
24     xcols = tilesizeFrom[0]/tilesizeTo[0]
25     xrows = tilesizeFrom[1]/tilesizeTo[1]
26     
27     path2 = "%s/%s/%02d/000/000"%(destDir,layerName,scale)
28     if not os.path.exists(path2):
29         os.makedirs(path2)
30     path1 = "%s/%s/%02d/000/000"%(tilesDir,layerName,scale)
31     cols = map(int,os.listdir(path1))
32     for col in cols: #1列要切割成n列
33         path1 = "%s/%s/%02d/000/000/%02d/000/000"%(tilesDir,layerName,scale,col)
34         for x in range(xcols):
35             newcol = col*xcols + x
36             path2 = "%s/%s/%02d/000/000/%02d/000/000"%(destDir,layerName,scale,newcol) #大土快可以切割成多列
37             if not os.path.exists(path2):
38                 os.makedirs(path2)
39             #print path1
40             files = os.listdir(path1) #list columns
41             for file in files:
42                 name,ext = file.split('.')
43                 path3 = "%s/%s/%02d/000/000/%02d/000/000/%s"%(tilesDir,layerName,scale,col,file) #
44                 img = Image.open(path3)
45                 
46                 rows = range(xrows)
47                 rows.reverse()                
48                 for y in rows:                    
49                     box = (x*tilesizeTo[0],y*tilesizeTo[1],(x+1)*tilesizeTo[0],(y+1)*tilesizeTo[1])
50                     #print box
51                     newimg = img.crop(box)
52                     y = int(name)*xrows + xrows - y -1
53                     print x,y
54                     path2 = "%s/%s/%02d/000/000/%02d/000/000/%02d.png"%(destDir,layerName,scale,newcol,y)  #注意產生的文件編號的數值寬度
55                     newimg.save(path2)
56 
57 def test(*a,**b):
58     print len(a),b
59 #test(1,2,3,k=100)
60 
61 if __name__=='__main__':
62     splitTile('layer1',1,'E:/NewGis/trunk/python/tile1','E:/NewGis/trunk/python/tile2',(512,512),(32,32))





放屁阿狗 2010-04-12 10:32 發表評論
]]>
tilecache_計算網格耗時(中國大圖,多縮放等級)http://www.shnenglu.com/socketref/archive/2010/04/12/112291.html放屁阿狗 放屁阿狗 Mon, 12 Apr 2010 02:27:00 GMThttp://www.shnenglu.com/socketref/archive/2010/04/12/112291.htmlhttp://www.shnenglu.com/socketref/comments/112291.htmlhttp://www.shnenglu.com/socketref/archive/2010/04/12/112291.html#Feedback0http://www.shnenglu.com/socketref/comments/commentRss/112291.htmlhttp://www.shnenglu.com/socketref/services/trackbacks/112291.html 1 # -*- coding:utf-8 -*-
 2 
 3 #計算的網格數量
 4 
 5 import sys, traceback,threading,time,struct,os,os.path,shutil,distutils.dir_util,array,base64,zlib
 6 
 7 DPI= 90.0 #每英寸的像素數量
 8 METRER_PER_INCH = 2.54 /100.0  #每英寸多少米
 9 PIXEL_WIDTH = METRER_PER_INCH / DPI #每個象素多少米
10 
11 METERS_PER_DEGREE = 1862 * 60
12 
13 SCALE = 100000 #縮放比
14 
15 GEO_RECT = (70,10,134,60)
16 
17 = (GEO_RECT[2]-GEO_RECT[0]) * METERS_PER_DEGREE
18 = (GEO_RECT[3]-GEO_RECT[1]) * METERS_PER_DEGREE
19 
20 TILE_WIDTH = 1024*4   #圖塊規格
21 TILE_HEIGHT = TILE_WIDTH
22 RENDER_TILE_TIME = 1
23 
24 
25 ynum = h / (TILE_HEIGHT*PIXEL_WIDTH*SCALE) # SCALE 縮放比例下tile規格的數量
26 xnum = w /(TILE_WIDTH*PIXEL_WIDTH*SCALE) # tile的列數量
27 print "scale:%s,tiles(%s,%s)"%(SCALE,int(xnum),int(ynum))
28 print u"總圖塊數量:",xnum*ynum,u"消耗時長",xnum*ynum*RENDER_TILE_TIME/3600.0,u"小時(每圖塊耗時%s秒)"%RENDER_TILE_TIME
29 
30 #-----------------------------------------
31 RESOLUTION = 0.000018 #顯示精度 每像素多少度
32 #RESOLUTION = 0.0003 #顯示精度 每像素多少度
33 SCALE = RESOLUTION * METERS_PER_DEGREE / PIXEL_WIDTH #計算顯示比例
34 ynum = h / (TILE_HEIGHT*PIXEL_WIDTH*SCALE) # SCALE 縮放比例下tile規格的數量
35 xnum = w /(TILE_WIDTH*PIXEL_WIDTH*SCALE) # tile的列數量
36 ynum = int(ynum)
37 xnum = int(xnum)
38 print xnum,ynum, TILE_WIDTH*PIXEL_WIDTH*SCALE 
39 print str(RESOLUTION),"scale:%s,tiles(%s,%s)"%(SCALE,int(xnum),int(ynum))
40 
41 print u"總圖塊數量:",xnum*ynum,u"消耗時長",xnum*ynum*RENDER_TILE_TIME/3600.0,u"小時(每圖塊耗時%s秒)"%RENDER_TILE_TIME
42 


放屁阿狗 2010-04-12 10:27 發表評論
]]>
WebGis::數據處理http://www.shnenglu.com/socketref/archive/2010/02/07/107423.html放屁阿狗 放屁阿狗 Sun, 07 Feb 2010 02:52:00 GMThttp://www.shnenglu.com/socketref/archive/2010/02/07/107423.htmlhttp://www.shnenglu.com/socketref/comments/107423.htmlhttp://www.shnenglu.com/socketref/archive/2010/02/07/107423.html#Feedback0http://www.shnenglu.com/socketref/comments/commentRss/107423.htmlhttp://www.shnenglu.com/socketref/services/trackbacks/107423.html去年3個月時間啟動swMap開發計劃,就是使用這份地圖,目的是重新設計地圖引擎,考慮支持嵌入式環境,桌面和web地圖的需求,
開發語言c++,地圖處理采用python+postgis
python現在成了手頭開發、管理、協作的第一號助手,幾乎沒有特定要求的需求全部采用python

在家干了半年的工作成果和流程:
1. tab2tab : 將 mif轉換成tab文件
2. ogr2gr 將tab轉換成shp
3. arcgis9.1對shp進行驗證和修復,這一步非常重要,在之后采用geos進行集合計算時,如果錯誤的圖元導致很多操作的失敗
4. shp2pgsql,psql 將shp導入postgis數據庫
5. python對數據進行過濾,修正,裁剪
6. python加工地圖數據存儲到自己設計的地圖存儲文件中(網格存儲)
7. wxwidgets開發地圖渲染服務器,提供web、ice、socket訪問接口,并實現wms,wfs一些基本協議功能
8. 開發前端flex地圖顯示組件,類似google map flex一樣提供cache buffered功能,使地圖顯示來得更平滑
9. openlayers開發展示前端,通過wms訪問swMapserver
10.最終疊加不同的應用,jquery/django/pgsql開發webservice應用

至今未加入消鋸齒、Halo等繪制效果,繪制道路還有不太美觀,實在是沒時間
計劃增加遠程視頻



放屁阿狗 2010-02-07 10:52 發表評論
]]>
地圖比例計算http://www.shnenglu.com/socketref/archive/2009/09/26/97269.html放屁阿狗 放屁阿狗 Fri, 25 Sep 2009 21:45:00 GMThttp://www.shnenglu.com/socketref/archive/2009/09/26/97269.htmlhttp://www.shnenglu.com/socketref/comments/97269.htmlhttp://www.shnenglu.com/socketref/archive/2009/09/26/97269.html#Feedback0http://www.shnenglu.com/socketref/comments/commentRss/97269.htmlhttp://www.shnenglu.com/socketref/services/trackbacks/97269.html地圖比例表:
G_SCALE_UNITS=[ 0.200000,
                                0.600000,
                                1.000000,
                                2.000000,
                                4.000000,
                                8.000000,
                                15.000000,
                                30.000000,
                                60.000000,
                                120.000000,
                                300.000000,
                                600.000000,
                                1200.000000,
                                2000.000000,
                                3000.000000,
                                5000.000000]
表示 1個像素代表0.2米
屏幕通常的DPI 是每英寸 96像素
每英寸 2.54厘米
這樣就能換算出顯示比例了:  0.2*100/2.54*96 = 755.9 = 756
也就是顯示比例是 1:756




放屁阿狗 2009-09-26 05:45 發表評論
]]>
地圖路名的計算繪制http://www.shnenglu.com/socketref/archive/2009/09/25/97191.html放屁阿狗 放屁阿狗 Thu, 24 Sep 2009 19:09:00 GMThttp://www.shnenglu.com/socketref/archive/2009/09/25/97191.htmlhttp://www.shnenglu.com/socketref/comments/97191.htmlhttp://www.shnenglu.com/socketref/archive/2009/09/25/97191.html#Feedback0http://www.shnenglu.com/socketref/comments/commentRss/97191.htmlhttp://www.shnenglu.com/socketref/services/trackbacks/97191.html基本完成了道路的曲線繪制

google的Skia看了看,似乎比cario更輕量級,不過文檔也是只能通過doxygen來看了,資料還是太少,還是用cairo來小鋸齒吧

選擇一個好的字體也許效果會好很多

等著下一版本的優化結果




放屁阿狗 2009-09-25 03:09 發表評論
]]>
激情伊人五月天久久综合 | 伊人久久精品无码av一区| 久久精品国产99国产精品导航| 热re99久久精品国99热| 久久这里只有精品久久| 欧美亚洲国产精品久久高清| 精品免费久久久久久久| 久久综合九色综合欧美就去吻| 无码日韩人妻精品久久蜜桃| 中文字幕成人精品久久不卡| 精品国产乱码久久久久软件| 国内精品久久久久久久亚洲| 久久久亚洲欧洲日产国码二区| 日本精品久久久久影院日本| 97久久香蕉国产线看观看| 色狠狠久久综合网| 精品久久久久中文字| 2020久久精品国产免费| 国产A三级久久精品| 欧美成a人片免费看久久| 777久久精品一区二区三区无码| AV无码久久久久不卡蜜桃| 久久久精品久久久久久| 99久久成人18免费网站| 久久久精品国产sm调教网站| 亚洲级αV无码毛片久久精品| 午夜视频久久久久一区 | 久久久老熟女一区二区三区| 久久久久99这里有精品10| 久久伊人亚洲AV无码网站| 久久精品国产99久久丝袜| 久久九九亚洲精品| 久久精品国产只有精品2020| 久久精品国产免费| 日本三级久久网| 99久久精品这里只有精品| 久久精品国产一区| 97精品伊人久久久大香线蕉| 国产—久久香蕉国产线看观看| 国产精品成人无码久久久久久 | 亚洲精品白浆高清久久久久久|