轉帖|使用教程|編輯:我只采一朵|2014-09-03 09:35:39.000|閱讀 1074 次
概述:本文介紹如何在 Xamarin.iOS 項目中使用 ArcGIS Server 云端專題數據
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
本文介紹如何在 Xamarin.iOS 項目中使用 ArcGIS Server 云端專題數據,假設你已經準備好了 和 綁定項目。
ArcGIS API 提供的專題圖層 () 可以用來訪問并編輯矢量地圖數據,它依賴于 ArcGIS 服務器專題服務 (Feature Service) , 專題服務不僅可以瀏覽和編輯數據, 還可以使用類似 SQL 的語法對數據進行過濾, 專題服務可以托管在 ESRI 的 ArcGIS Online 云中, 也可以部署在自己的服務器上。 本文中使用的是 ArcGIS Online 的專題服務。
添加專題服務圖層是非常簡單的, 只要初始化一個 圖層實例并把它添加到地圖上就可以了, 要初始化一個圖層 , 你需要知道專題服務的 URL 和訪問服務所需的用戶憑據, 而本文中使用專題服務是公開的, 因此不需要任何憑據。 將圖層添加到地圖上之后, 你需要使用自定義符號將圖層的數據在地圖上顯示成藍色的小圓點。
public override void ViewDidLoad() { base.ViewDidLoad(); // 添加地圖底圖 var url = NSUrl.FromString("//services.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Base/MapServer"); var tiledLayer = AGSTiledMapServiceLayer.TiledMapServiceLayerWithURL(url); this.MapView.AddMapLayer(tiledLayer, "Basemap Tiled Layer"); // 專題圖層 var featureLayerUrl = NSUrl.FromString("//services.arcgis.com/oKgs2tbjK6zwTdvi/arcgis/rest/services/Major_World_Cities/FeatureServer/0"); var featureLayer = AGSFeatureLayer.FeatureServiceLayerWithURL(featureLayerUrl, AGSFeatureLayerMode.OnDemand); featureLayer.OutFields = new string[] { "*" }; this.MapView.AddMapLayer(featureLayer, "CloudData"); // 自定義符號 AGSSimpleMarkerSymbol featureSymbol = AGSSimpleMarkerSymbol.SimpleMarkerSymbolWithColor(UIColor.FromRGBA(0f, 0.46f, 0.68f, 1f)); featureSymbol.Size = new SizeF(7, 7); featureSymbol.Style = AGSSimpleMarkerSymbolStyle.Circle; //featureSymbol.Outline featureLayer.Renderer = AGSSimpleRenderer.SimpleRendererWithSymbol(featureSymbol); }
在這一節中, 允許用戶從列表中選擇一個國家。 要完成這個功能, 需要在界面上添加一個按鈕, 并將按鈕的 Touch Up Inside 事件連接到方法 ShowCountryPicker :
當用戶點擊按鈕時, 會調用 View Controller 的 ShowCountryPicker 方法, 在這個方法中, 我們初始化一個 UIPickerView 并把它顯示在屏幕上, 要顯示國家列表, 則需要指定數據源并實現 UIPickerViewDataSource 協議中定義的方法, 為了能收到用戶選擇的選項, 還需要實現 UIPickerViewDelegate 協議中定義的 pickerView:didSelectRow:inComponent: 方法。
partial void ShowCountryPicker(UIButton sender) { if (this.Countries == null) { this.Countries = new string[] { @"None",@"US",@"Canada",@"France",@"Australia",@"Brazil" }; } var pickerSheet = new UIActionSheet(new RectangleF(0, 0, 320, 410)); pickerSheet.ShowInView(this.View); pickerSheet.Bounds = new RectangleF(0, 0, 320, 410); var countryPicker = new UIPickerView(pickerSheet.Bounds); countryPicker.WeakDelegate = this; countryPicker.DataSource = this; countryPicker.ShowSelectionIndicator = true; pickerSheet.AddSubview(countryPicker); } #region "UIPickerview DataSource Part" [Export("numberOfComponentsInPickerView:")] public int GetComponentCount(UIPickerView picker) { return 1; } [Export("pickerView:numberOfRowsInComponent:")] public virtual int GetRowsInComponent(UIPickerView picker, int component) { return this.Countries.Length; } [Export("pickerView:titleForRow:forComponent:")] public virtual string GetTitle(UIPickerView picker, int row, int component) { return this.Countries[row]; } #endregion #region "UIPickerview Delegate Part" [Export("pickerView:didSelectRow:inComponent:")] public virtual void Selected(UIPickerView picker, int row, int component) { // Dismiss action sheet var pickerSheet = (UIActionSheet)picker.Superview; pickerSheet.DismissWithClickedButtonIndex(0, true); } #endregion
我們現在來完成高亮顯示屬于用戶選擇的國家的數據。
首先得到的是用戶選擇的國家, 如果用戶選擇了 None 的話, 清空專題圖層選中的數據; 否則, 使用類似于 SQL 的語法 COUNTRY = <selected_country> 來選中專題圖層的數據。 不過在進行選中操作之前, 需要設置專題圖層選中數據的符號, 比如設置選中的數據在地圖上顯示為紅色的原點; 同時還需要設置圖層的 queryDelegate , 實現 AGSFeatureLayerQueryDelegate 協議定義的方法, 這樣當選擇操作完成時,才能收到通知。
#region "UIPickerview Delegate Part" [Export("pickerView:didSelectRow:inComponent:")] public virtual void Selected(UIPickerView picker, int row, int component) { var countryName = this.Countries[row]; var featureLayer = (AGSFeatureLayer)this.MapView.MapLayerForName("CloudData"); if (featureLayer.SelectionSymbol == null) { // SYMBOLOGY FOR WHERE CLAUSE SELECTION var selectedFeatureSymbol = AGSSimpleMarkerSymbol.SimpleMarkerSymbolWithColor(UIColor.FromRGBA(0.78f, 0.3f, 0.19f, 1f)); selectedFeatureSymbol.Style = AGSSimpleMarkerSymbolStyle.Circle; selectedFeatureSymbol.Size = new SizeF(10, 10); featureLayer.SelectionSymbol = selectedFeatureSymbol; } if (featureLayer.WeakQueryDelegate == null) { featureLayer.WeakQueryDelegate = this; } if (countryName == "None") { // CLEAR SELECTION featureLayer.ClearSelection(); } else { var selectQuery = AGSQuery.Query(); selectQuery.Where = string.Format("COUNTRY = '{0}'", countryName); featureLayer.SelectFeaturesWithQuery(selectQuery, AGSFeatureLayerSelectionMethod.New); } // Dismiss action sheet var pickerSheet = (UIActionSheet)picker.Superview; pickerSheet.DismissWithClickedButtonIndex(0, true); } #endregion #region "AGSFeature Query Delegate part" [Export("featureLayer:operation:didSelectFeaturesWithFeatureSet:")] public virtual void DidSelectFeaturesWithFeatureSet(AGSFeatureLayer featureLayer, NSOperation op, AGSFeatureSet featureSet) { AGSMutableEnvelope env = null; foreach (var selectedFature in featureSet.Features) { if (env != null) { env.UnionWithEnvelope(selectedFature.Geometry.Envelope); } else { env = (AGSMutableEnvelope)selectedFature.Geometry.Envelope.MutableCopy(); } } this.MapView.ZoomToGeometry(env, 20, true); } #endregion
好了, 現在可以運行一下這個測試程序, 如果沒有錯誤的話, 看到下面的程序截圖:
點擊按鈕時, 屏幕截圖如下:
選擇 US 時, 截圖如下:
本文轉自張志敏的技術專欄
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn