文章目錄
寫作本文的起因:
前兩天偶然自己想瞭解一下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的資源中心已經有人完成了這部分工作,並提供了相應的下載:
http://resources.arcgis.com/zh-cn/gallery/file/arcobjects-net-api/details?entryID=87BEC705-1422-2418-34B5-308930DE323A
在該文檔中有詳細的使用說明,並提供了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端如何擷取高程資料了。具體過程將在下篇給出。歡迎大家繼續關注。
(著作權,轉載請標明出處)