【ArcGIS Pro二次开发】(59):Editing(编辑)模块

这篇具有很好参考价值的文章主要介绍了【ArcGIS Pro二次开发】(59):Editing(编辑)模块。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ArcGIS Pro SDK中的"Editing"(编辑)模块提供了一系列API和工具,允许开发人员在ArcGIS Pro中实现各种地图数据编辑操作,从简单的要素绘制到复杂的数据集编辑。

下面列举一些常用编辑工具的实现方法。文章来源地址https://www.toymoban.com/news/detail-642478.html


1、获取所选要素的属性及赋值

// 获取当前所选择的要素
var selectedFeatures = MapView.Active.Map.GetSelection();
// 获取所选要素中的第一个(取单个要素)
var firstSelectionSet = selectedFeatures.ToDictionary().First();
// 创建【inspector】实例
var inspector = new Inspector();
// 将选定要素加载到【inspector】实例
inspector.LoadAsync(firstSelectionSet.Key, firstSelectionSet.Value);
// 获取要素属性或字段值
string xzmc = inspector["XZMC"].ToString();
var myGeometry = inspector.Shape;
// 给字段赋值
inspector["XZMC"] = "清凉镇";
// 执行编辑操作
inspector.ApplyAsync();

2、通过【inspector】获取字段属性

// 获取所选要素
var firstFeatureLayer = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault();
// 创建【inspector】实例
var inspector = new Inspector();
// 将选定要素加载到【inspector】实例
inspector.LoadSchema(firstFeatureLayer);

// 查看属性
foreach (var attribute in inspector)
{
    var fldName = attribute.FieldName;  // 字段名称
    var fldAlias = attribute.FieldAlias;  // 字段别名
    var fldType = attribute.FieldType;  // 字段类型
    int idxFld = attribute.FieldIndex;  // 字段序号
    var fld = attribute.GetField();  // 字段
    var isNullable = attribute.IsNullable;  // 是否可为空
    var isEditable = attribute.IsEditable;  // 是否可编辑
    var isVisible = attribute.IsVisible;  // 是否可见
    var isSystemField = attribute.IsSystemField;  // 是否系统字段
    var isGeometryField = attribute.IsGeometryField;  // 是否几何属性字段
    var fldLength = attribute.Length;  // 字段长度
}

3、裁剪面

// 创建编辑器
var clipFeatures = new EditOperation();
clipFeatures.Name = "Clip Features";
// 执行
clipFeatures.Clip(featureLayer, oid, clipPoly, ClipMode.PreserveArea);
if (!clipFeatures.IsEmpty)
{
    var result = clipFeatures.Execute();
}

4、用线分割面

// 获取分割线
var select = MapView.Active.SelectFeatures(clipPoly);
// 创建编辑器
var cutFeatures = new EditOperation();
cutFeatures.Name = "Cut Features";

// 执行(要素类通过oid选择出要素)
cutFeatures.Split(featureLayer, oid, cutLine);
// 执行(要素则直接使用)
cutFeatures.Split(sset, cutLine);

if (!cutFeatures.IsEmpty)
{
    var result = cutFeatures.Execute();
}

5、对所选的线要素进行平行复制

// 找到图层,作模板用
var roadsLayer = MapView.Active.Map.FindLayers("Roads").FirstOrDefault();

// 建立【平行复制生成器】,并设置参数
var parOffsetBuilder = new ParallelOffset.Builder()
{
    Selection = MapView.Active.Map.GetSelection(),     // 所选要素
    Template = roadsLayer.GetTemplate("Freeway"),     // 模板(可以不选)
    Distance = 200,     // 偏移距离
    Side = ParallelOffset.SideType.Both,         // 偏移方式(左,右,两侧)
    Corner = ParallelOffset.CornerType.Mitered,  // 拐角处理方式(圆角,斜接角,斜面角)
    Iterations = 1,            // 重复偏移的次数
    AlignConnected = false,              // 是否对齐连接线的方向
    CopyToSeparateFeatures = false,          // 是否复制到独立要素
    RemoveSelfIntersectingLoops = true          // 是否移除自相交环
};

// 创建编辑器并执行
var parallelOp = new EditOperation();
parallelOp.Create(parOffsetBuilder);
if (!parallelOp.IsEmpty)
{
    var result = parallelOp.Execute(); 
}

6、删除要素

var deleteFeatures = new EditOperation();
deleteFeatures.Name = "Delete Features";
// 删除表中的某一行
var table = MapView.Active.Map.StandaloneTables[0];
deleteFeatures.Delete(table, oid);

// 删除所选要素
var selection = MapView.Active.SelectFeatures(polygon);
deleteFeatures.Delete(selection);

if (!deleteFeatures.IsEmpty)
{
    var result = deleteFeatures.Execute();
}

7、全属性复制一个要素并移位

// 创建编辑器
var duplicateFeatures = new EditOperation();
duplicateFeatures.Name = "Duplicate Features";
// 创建【inspector】实例
var insp2 = new Inspector();
// 加载
insp2.Load(featureLayer, oid);
// 获取几何
var geom = insp2["SHAPE"] as Geometry;
// 复制要素
var rtoken = duplicateFeatures.Create(insp2.MapMember, insp2.ToDictionary(a => a.FieldName, a => a.CurrentValue));
if (!duplicateFeatures.IsEmpty)
{
    if (duplicateFeatures.Execute())
    {
        // 移动位置
        var modifyOp = duplicateFeatures.CreateChainedOperation();
        modifyOp.Modify(featureLayer, (long)rtoken.ObjectID, GeometryEngine.Instance.Move(geom, 100.0, 100.0));
        if (!modifyOp.IsEmpty)
        {
            var result = modifyOp.Execute();
        }
    }
}

8、炸开多部件

var explodeFeatures = new EditOperation();
explodeFeatures.Name = "Explode Features";
// 执行
explodeFeatures.Explode(featureLayer, new List<long>() { oid }, true);
if (!explodeFeatures.IsEmpty)
{
    var result = explodeFeatures.Execute(); 
}

9、合并要素

var mergeFeatures = new EditOperation();
mergeFeatures.Name = "Merge Features";

// 创建【inspector】实例
var inspector = new Inspector();
// 加载
inspector.Load(featureLayer, oid);
// 执行
mergeFeatures.Merge(featureLayer, new List<long>() { 5, 6, 7 }, inspector);

if (!mergeFeatures.IsEmpty)
{
    var result = mergeFeatures.Execute(); 
}

10、更新单个要素

var modifyFeature = new EditOperation();
modifyFeature.Name = "Modify a feature";

// 创建【inspector】实例
var modifyInspector = new Inspector();
// 加载
modifyInspector.Load(featureLayer, oid);

// 更改属性【包括几何属性】
modifyInspector["SHAPE"] = polygon;
modifyInspector["NAME"] = "Updated name";
// 更新
modifyFeature.Modify(modifyInspector);

// 涉及更改几何要素的情况
var featureAttributes = new Dictionary<string, object>();
featureAttributes["NAME"] = "Updated name";// 更改属性
modifyFeature.Modify(featureLayer, oid, polygon, featureAttributes);

if (!modifyFeature.IsEmpty)
{
    var result = modifyFeature.Execute(); 
}

11、更新多个要素

// 通过筛选获取要更新的要素
var queryFilter = new QueryFilter();
queryFilter.WhereClause = "OBJECTID < 1000000";
// 获取筛选结果的oid
var oidSet = new List<long>();
using (var rc = featureLayer.Search(queryFilter))
{
    while (rc.MoveNext())
    {
        using (var record = rc.Current)
        {
            oidSet.Add(record.GetObjectID());
        }
    }
}

// 创建编辑器
var modifyFeatures = new EditOperation();
modifyFeatures.Name = "Modify features";
modifyFeatures.ShowProgressor = true;
// 创建【inspector】实例
var muultipleFeaturesInsp = new Inspector();
muultipleFeaturesInsp.Load(featureLayer, oidSet);
muultipleFeaturesInsp["MOMC"] = 24;
// 更新
modifyFeatures.Modify(muultipleFeaturesInsp);
if (!modifyFeatures.IsEmpty)
{
    var result = modifyFeatures.ExecuteAsync();
}

12、筛选要素并更新

// 筛选
var filter = new ArcGIS.Core.Data.QueryFilter();
filter.WhereClause = "CONTRACTOR = 'KCGM'";
// 获取所选的oid
var oids = new List<long>();
using (var rc = disLayer.Search(filter))
{
    while (rc.MoveNext())
    {
        using (var record = rc.Current)
        {
            oidSet.Add(record.GetObjectID());
        }
    }
}

var modifyOp = new ArcGIS.Desktop.Editing.EditOperation();
modifyOp.Name = "Update date";

// 执行
var dateInsp = new ArcGIS.Desktop.Editing.Attributes.Inspector();
dateInsp.Load(disLayer, oids);
dateInsp["InspDate"] = "9/21/2013";

modifyOp.Modify(insp);
if (!modifyOp.IsEmpty)
{
    var result = modifyOp.Execute();
}

到了这里,关于【ArcGIS Pro二次开发】(59):Editing(编辑)模块的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ArcGIS Pro二次开发】(80):标注_CIMLabelClass

    CIMLabelClass(Cartographic Information Model Label Class)是ArcGIS Pro SDK中的一个类。 它主要用于定义标签的样式和属性,如字体、大小、颜色、对齐方式等,以及标签的排列和布局规则。 1、获取当前地图的标签引擎 2、修改当前地图的标签引擎 3、将文字符号TextSymbol应用到要素图层

    2024年02月19日
    浏览(51)
  • 【ArcGIS Pro二次开发】(81):文本符号_CIMTextSymbol

    CIMTextSymbol是用于绘制文本图形注释的文本符号。 0、属性 Angel 文本符号的放置角度 BlockProgression 多行文本的堆叠方向 Callout 引线 DrawSoftHyphen 连字符 FlipAngle 文本翻转(镜像)到位的角度 FontEffects 上下标 FontEncoding 获取文字的Encoding FontFamilyName 字体名称 FontStyleName 字形样式,例

    2024年02月20日
    浏览(48)
  • 【ArcGIS Pro二次开发】(36):度分秒转十进制度

    经纬度坐标的表达方式比较常用的一般有2种,【度分秒和十进制度】。 在成果展示中,以【度分秒】居多,但如果要将坐标导入ArcGIS中,则一般需要用到【十进制度】,这个转换可以在Excel中进行,也可以在ArcGIS中的字段计算里计算,但都有点小麻烦。 为了更方便的转换,

    2024年02月09日
    浏览(52)
  • 【ArcGIS Pro二次开发】(60):按图层导出布局

    在使用布局导图时,会遇到如下问题: 为了切换图层和导图方便,一般情况下,会把相关图层做成图层组。 在导图的时候,如果想要按照图层组进行分开导图,如上图,想导出【现状图、规划图、管控边界】3张图,系统并没有方便的工具。 于是就自己做一个。   如上图所

    2024年02月12日
    浏览(47)
  • 【ArcGIS Pro二次开发】(56):界址点导出Excel

    界址点成果表是地籍测绘中的一种表格,用于记录地块的界址点坐标和相关属性信息。 这个工具的目的就是为了将地块要素导出为界址点成果表。 如上图所示,在【数据处理】组—【Excel相关】面板下,点击【界址点导出Excel】工具。 在弹出的工具框中,分别输入参数: 1、

    2024年02月14日
    浏览(38)
  • 【ArcGIS Pro二次开发】(58):数据的本地化存储

    在做村规工具的过程中,需要设置一些参数,比如说导图的DPI,需要导出的图名等等。 每次导图前都需要设置参数,虽然有默认值,但还是需要不时的修改。 在使用的过程中,可能会有一些常用的参数,希望能够保存下来,而不是每次都去修改默认值。 于是,想到可以将这

    2024年02月14日
    浏览(44)
  • 【ArcGIS Pro二次开发】(50):布局(Layout)的基本操作

    ArcGIS Pro SDK中的布局(Layout)是用于创建和编辑打印布局的一组功能。 Layout是打印布局的容器,它可以包含多个元素,例如地图框、文本框、图例、比例尺等。 Layout中包含多种元素,比较重要的有:地图(MapFrameElement)、文本(TextElement)、图片(PictureElement)、图例(LegendElement)等。

    2024年02月16日
    浏览(49)
  • 【ArcGIS Pro二次开发】(61):样式(Style)和符号(Symbol)

    在 ArcGIS Pro SDK 中,地图要素符号(Symbol)和符号样式(Style)是2个很重要的概念。 【Symbol】是用于表示地图上不同类型的要素(如点、线、面)的图形化表示。 在地图中,各种要素都需要通过符号来展示,符号通常包括颜色、线型、填充样式、大小等属性。在 ArcGIS Pro SDK

    2024年02月11日
    浏览(57)
  • 【ArcGIS Pro二次开发】(45):手搓一个工具执行进度框

    我在之前做的工具中,UI这部分基本没怎么深入,都是直接用现成的控件。 其中有一个问题比较突出,就是没有工具执行的进度框提示。曾经也用过系统自带的信息提示框和进度条,但太简陋,确实不好用。于是就想抄一个进度框来用,自然而然想到了ArcGIS中地理工具执行时

    2024年02月13日
    浏览(53)
  • 【ArcGIS Pro二次开发】(53):村规制表、制图【福建省】

    这篇算是村规入库的一个延续。 村庄规划中有一些图纸是需要严格按照规范制图,或形成一定规范格式的。 这些图纸的制作基本算是机械式的工作,可以用工具来代替人工。 如上图所示,在【村庄规划】组,新增了两个工作面板:【制表】和【制图】。 【制表】面板共有

    2024年02月15日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包