寫作本文的起因:
前兩天偶然自己想了解一下Web端的三維GIS開發,但是發現實現的過程非常麻煩,ArcGIS API For Flex和ArcGIS API ForSilverlight中都沒有提供3D的支持。
隨后在網上查了查資料,發現了這個例子:
http://maps.esri.com/sldemos/terrainmap/default.html
該示例實現了地圖的3D效果,且基於Silverlight。於是便開始分析該實例的源碼。下面的內容也算是自己在學習以上這個例子時的一點心得。在此和大家分享。
開始前的幾個問題:
1.高程數據怎樣獲得?
2.自己有了DEM高程數據,如何利用自己的DEM高程數據來渲染3D圖片?
3.高程數據如何對應到2D地圖上相應的位置?
4.利用高程數據實現地圖3D渲染的具體實現過程是怎樣的呢?
以上是本文涉及的是個小問題,也是筆者在學習3D Map之前一直困擾的問題,所以這也是本文將要解決的幾個問題。
實現過程的基本總結:
通過對源碼的分析,以及對Balder的學習,大致總結出了該示例實現的基本過程。
1.通過GIS服務提供高程數據,如果沒有高程數據那么3D就無從談起了。
2.獲得當前顯示的2D地圖的圖片,構建高程數據網格
3.調用高程數據的GIS服務,獲得高程網格對應的高程數據。
5.將3D模型的材質設置為2D下地圖的圖片。
4.結合開源的3D引擎 Balder,根據高程數據,開始渲染,最終得到3D效果。
下面的一幅圖給出上面的實現過程描述:
關於本文的說明:
1.本文的重點將放在3D視圖的具體過程,因為設計到的內容較多,所以不會對每一個細節都作具體的介紹。
2.關於Balder 3D引擎的內容不會在本文中詳解,如果您沒有3D的開發基礎(即從來沒有入手過3D),在此建議先了解Balder的基本使用。
強烈建議看看該博主的Balder的教程:
http://www.cnblogs.com/nowpaper/tag/silverlight%E6%8A%80%E6%9C%AF/
3.本文基於之前的給出的3D Map示例,所以本文提取了其中一些關鍵的代碼,希望原作者不要介意,本文沒有用於任何的商業活動,純粹用於技術交流。
4.作者也是3D Map的新手,歡迎一起交流,不喜勿噴。
首先我們來看一下如何獲得DEM高程數據,以及如何在ArcGIS Server發布自己的高程數據。
1.提供高程數據的實現。
因為利用現有的ArcGIS Server服務並不能實現提供高程數據的功能,因此這里需要利用到ArcGI的SOE擴展ArcGIS Server 服務,因此這要求我們自己辨析代碼來擴展現有的GIS功能。不過這里有一個好消息就是在ESRI的資源中心已經有人完成了這部分工作,並提供了相應的下載:
在該文檔中有詳細的使用說明,並提供了Silverlight,Flex等Web應用程序獲取高程數據的例子。
當完成擴展之后,我們會在GIS服務能力中多出了一項:Get Elevations,即表示提供高程數據的服務。
2.發布高程數據
完成ArcGIS Server的擴展功能之后,需要發布我們自己的高程數據。高程數據可以上這里下載:
http://datamirror.csdb.cn/index.jsp
這里提供了SRTM90米分辨率原始高程數據和30米分辨率數字高程數據。
獲得高程數據之后,在ArcMap中新建一個MXD文檔,然后將高程的柵格數據添加到MXD文檔中。這里還可以添加其他數據,但是高程數據只能從柵格數據中獲得。
保存MXD文檔,然后發布到ArcGIS Server.然后在服務能力中勾選Get Elevations.這樣我們便完成了提供高程數據服務的發布。
打開我們剛才發布的MXD文檔服務(Map Service)的地址,在最下面就會發現多出了一項,即支持的擴展功能:
完成獲取高程數據服務的發布之后,接下來就是在Web端如何獲取高程數據了。具體過程將在下篇給出。歡迎大家繼續關注。
(版權所有,轉載請標明出處)