作為ESRI的平台的一份子arcgis api for silverlight,自然與ESRI的其它産品有聯系。上一篇我們做了一個地圖浏覽的程式,它的确很簡單。隻是有一點不大明白: <esri:ArcGISTiledMapServiceLayer ID="MyLayer" Url="http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer" />這個是什麼意思。想弄明白這個問題,我們就不得不提到圖層的概念。
ArcGISTiledMapServiceLayer:是緩存圖層,通過預先将地圖資料切片緩存在伺服器硬碟,用戶端通路時服務會根據其目前通路區域計算出顯示的圖檔傳回給用戶端。用戶端就可以看到地圖了,其實是幾張圖檔組合起來的。
ArcGISDynamicMapServiceLayer:是動态圖層,動态圖層是預先沒有切片的,用戶端通路時服務會根據其通路的區域實時生成一張圖檔傳回給用戶端。這個明顯的速度上就比不過做了緩存的圖層。
是以,明顯的一般作為基礎資料的地圖(比如上海市基礎圖),我們就可以把它釋出成緩存地圖,因為基礎圖一般不會變動,那麼我們就預先切片緩存;而為了滿足自己業務需求的專題地圖(比如電力行業路燈資訊等),就作為動态圖層釋出,以為這些資訊時經常變動的,做緩存明顯沒有意義。
當然,這兩個圖層是可以疊加在一起的。也正是這樣,就可以滿足我們一般的地圖開發功能。下面就是一段疊加的例子:
<esri:Map x:Name="MyMap" WrapAround="True">
<esri:ArcGISTiledMapServiceLayer ID="StreetMapLayer"
Url="http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer"
InitializationFailed="Layer_InitializationFailed" />
<esri:ArcGISDynamicMapServiceLayer ID="DynamicLayer"
Url="http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Earthquakes/RecentEarthquakesRendered/MapServer"
</esri:Map>
下面系統總結一下arcgis api for silverlight中圖層的結構
Layer
|--TiledMapServiceLayer
| |--ArcGISTiledMapServiceLayer
|--DynamicLayer
| |--DynamicMapServiceLayer
| |--ArcGISDynamicMapServiceLayer
| |--ArcGISImageServiceLayer
| |--GPResultImageLayer
|--GraphicsLayer
| |--FeatureLayer
|--ElementLayer
1、Layer:
繼承自Silverlight中的DependencyObject,并實作了INotifyPropertyChanged接口,是Silverlight API中其他圖層的基類。
2、TiledMapServiceLayer:
繼承自Layer,是所有使用了緩存的地圖服務的基類。通過它可以在程式中加入經過緩存的,來自不同資料源的地圖服務。比如ArcGIS Server的地圖服務,Google Map的地圖,Virtual Earth的地圖等;
3、ArcGISTiledMapServiceLayer:
繼承自TiledMapServiceLayer。像上面說的一樣,這個圖層擴充了TiledMapServiceLayer,于是支援由ArcGISServer 9.3版本釋出的經過緩存的地圖服務。
4、DynamicLayer:
繼承自Layer,是動态地圖服務的基類;
5、DynamicMapServiceLayer:
繼承自DynamicLayer,對應于TiledMapServiceLayer,要使用未經過緩存的動态地圖服務,就得通過擴充這個圖層來實作。
6、ArcGISDynamicMapServiceLayer:
繼承自DynamicMapServiceLayer,針對ArcGIS Server9.3版本釋出的動态地圖服務。同理,如果要在用戶端API中使用其他動态地圖服務,比如OGC的WMS服務,則也需要像這個圖層一樣,擴充上面的DynamicMapServiceLayer來實作;
7、ArcGISImageServiceLayer:
繼承自DynamicMapServiceLayer,針對ArcGIS Server 9.3版本釋出的ImageService,因為影像服務也屬于動态的地圖服務。在用戶端API中,可以通過ArcGISImageServiceLayer的一些屬性,友善通過浏覽器來展示伺服器端的影像資料,比如通過BandIds屬性,可以快速調整影像資料顯示波段的組合(RGB通道),提供不同結果供使用者檢視。點選這裡http://serverapps.esri.com/javascript_examples/image_service_band_spinners.html,檢視一個執行個體;
8、GPResultImageLayer:
繼承自DynamicMapServiceLayer,針對Geoprocessing服務所産生的結果。可以請求伺服器端的GP服務将結果動态生成一張圖檔,将此圖檔作為GPResultImageLayer圖層直接添加到Map控件中;
9、GraphicsLayer:
繼承自Layer,這個圖層一般滿足我們與地圖互動時呈現的元素。比如拉框放大,我們能看見滑鼠所畫的一個矩形;又比如對興趣點的查詢,結果通常是将符合條件的興趣點的形狀高亮顯示等。我們做GPS位置跟蹤時,一般才用的也就是它。
10、FeatureLayer:
繼承自GraphicsLayer,這也是Silverlight API中的亮點之一,通過它可以完成一個比較炫的專題圖Renderer。
11、ElementLayer:
繼承自Layer,它可以用來專門呈現Silverlight中原生的FrameworkElement,比如視訊,音頻等。雖然在FillSymbol的Fill屬性中也能利用Brush類來展現一段視訊,但畢竟有些“小氣”,在ElementLayer中可以大大方方的放置Silverlight元素。你可能會問,在Map控件之外,Grid等布局元素中不是也能放置Silverlight的東西嗎,為什麼要放在ElementLayer裡呢?其實有個問題經常困擾GIS開發人員,就是想讓一些非地理資料元素随着地圖範圍的變化(放大,縮小,平移)而變化,而無須自己在Extent變化後重新計算用戶端坐标,手工改變這些元素的位置。瞧,ElementLayer正解決了這個問題。
圖層那麼多,我們重點關注紅色标記的圖層,一般的GIS開發就夠用了。