這一節來對Silverlight API(ArcGIS API for Silverlight,下同)的開發有個總體的認識。
欲善其事先利其器。要做開發,第一步就得搭建環境。因為是在Siverlight基礎上做開發,所以先得整理好Siverlight的開發環境。Silverlight並沒有內建在VS2008中,而是作為add-on的形式附加的。在這裡可以找到詳細的安裝步驟:
下載 (97.87 KB)2009-4-8 14:59
說明一下,步驟1安裝了Silverlight add-on(要求有IDE的SP1補丁包);步驟2安裝的是ExpressionStudio中的ExpressionBlend,這個工具相當於可視化的xaml編輯器,可以用來輕鬆的建立Silverlight程式的使用者介面;步驟3中安裝的是Silverlight一種非常華麗的圖片處理效果,可以參看這裡的執行個體;步驟4包括一些可用的Silverlight控制項和例子。接下來再去看看Silverlight API的要求。可以看出對於開發ArcGIS Silverlight程式來說,只有步驟1是必須的,其他都是可選的。之後需要從ESRI網站下載Silverlight API(需要免費註冊一個ESRI Global賬戶),以備後用。
總結一下最常見的安裝步驟:1、安裝VS2008;2、安裝VS2008 SP1;3、安裝Silverlight Tools for Visual Studio 2008 SP1。到此,就可進行Silverlight程式的開發了。關於開發環境的搭建,還可以參考yyilyzbc版主的文章。(做Silverlight API的開發不需要在自己的機器上安裝ArcGIS Server,可直接使用ArcGIS Online上的資料;但如果要添加自己的資料,當然還是需要ArcGIS Server了)
下面就來一個Hello World吧,對於GIS來說,理所當然就是展示一張漂亮的世界地圖了。具體步驟如下:
1、VS2008中,建立project,選擇Silverlight Application;
2、在出現的提示框中選擇Add a new ASP.NET Web project to the solution to hostSilverlight;(Silverlight程式與flash一樣,相當於網頁中的一個外掛程式。第一個選項是將Silverlight嵌入到一個ASP.NET網站中,第二個選項是將Silverlight嵌入到一個臨時的html頁面中)
3、添加Silverlight API的引用:與.NET程式開發一樣,add reference(注意是在Silverlight工程上而不是ASP.NET工程上),找到從ESRI下載的API,選擇添加ESRI.ArcGIS.dll;
4、開啟Page.xaml,在UserControl標籤中添加一句引用,在Grid標籤之間添加一些代碼,完成後看起來像這樣:
- <UserControl x:Class="SilverlightApplication1.Page"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:esri="clr-namespace:ESRI.ArcGIS;assembly=ESRI.ArcGIS"
- Width="400" Height="300">
- <Grid x:Name="LayoutRoot" Background="White">
- <esri:Map x:Name="mymap">
- <esri:Map.Layers>
- <esri:ArcGISTiledMapServiceLayer ID="layerworldmap"
- Url="http://server.arcgisonline.com/ArcGIS/rest/services/ESRI_Imagery_World_2D/MapServer" />
- </esri:Map.Layers>
- </esri:Map>
- </Grid>
- </UserControl>
複製代碼
5、按F5,運行程式,就完成了我們的hello world in
GIS可以在瀏覽器中看到下面的畫面:
下載 (40.67 KB)2009-4-8 14:59
看到效果之後,再來對它進行理解吧。
先說下Silverlight的程式的基本背景。page.xaml實際上是一個控制項,相當於asp.net中的default.aspx,大部分的工作都在這裡面完成(app.xaml相當於global.asax);上面的是xaml(讀:[ig`zeml])代碼,是微軟針對wpf/silverlight的標記語言,與flex中的mxml類似。Silverlight程式中所有的布局工作都是由xaml來完成的;Silverlight2中,VS2008可以即時對xaml的效果做預覽,但是這個預覽效果是唯讀,對於預覽中的控制項也不可選;為了彌補這個缺陷,可以用前面提到的ExpressionBlend來可視化地設計程式介面,會自動產生對應的xaml代碼,使用於複雜的布局和美化工作(可參考Silverlight中的clock例子);再看page.xaml。usercontrol標籤(頁面的根項目)證明了page.xaml實際上是一個控制項類;下面的幾句相當於引入了xml的特定命名空間,裡麵包括了我們的ESRI.ArcGIS;width和height指明了Silverlight控制項本身的尺寸,一般我們將這裡的width和height屬性去掉,已達到全屏的效果(你也可以試試哦);Grid標籤是布局控制項,相當於html中的表格,可以進行靈活的頁面配置,xaml中常用的布局控制項還有Canvas和StackPanel;每一個xaml的Control都可以有一個x:Name屬性,以便在code-behind頁面中對其引用。
之後是我們的主角了。Map標籤(繼承自xaml的Control)相當於一個Map控制項,可以在其中加入圖層;這裡我們添加了一個ArcGISTiledMapServiceLayer圖層(在後面的文章中會專門講到SilverlightAPI中的圖層類型),對應使用的是ArcGIS Server發布的經過cache的服務,作為用戶端的API,同JavaScript與FlexAPI一樣,都是通過REST方式對資源和操作進行引用的;對這個圖層,賦予了一個ID屬性,因為SilverlightAPI中的圖層是從xaml中的DependencyObject繼承而來,所以沒有x:Name的屬性,為了方便在code-behind(與asp.net類似的Managed 程式碼)的代碼中找到這個圖層,便使用了ID屬性;URL的內容便是ArcGIS Online發布好的一個世界地圖資源。
到此,應該對這個例子理解的差不多了。如果還想再添加一個圖層怎麼辦呢?沒錯,就是在Map標籤中再添加一個layer,不過要注意的是,第一個加入的圖層會顯示在最下面,並且決定了整個Map控制項的空間參考資訊。
大家自然會想到疊加一個自己的資料圖層來看看效果,於是對Map標籤內容做了修改(china是本機發布的一個中國地圖):
- <esri:ArcGISDynamicMapServiceLayer ID="chinamaplayer"
- Url="http://localhost/ArcGIS/rest/services/china/MapServer" />
複製代碼
運行後卻還是只有世界地圖一個圖層(已經確保拼字、大小寫正確),怎麼回事呢?來用事件協助尋找錯誤吧。
Silverlight能夠利用.net的一些核心庫內容,包括事件。來對剛才的那個圖層添加一個事件:InitializationFailed,當圖層添加失敗的時候會出發這個事件。添加這個事件的處理也非常簡單:在上面的圖層中加入InitializationFailed屬性,會提示你產生新的eventhandler,預設斷行符號,看上去像這樣:
- <esri:ArcGISDynamicMapServiceLayerID="chinamaplayer"InitializationFailed="ArcGISDynamicMapServiceLayer_InitializationFailed"
- Url="http://localhost/ArcGIS/rest/services/china/MapServer" />
複製代碼
在事件上面按右鍵,Navigate to Event Handler,就會進入前面所說的code-behind頁面(本例為C#),添加以下代碼:
- private void ArcGISDynamicMapServiceLayer_InitializationFailed(object sender, EventArgs e)
- {
- ESRI.ArcGIS.Layer layer = sender as ESRI.ArcGIS.Layer;
- MessageBox.Show(layer.InitializationFailure.Message);
- }
複製代碼
然後運行程式,會得到初始化圖層失敗的原因:
下載 (21.89 KB)2009-4-8 14:59
原來,為了安全原因考慮,同flash一樣,Silverlight對跨域訪問也做了嚴格的限制。要解決這個問題,可以參考說明中的說明,將兩個xml檔案儲存在網站根目錄,比如C:\Inetpub\wwwroot中即可(其實儲存其中一個就可以了,ArcGISOnline已經將兩個xml檔案都放在了網站根目錄中,所以我們可以引用上面的服務)。
看下最後的效果吧。
下載 (120.4 KB)2009-4-8 14:59
為了更好的理解xaml和Silverlight,建議首先獨立完成Silverlight協助中的兩個workthrough:hello world和clock。
原文地址:http://bbs.esrichina-bj.cn/ESRI/thread-44042-1-1.html
原作者:diligentpig