轉帖|其它|編輯:郝浩|2011-02-18 12:04:31.000|閱讀 1773 次
概述:第一步,把shp文件導入到sqlserver里。在這里,我使用了sharpmap的庫,非常之簡單,一下子就導入進去了。導入進去表里,有四個字段,分別記錄了一個矢量圖形的上下左右四個頂點。在展示地圖的時候,通過where語句,把在視野內的矢量對象讀取出來就可以了。好么,這個徹底摧毀了我對空間數據庫的神秘感,我甚至懷疑這是不是太山寨了。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
第一步,把shp文件導入到sqlserver里。在這里,我使用了sharpmap的庫,非常之簡單,一下子就導入進去了。導入進去表里,有四個字段,分別記錄了一個矢量圖形的上下左右四個頂點。在展示地圖的時候,通過where語句,把在視野內的矢量對象讀取出來就可以了。好么,這個徹底摧毀了我對空間數據庫的神秘感,我甚至懷疑這是不是太山寨了。
說到這里,我估計大家誰都會讀取地圖數據了.下一步,把讀出來的矢量數據傳給silverlight.這個也簡單,webclient,輕松加愉快,不再廢話。
然后,由silverlight進行繪圖。人家silverlight干這個可是專業的,不過,這里問題來了,我小結下來問題:
對于上海市地圖那如同蜘蛛網一樣的路線,直接在前臺線程里繪圖,那你就完了。瀏覽器會直接掛死的。
方案一:異步繪圖。我是分析傳過來的矢量數據之后,不斷地生成UIELEMENT對象,然后追加到Canvas畫布上的。這里需要使用異步,也就是dispatcher.begininvoke() 來一次生成一個UIELEMENT,然后追加上去。追加完后,如果還有未生成的矢量圖形,那么就馬上再次調用begininvoke,直到繪制結束。
這樣有個問題,就是地圖確實是響應速度快了,但是會看到一個一個得元素如同在實時繪畫一般地一個一個畫上去,速度確實不夠快。不過效果很酷,呵呵
方案二:在后臺線程中,生成xaml,然后一次性解析并呈現。經比較,讓silverlight解析xaml的表現,明顯比動態添加uielement的表現強非常多。這也算是一個小發現。使用方案二,就可以解決繪圖效率問題。
問題二,數據傳輸的問題。上海地圖會傳輸非常大量的矢量數據過去。我抓包后看,發現這些文本信息的字節數居然比圖片還大 。這下我真的囧了,本來以為文本比圖片小,沒想到居然倒了過來。不過我們熟悉asp.net的人自然會馬上想到解決辦法:gzip壓縮。呵呵,這個簡單,馬上上網,抄了一段代碼貼進去,哈哈,馬上壓縮掉70%。
問題三,我們是否需要傳輸那么多的矢量點?由于我搞來的shp文件,精度很高,所以,在縮放比很大的時候,有些點傳輸了也沒有意義啊,因為根本就是都被壓縮到一個像素里去了。而且那些點的經緯度精確到了8位小數,但是事實上,對于像素來講,一般精確到3-4位小數就足夠了,所以服務器在傳數據的時候,完全可以壓縮掉這些信息。這樣,傳輸的數據量就更小了。現在經壓縮,數據量已小于圖片的數據量。而且是放的越大越小,和圖片正好相反。
現在還有問題是:服務器暫時無法利用緩沖,因為每次查詢的經緯度都不同,導致無法根據查詢字符串進行cache。 每次取數都要查詢20個圖層,也就是進行20次數據庫查詢,暫時沒有想出好的解決辦法。
現在的進度是,正在制作客戶端地圖編輯工具。
效果見圖:
目前階段性成果可以在這里看到 //211.136.156.198/newGIS
呵呵,別的我不說,至少地圖呈現的效果已經接近bing地圖了,嘿嘿,反正比公司買的那兩個引擎都要強很多。
在項目中使用silverlight的好處確實很多,原來要寫N多js的東西,輕輕松松就解決了,而且反正在項目中使用,也不用去考慮什么網站用戶沒安裝silverlight之類的,嘿嘿。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:網絡轉載