zoukankan      html  css  js  c++  java
  • 《ArcGIS Runtime SDK for .NET开发笔记》--在线编辑

    介绍

    ArcGIS可以发布具有编辑功能的Feature Service。利用Feature Service我们可以实现对数据的在线编辑。 
    数据制作参考: 
    https://server.arcgis.com/zh-cn/server/latest/get-started/windows/tutorial-set-up-feature-service-data-for-offline-use.htm

    实现

    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>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    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>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    功能

    主要是对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);
            }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144

    代码下载

  • 相关阅读:
    Gray Code
    Search a 2D Matrix
    Find Minimum in Rotated Sorted Array
    Feign理解
    Ribbon描述
    eureka自定义instance Id
    eureka开启用户认证
    idea创建Eureka consumer入门实例
    eureka描述
    activeMq的安全机制
  • 原文地址:https://www.cnblogs.com/telwanggs/p/6437227.html
Copyright © 2011-2022 走看看