轉(zhuǎn)帖|使用教程|編輯:我只采一朵|2014-09-03 09:35:39.000|閱讀 1074 次
概述:本文介紹如何在 Xamarin.iOS 項(xiàng)目中使用 ArcGIS Server 云端專題數(shù)據(jù)
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
本文介紹如何在 Xamarin.iOS 項(xiàng)目中使用 ArcGIS Server 云端專題數(shù)據(jù),假設(shè)你已經(jīng)準(zhǔn)備好了 和 綁定項(xiàng)目。
ArcGIS API 提供的專題圖層 () 可以用來(lái)訪問(wèn)并編輯矢量地圖數(shù)據(jù),它依賴于 ArcGIS 服務(wù)器專題服務(wù) (Feature Service) , 專題服務(wù)不僅可以瀏覽和編輯數(shù)據(jù), 還可以使用類似 SQL 的語(yǔ)法對(duì)數(shù)據(jù)進(jìn)行過(guò)濾, 專題服務(wù)可以托管在 ESRI 的 ArcGIS Online 云中, 也可以部署在自己的服務(wù)器上。 本文中使用的是 ArcGIS Online 的專題服務(wù)。
添加專題服務(wù)圖層是非常簡(jiǎn)單的, 只要初始化一個(gè) 圖層實(shí)例并把它添加到地圖上就可以了, 要初始化一個(gè)圖層 , 你需要知道專題服務(wù)的 URL 和訪問(wèn)服務(wù)所需的用戶憑據(jù), 而本文中使用專題服務(wù)是公開的, 因此不需要任何憑據(jù)。 將圖層添加到地圖上之后, 你需要使用自定義符號(hào)將圖層的數(shù)據(jù)在地圖上顯示成藍(lán)色的小圓點(diǎn)。
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"); // 自定義符號(hào) 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); }
在這一節(jié)中, 允許用戶從列表中選擇一個(gè)國(guó)家。 要完成這個(gè)功能, 需要在界面上添加一個(gè)按鈕, 并將按鈕的 Touch Up Inside 事件連接到方法 ShowCountryPicker :
當(dāng)用戶點(diǎn)擊按鈕時(shí), 會(huì)調(diào)用 View Controller 的 ShowCountryPicker 方法, 在這個(gè)方法中, 我們初始化一個(gè) UIPickerView 并把它顯示在屏幕上, 要顯示國(guó)家列表, 則需要指定數(shù)據(jù)源并實(shí)現(xiàn) UIPickerViewDataSource 協(xié)議中定義的方法, 為了能收到用戶選擇的選項(xiàng), 還需要實(shí)現(xiàn) UIPickerViewDelegate 協(xié)議中定義的 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
我們現(xiàn)在來(lái)完成高亮顯示屬于用戶選擇的國(guó)家的數(shù)據(jù)。
首先得到的是用戶選擇的國(guó)家, 如果用戶選擇了 None 的話, 清空專題圖層選中的數(shù)據(jù); 否則, 使用類似于 SQL 的語(yǔ)法 COUNTRY = <selected_country> 來(lái)選中專題圖層的數(shù)據(jù)。 不過(guò)在進(jìn)行選中操作之前, 需要設(shè)置專題圖層選中數(shù)據(jù)的符號(hào), 比如設(shè)置選中的數(shù)據(jù)在地圖上顯示為紅色的原點(diǎn); 同時(shí)還需要設(shè)置圖層的 queryDelegate , 實(shí)現(xiàn) AGSFeatureLayerQueryDelegate 協(xié)議定義的方法, 這樣當(dāng)選擇操作完成時(shí),才能收到通知。
#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
好了, 現(xiàn)在可以運(yùn)行一下這個(gè)測(cè)試程序, 如果沒有錯(cuò)誤的話, 看到下面的程序截圖:
點(diǎn)擊按鈕時(shí), 屏幕截圖如下:
選擇 US 時(shí), 截圖如下:
本文轉(zhuǎn)自張志敏的技術(shù)專欄
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn