1. 程式人生 > >《ArcGIS Runtime SDK for .NET開發筆記》--線上編輯

《ArcGIS Runtime SDK for .NET開發筆記》--線上編輯

介紹

實現

1.主介面

其中OutFields控制著屬性的編輯,*代表都可以寫入,也可以只填寫你需要編輯的屬性欄位。

    <Grid>
        <esri:MapView x:Name="MyMapView">
            <esri:Map x:Name="MyMap">
                <esri:ArcGISTiledMapServiceLayer x:Name="baseMap" ServiceUri="http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer"
/>
<esri:FeatureLayer ID="Incidents"> <esri:ServiceFeatureTable ServiceUri="http://localhost:6080/arcgis/rest/services/sichuan/test1/FeatureServer/0" OutFields="*"/> <!-- ServiceFeatureTable 中的 OutFields 控制著Attribute的編輯-->
</esri:FeatureLayer> </esri:Map> </esri:MapView> <StackPanel x:Name="headPanel" Orientation="Horizontal" Margin="20,20,0,0"> <!-- 繫結編輯按鈕--> <StackPanel x:Name="headPanelMid" DataContext="{Binding ElementName=MyMapView, Path=Editor}"
>
</StackPanel> </StackPanel> <Grid x:Name="centerGrid" Margin="200"></Grid> </Grid>

2.編輯

介面

<Grid>
        <StackPanel x:Name="UserEdit" Orientation="Horizontal">
            <Button Content="Edit"
                        Margin="2"
                        IsEnabled="False"
                        x:Name="EditButton"
                        Click="EditButton_Click" />
            <Button Content="Attribute"
                        Margin="2"
                        IsEnabled="False"
                        x:Name="AttributeButton"
                        Click="AttributeButton_Click" />
            <Button Content="Delete"
                        Margin="2"
                        IsEnabled="False"
                        x:Name="DeleteButton"
                        Click="EditButton_Click" />
            <Button Content="Draw"
                        Margin="2"
                        x:Name="DrawButton"
                        Click="DrawButton_Click" />

            <Button Content="Delete Vertex"
                        Margin="10,2,2,2"
                        Command="{Binding DeleteVertex}" />
            <Button Content="Undo"
                        Margin="2"
                        Command="{Binding Undo}" />
            <Button Content="Redo"
                        Margin="2"
                        Command="{Binding Redo}" />
            <Button Content="Complete"
                        Margin="2"
                        Command="{Binding Complete}" />
            <Button Content="Cancel"
                        Margin="2"
                        Command="{Binding Cancel}" />
        </StackPanel>
    </Grid>

功能

主要是對Featureservice的圖形進行編輯。
首先從Featureservice中獲取table,在table中進行一系列的操作。UpdateAsync修改的feature,DeleteAsync刪除,AddAsync新增。最後通過SaveResult()將編輯結果上傳到服務中。

public Edit()
        {
            InitializeComponent();
            GlobalApp.MyMapView.MapViewTapped += MyMapView_MapViewTapped;
        }
        private async void MyMapView_MapViewTapped(object sender, MapViewInputEventArgs e)
        {
            if (GlobalApp.MyMapView.Editor.IsActive)
                return;
            var layer = GlobalApp.MyMapView.Map.Layers["Incidents"] as FeatureLayer;
            layer.ClearSelection();
            SetGeometryEditor();
            string message = null;
            try
            {
                // Performs hit test on layer to select feature.
                var features = await layer.HitTestAsync(GlobalApp.MyMapView, e.Position);
                if (features == null || !features.Any())
                    return;
                var featureID = features.FirstOrDefault();
                layer.SelectFeatures(new long[] { featureID });
                var feature = await layer.FeatureTable.QueryAsync(featureID);
                SetGeometryEditor(feature);
            }
            catch (Exception ex)
            {
                message = ex.Message;
            }
            if (!string.IsNullOrWhiteSpace(message))
                MessageBox.Show(message);
        }
        private void SetGeometryEditor(Feature feature = null)
        {
            EditButton.Tag = feature;
            EditButton.IsEnabled = feature == null ? false : true;
            DeleteButton.IsEnabled = feature == null ? false : true;
            AttributeButton.IsEnabled = feature == null ? false : true;
            DrawButton.IsEnabled = feature == null ? true : false;
        }

        private async void EditButton_Click(object sender, RoutedEventArgs e)
        {
            var feature = (Feature)EditButton.Tag;
            var layer = GlobalApp.MyMapView.Map.Layers["Incidents"] as FeatureLayer;
            var table = (ArcGISFeatureTable)layer.FeatureTable;

            string which_Button = (sender as Button).Content.ToString();
            // Hides feature from feature layer while its geometry is being modified.
            layer.SetFeatureVisibility(layer.SelectedFeatureIDs, false);

            string message = null;
            try
            {
                // Enables geometry editing and update its geometry 
                // using GeometryEngine to correct ring orientation.

                if (which_Button == "Edit")
                {
                    var geometry = await GlobalApp.MyMapView.Editor.EditGeometryAsync(feature.Geometry);
                    feature.Geometry = GeometryEngine.Simplify(geometry);
                    await table.UpdateAsync(feature);
                    this.SaveResult(table);
                }
                if (which_Button == "Delete")
                {
                    await table.DeleteAsync(feature);
                    this.SaveResult(table);
                }   
                if (which_Button == "Attribute1")
                {
                    if (GlobalApp.mainwindow.centerGrid.Children != null)
                        GlobalApp.mainwindow.centerGrid.Children.Clear();
                    EditAttribute editAttribute = new EditAttribute(feature);
                    editAttribute.Height = 400;
                    editAttribute.Width = 400;
                    GlobalApp.mainwindow.centerGrid.Children.Add(editAttribute);
                }
            }
            catch (TaskCanceledException)
            {
                // Ignore TaskCanceledException - usually happens if the editor gets cancelled or restarted
            }
            catch (Exception ex)
            {
                message = ex.Message;
            }
            finally
            {
                layer.SetFeatureVisibility(layer.SelectedFeatureIDs, true);
                layer.ClearSelection();
                SetGeometryEditor();
            }
            if (!string.IsNullOrWhiteSpace(message))
                MessageBox.Show(message);
        }



        private async void DrawButton_Click(object sender, RoutedEventArgs e)
        {
            var layer = GlobalApp.MyMapView.Map.Layers["Incidents"] as FeatureLayer;
            var table = (ArcGISFeatureTable)layer.FeatureTable;
            GeodatabaseFeature feature = table.CreateNew();
            Esri.ArcGISRuntime.Geometry.Geometry addGeo = await GlobalApp.MyMapView.Editor.RequestShapeAsync(DrawShape.Polygon, null);
            feature.Geometry = addGeo;
            await table.AddAsync(feature.Attributes, addGeo);
            this.SaveResult(table);
        }

        private async void SaveResult(ArcGISFeatureTable table)
        {
            try
            {
                string message = null;
                if (table.HasEdits)
                {
                    if (table is ServiceFeatureTable)
                    {
                        var serviceTable = (ServiceFeatureTable)table;
                        // Pushes geometry edits back to the server.
                        var result = await serviceTable.ApplyEditsAsync();
                        if (result.UpdateResults == null || result.UpdateResults.Count < 1)
                            return;
                        var updateResult = result.UpdateResults[0];
                        if (updateResult.Error != null)
                            message = updateResult.Error.Message;
                    }
                }
            }catch(Exception e)
            {

            }
        }

        private void AttributeButton_Click(object sender, RoutedEventArgs e)
        {
            var feature = (Feature)EditButton.Tag;
            if (GlobalApp.mainwindow.centerGrid.Children != null)
                GlobalApp.mainwindow.centerGrid.Children.Clear();
            EditAttribute editAttribute = new EditAttribute(feature);
            editAttribute.Height = 400;
            editAttribute.Width = 300;
            GlobalApp.mainwindow.centerGrid.Children.Add(editAttribute);
        }

程式碼下載

相關推薦

ArcGIS Runtime SDK for .NET開發筆記》--線上編輯

介紹 實現 1.主介面 其中OutFields控制著屬性的編輯,*代表都可以寫入,也可以只填寫你需要編輯的屬性欄位。 <Grid> <esri:MapView x:Name="MyMapView"

ArcGIS Runtime SDK for .NET開發筆記》 --Hello Word

這裡我們將建立第一個用於顯示地圖的APP。 1.新建一個WPF程式 首先我們開啟Visual Studio,選擇新建專案。 選擇已安裝——模板——Windows桌面——WPF應用程式 2.新增Runtime SDK for .NET的引用

ArcGIS Runtime SDK for Android開發筆記》——(6)、基於Android Studio的ArcGIS Android工程結構解析

1、前言 Android Studio 是第一個Google官方的 Android 開發環境。其他工具,例如 Eclipse,在 Android Studio 釋出之前已經有了大規模的使用。為了幫助開發者轉向 Android Studio,谷歌已經寫出一套遷移指南。Google 同時也釋出宣告稱,在接下來的

ArcGIS Runtime SDK for Android開發筆記》——資料製作篇:緊湊型切片製作(Server快取切片)

1、前言 在ArcGIS 10中出現了一種新的切片快取檔案格式:緊湊型儲存(Compact)。與之前的鬆散型儲存(Exploded)相比,它有遷移方便、建立更快、減少儲存空間等諸多優點,已經成為了現在建立切片快取的預設格式。 緊湊型切片儲存最主要的兩種檔案是bundle和b

ArcGIS Runtime SDK for Android開發筆記》——(2)、Android Studio基本配置與使用

1、前言  在上一篇文章《Android Studio下載與安裝》裡我們已經介紹了Android Studio的下載與安裝步驟,這一篇我們將針對Android Studio的基本常見使用做一個簡單介紹。 2、基本配置 2.1、主題設定 開啟File > Settings > Appearanc

ArcGIS Runtime SDK for .NET (WPF)實現三維場景

實現三維場景準備工作三維地圖被稱為場景。為在ArcGIS中實現三維場景展示,首先需安裝Esri公司ArcGIS_Runtime_SDK_DotNet_100_2_1地圖SDK。並在專案中引用Esri.ArcGISRuntime.dll。建立三維場景您可以使用XAML在設計時定

ArcGIS Runtime SDK for iOS開發系列教程(1)——開發前準備

      眾說周知,ArcGIS10.1徹底架起了端到雲的橋樑,使得空間資訊的創造者與使用者緊密相連。它給使用者帶來了更加簡易的操作方式,能夠實現隨時隨地對空間資訊的獲取和共享,可以讓任何人在任何地點以任何方式享用ArcGIS Online這個雲GIS平臺所提供的智

ArcGIS Runtime SDK for .NET 100.0中如何執行.gpk(二)

接上文,在編寫程式碼之前我們先回憶一下ArcMap中執行該指令碼工具的過程,首先我把一個Dem影像新增進來,然後我在該影像範圍內使用人機互動的方式畫了一條線,那麼我們在Runtime中也可以採用該思路:即首先載入該Dem影像(為了畫線時便於定位),然後map上畫

ArcGIS Runtime SDK for IOS 開發之啟程篇

   從事GIS學習有幾年的時間,而將IOS和GIS結合起來進行學習和研究正是筆者工作這半年多來所做的事情。其實剛開始就想以部落格的形式來記錄自己學習的心得和體會,但是總是被各種事情和藉口所耽誤,對於這種行為樓主也只能是無奈的呵呵了,不過本人有個特點,就是永遠堅信這麼一個原

ArcGIS Runtime SDK for iOS開發地圖圖層-圖形圖層

       建立圖形圖層        圖形圖層可以使你在地圖上動態的展示圖形。圖形圖層可以用來儲存使用者繪製的多邊形、線條,或者展示例如查詢或是地理編碼結果的屬性資訊。下圖中,圖形圖層用於突出展示每平方里超過200人的人口密度狀態:               當你想

ArcGIS Runtime SDK for .NET (Quartz Beta)之連線ArcGIS Portal (1)

1. 介紹 ArcGIS Portal作為ArcGIS平臺的中樞,在ArcGIS體系中起著至關重要的地位。在ArcGIS Runtime的新架構Quartz中添加了連線ArcGIS Portal(或ArcGIS Online),建立修改ArcG

ArcGIS Runtime SDK for iOS開發之-顯示你的位置

       在地圖上顯示你的位置        許多iOS裝置如iPod touch、iPad和iPhone提供了裝置的位置資訊。我們知道iOS包含了一個大家都很熟悉的CoreLocation框架,該框架為我們提供了位置獲取的功能,無論是通過Wi-Fi、蜂窩網路還是GPS

ArcGIS Runtime SDK for Android功能概述

部署 編輯 最短路徑 設備 下載 用戶 系統 幾何 和平   使用ArcGIS Runtime SDK for Android,用戶能夠開發出功能強大的移動端GIS應用程序並將它們部署到Android系統的智能手機和平板上,主要功能可覆蓋: 地圖瀏覽:實現常見的地圖縮放、

ArcGIS Runtime SDK for Android 無法顯示釋出的地圖

通過ArcMap釋出瓦片圖層,可以通過js的api訪問地圖顯示,但無法使用Android API載入地圖,通過除錯發現缺少瓦片資訊 如圖所示,需要在arcgis/manager/service.html?name=服務名.MapServer頁面裡,修改快取設定,改為使用快取

一、ArcGIS Runtime SDK for iOS 100.2.1教程系列之底圖與動態圖層載入

        由於arcgis的官網被牆,所以特意留了一個SDK包的下載地址:https://download.csdn.net/download/qq_31672459/10301377,安裝完成後的最後一步會有SDK所在目錄,以及demo的目錄。一般如下:~/Libra

ArcGIS Runtime SDK for WPF 10.2.5下載

  Func<string, string> func = delegate(string s)                 {                     return Encoding.UTF8.GetString(Convert.FromBase64String(s).Rev

ArcGIS Runtime SDK for Android 入門(9):通過PictureMarkerSymbol建立點符號

    本文主要簡單講解如何通過本地或線上資源的方式使用SimpleMarkerSymbol建立簡單的圖片點符號。 實現步驟: 1.建立Android專案    2.新增Runtime SDK依賴 3.新增許可權及OpenGL ES支援 在AndroidMani

ArcGIS Runtime SDK for WPF 初始化

event obj env pub ebo als geb 還需要 art 安裝包 管理nuget包 Esri.ArcGISRuntime.WPF 也許還需要 Esri.ArcGISRuntime.Hydrography Esri.ArcGISRuntime.LocalSe

ArcGIS Runtime SDK for Android 授權(arcgis android 去除水印)

要下載和安裝 ArcGIS Runtime SDK for Android,您需要註冊開發者賬戶,進而便擁有了訪問所有功能的許可權,從而實現開發和測試目的。但是,這種情況下,應用程式中的所有地圖都具有水印,並且在debug訊息中顯示,您的應用程式僅可用於開發目的。  

gvr sdk for unity 開發筆記

GazeInputModule是在Unity Editor下最容易測試的了,在跟隨gvr sdk for unity一起匯入的包裡,包含了一個GvrReticle這個預設體,這個預設體繫結一個指令碼GvrReticle.cs,開啟指令碼,可以看到它繼承有一個IGvrGaze