ArcGIS Pro SDK (七)编辑 1 编辑操作

ArcGIS Pro SDK (七)编辑 1 编辑操作

环境:Visual Studio 2022 + .NET6 + ArcGIS Pro SDK 3.0

1 创建要素

var createFeatures = new EditOperation();
createFeatures.Name = "Create Features";
//创建一个多边形要素
var token = createFeatures.Create(featureLayer, polygon);
if (createFeatures.IsSucceeded)
{
  //在执行成功后,令牌的ObjectID将用创建的要素的ObjectID填充
}
//创建要素和设置属性
var attributes = new Dictionary<string, object>();
attributes.Add("SHAPE", polygon);
attributes.Add("NAME", "Corner Market");
attributes.Add("SIZE", 1200.5);
attributes.Add("DESCRIPTION", "Corner Market");

createFeatures.Create(featureLayer, attributes);

//使用当前模板创建要素
//必须在 MapTool 中
createFeatures.Create(this.CurrentTemplate, polygon);

//执行操作
//必须在 QueuedTask.Run 中调用
createFeatures.Execute();

//或者使用async
//await createFeatures.ExecuteAsync();

2 使用当前模板创建要素

var myTemplate = ArcGIS.Desktop.Editing.Templates.EditingTemplate.Current;

//创建编辑操作并执行
var op = new ArcGIS.Desktop.Editing.EditOperation();
op.Name = "Create my feature";
op.Create(myTemplate, geometry);
op.Execute();

3 从修改后的检查器创建要素

var insp = new ArcGIS.Desktop.Editing.Attributes.Inspector();
insp.Load(layer, 86);

ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
{
  //必要时修改属性
  //insp["Field1"] = newValue;

  //从现有的检查器中创建新功能(复制功能)
  var createOp = new ArcGIS.Desktop.Editing.EditOperation();
  createOp.Name = "Create from insp";
  createOp.Create(insp.MapMember, insp.ToDictionary(a => a.FieldName, a => a.CurrentValue));
  createOp.Execute();
});

4 从 CSV 文件创建要素

//Run on MCT
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
                                                        {
                                                            //创建编辑操作
                                                            var createOperation = new ArcGIS.Desktop.Editing.EditOperation();
                                                            createOperation.Name = "Generate points";
                                                            createOperation.SelectNewFeatures = false;

                                                            // 确定形状字段名称 - 它可能不是 'Shape' 
                                                            string shapeField = layer.GetFeatureClass().GetDefinition().GetShapeField();

                                                            //遍历 csv 数据
                                                            foreach (var item in csvData)
                                                            {

                                                                //创建点几何
                                                                ArcGIS.Core.Geometry.MapPoint newMapPoint =
                                                                    ArcGIS.Core.Geometry.MapPointBuilderEx.CreateMapPoint(item.X, item.Y);

                                                                // 通过字典包含属性
                                                                var atts = new Dictionary<string, object>();
                                                                atts.Add("StopOrder", item.StopOrder);
                                                                atts.Add("FacilityID", item.FacilityID);
                                                                atts.Add(shapeField, newMapPoint);

                                                                // 队列要素创建
                                                                createOperation.Create(layer, atts);
                                                            }

                                                            // 执行编辑(要素创建)操作
                                                            return createOperation.Execute();
                                                        });

5 使用表模板在表中创建行

var tableTemplate = standaloneTable.GetTemplates().FirstOrDefault();
var createRow = new EditOperation();
createRow.Name = "Create a row in a table";
//使用所选表模板在独立表中创建新行
createRow.Create(tableTemplate);
createRow.Execute();

6 剪辑要素

var clipFeatures = new EditOperation();
clipFeatures.Name = "Clip Features";
clipFeatures.Clip(featureLayer, oid, clipPoly, ClipMode.PreserveArea);
//执行操作
//必须在 QueuedTask.Run 中调用
clipFeatures.Execute();

//或者使用异步版本
//await clipFeatures.ExecuteAsync();

7 切割要素

var select = MapView.Active.SelectFeatures(clipPoly);

var cutFeatures = new EditOperation();
cutFeatures.Name = "Cut Features";
cutFeatures.Split(featureLayer, oid, cutLine);

//切割活动视图中的所有选定要素
//使用多边形选择(例如)
//在 2.x - var kvps = MapView.Active.SelectFeatures(polygon).Select(
//      k => new KeyValuePair<MapMember, List<long>>(k.Key as MapMember, k.Value));
//cutFeatures.Split(kvps, cutLine);
var sset = MapView.Active.SelectFeatures(polygon);
cutFeatures.Split(sset, cutLine);

//执行操作
//必须在 QueuedTask.Run 中调用
cutFeatures.Execute();

//或者使用异步版本
//await cutFeatures.ExecuteAsync();

8 删除要素

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

//删除活动视图中所有选定的要素
//使用多边形选择(例如)
//在 2.x - var selection = MapView.Active.SelectFeatures(polygon).Select(
//      k => new KeyValuePair<MapMember, List<long>>(k.Key as MapMember, k.Value));
//deleteFeatures.Delete(selection);
var selection = MapView.Active.SelectFeatures(polygon);
deleteFeatures.Delete(selection);

//执行操作
//必须在 QueuedTask.Run 中调用
deleteFeatures.Execute();

//或者使用异步版本
//await deleteFeatures.ExecuteAsync();

9 重复要素

{
    var duplicateFeatures = new EditOperation();
    duplicateFeatures.Name = "Duplicate Features";

    //使用 500 地图单位的 X 和 Y 偏移重复
    //在 2.x duplicateFeatures.Duplicate(featureLayer, oid, 500.0, 500.0, 0.0);

    //执行操作
    //必须在 QueuedTask.Run 中调用
    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.Execute())
    {
        var modifyOp = duplicateFeatures.CreateChainedOperation();
        modifyOp.Modify(featureLayer, (long)rtoken.ObjectID, GeometryEngine.Instance.Move(geom, 500.0, 500.0));
        modifyOp.Execute();
    }
}

10 分解要素

var explodeFeatures = new EditOperation();
explodeFeatures.Name = "Explode Features";

//将多部分转换为每个部分一个要素
//提供要转换多个的 ID 列表
explodeFeatures.Explode(featureLayer, new List<long>() { oid }, true);

//执行操作
//必须在 QueuedTask.Run 中调用
explodeFeatures.Execute();

//或者使用异步版本
//await explodeFeatures.ExecuteAsync();

11 合并功能

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

//使用当前模板中定义的默认值将三个要素合并为一个新要素
//在 2.x -
//mergeFeatures.Merge(this.CurrentTemplate as EditingFeatureTemplate, featureLayer, new List<long>() { 10, 96, 12 });
mergeFeatures.Merge(this.CurrentTemplate as EditingRowTemplate, featureLayer, new List<long>() { 10, 96, 12 });

//将三个要素合并到目标图层中的一个新要素
mergeFeatures.Merge(destinationLayer, featureLayer, new List<long>() { 10, 96, 12 });

//使用检查器设置合并要素的新属性
var inspector = new Inspector();
inspector.Load(featureLayer, oid);//基于现有要素的属性
//更改新要素的属性
inspector["NAME"] = "New name";
inspector["DESCRIPTION"] = "New description";

//使用检查器中设置的默认值将要素合并到同一图层中的新要素
mergeFeatures.Merge(featureLayer, new List<long>() { 10, 96, 12 }, inspector);

//执行操作
//必须在 QueuedTask.Run 中调用
mergeFeatures.Execute();

//或者使用异步版本
//await mergeFeatures.ExecuteAsync();

12 修改单个要素

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

//使用检查器
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);

//执行操作
//必须在 QueuedTask.Run 中调用
modifyFeature.Execute();

//或者使用异步版本
//await modifyFeatures.ExecuteAsync();

13 修改多个要素

//按属性搜索
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;

var muultipleFeaturesInsp = new Inspector();
muultipleFeaturesInsp.Load(featureLayer, oidSet);
muultipleFeaturesInsp["MOMC"] = 24;
modifyFeatures.Modify(muultipleFeaturesInsp);
modifyFeatures.ExecuteAsync();

14 搜索图层要素并更新字段

ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
                                                        {
                                                            //查找图层
                                                            var disLayer = ArcGIS.Desktop.Mapping.MapView.Active.Map.FindLayers("Distribution mains").FirstOrDefault() as BasicFeatureLayer;

                                                            //按属性搜索
                                                            var filter = new ArcGIS.Core.Data.QueryFilter();
                                                            filter.WhereClause = "CONTRACTOR = 'KCGM'";

                                                            var oids = new List<long>();
                                                            using (var rc = disLayer.Search(filter))
                                                            {
                                                                //创建要更新的 OID 列表
                                                                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);
                                                            modifyOp.Execute();
                                                        });

15 移动要素

//从图层获取所有选定的 ObjectID。
var firstLayer = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault();
var selOids = firstLayer.GetSelection().GetObjectIDs();

//将选定的图层加载到检查器中
var insp = new Inspector();
insp.Load(firstLayer, selOids);

//获取所选要素的几何
var geom = insp["SHAPE"] as Polygon;

//计算几何的移动
var transGeom = GeometryEngine.Instance.Move(geom, 10.0, 10.0);

//创建并执行编辑操作
var modify = new EditOperation();
modify.Name = "Move polygons";
modify.Modify(insp.MapMember, insp.GetObjectIDs(), transGeom);
modify.Execute();

16 将要素移动到特定坐标

// 获取图层中的所有选定 ObjectID。
var abLayer = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault();
var mySelection = abLayer.GetSelection();
var selOid = mySelection.GetObjectIDs().FirstOrDefault();

var moveToPoint = MapPointBuilderEx.CreateMapPoint(1.0, 2.0, 3.0, 4.0, MapView.Active.Map.SpatialReference); // 传入坐标。

var modifyFeatureCoord = new EditOperation();
modifyFeatureCoord.Name = "Move features";
modifyFeatureCoord.Modify(abLayer, selOid, moveToPoint);  // 将要素修改为新的几何图形
modifyFeatureCoord.Execute();

17 平面化要素

// 注意 - EditOperation.Planarize 需要标准许可证。
// 如果 Pro 运行在基本许可证下,将抛出异常。

var planarizeFeatures = new EditOperation();
planarizeFeatures.Name = "Planarize Features";

// 平面化一个或多个要素
planarizeFeatures.Planarize(featureLayer, new List<long>() { oid });

// 执行操作
// 必须在 QueuedTask.Run 中调用
planarizeFeatures.Execute();

// 或者使用异步版本
// await planarizeFeatures.ExecuteAsync();

18 并行偏移

// 从选定的要素创建并行要素

// 查找道路图层
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 parrallelOp = new EditOperation();
parrallelOp.Create(parOffsetBuilder);
parrallelOp.Execute();

19 重塑要素

var reshapeFeatures = new EditOperation();
reshapeFeatures.Name = "Reshape Features";

reshapeFeatures.Reshape(featureLayer, oid, modifyLine);

// 重塑与某些几何相交的一组要素...

// 在 2.x - var selFeatures = MapView.Active.GetFeatures(modifyLine).Select(
//     k => new KeyValuePair<MapMember, List<long>>(k.Key as MapMember, k.Value));
// reshapeFeatures.Reshape(selFeatures, modifyLine);

reshapeFeatures.Reshape(MapView.Active.GetFeatures(modifyLine), modifyLine);

// 执行操作
// 必须在 QueuedTask.Run 中调用
reshapeFeatures.Execute();

// 或者使用异步版本
// await reshapeFeatures.ExecuteAsync();

20 旋转要素

var rotateFeatures = new EditOperation();
rotateFeatures.Name = "Rotate Features";

// 旋转作用于选定的一组要素
// 获取与多边形相交的所有要素

// 在 2.x - var rotateSelection = MapView.Active.GetFeatures(polygon).Select(
//     k => new KeyValuePair<MapMember, List<long>>(k.Key as MapMember, k.Value));
// rotateFeatures.Rotate(rotateSelection, origin, Math.PI / 2);

// 绕 "origin" 旋转选定要素 90 度
rotateFeatures.Rotate(MapView.Active.GetFeatures(polygon), origin, Math.PI / 2);

// 执行操作
// 必须在 QueuedTask.Run 中调用
rotateFeatures.Execute();

// 或者使用异步版本
// await rotateFeatures.ExecuteAsync();

21 比例要素

var scaleFeatures = new EditOperation();
scaleFeatures.Name = "Scale Features";

// 比例作用于选定的一组要素

// var scaleSelection = MapView.Active.GetFeatures(polygon).Select(
//     k => new KeyValuePair<MapMember, List<long>>(k.Key as MapMember, k.Value));
// scaleFeatures.Scale(scaleSelection, origin, 2.0, 2.0, 0.0);

// 按 2.0 的 X 和 Y 方向缩放选定的要素
scaleFeatures.Scale(MapView.Active.GetFeatures(polygon), origin, 2.0, 2.0, 0.0);

// 执行操作
// 必须在 QueuedTask.Run 中调用
scaleFeatures.Execute();

// 或者使用异步版本
// await scaleFeatures.ExecuteAsync();

22 拆分要素

var splitFeatures = new EditOperation();
splitFeatures.Name = "Split Features";

var splitPoints = new List<MapPoint>() { mp1, mp2, mp3 };

// 在三个点处拆分要素
splitFeatures.Split(featureLayer, oid, splitPoints);

// 按百分比拆分
var splitByPercentage = new SplitByPercentage() { Percentage = 33, SplitFromStartPoint = true };
splitFeatures.Split(featureLayer, oid, splitByPercentage);

// 按等分拆分
var splitByEqualParts = new SplitByEqualParts() { NumParts = 3 };
splitFeatures.Split(featureLayer, oid, splitByEqualParts);

// 按单一距离拆分
var splitByDistance = new SplitByDistance() { Distance = 27.3, SplitFromStartPoint = false };
splitFeatures.Split(featureLayer, oid, splitByDistance);

// 按变化距离拆分
var distances = new List<double>() { 12.5, 38.2, 89.99 };
var splitByVaryingDistance = new SplitByVaryingDistance() { Distances = distances, SplitFromStartPoint = true, ProportionRemainder = true };
splitFeatures.Split(featureLayer, oid, splitByVaryingDistance);

// 执行操作
// 必须在 QueuedTask.Run 中调用
splitFeatures.Execute();

// 或者使用异步版本
// await splitAtPointsFeatures.ExecuteAsync();

23 变换要素

var transformFeatures = new EditOperation();
transformFeatures.Name = "Transform Features";

// 变换选定的一组要素
// 在 2.x - var transformSelection = MapView.Active.GetFeatures(polygon).Select(
//     k => new KeyValuePair<MapMember, List<long>>(k.Key as MapMember, k.Value));
// transformFeatures.Transform(transformSelection, linkLayer);
// // 仅变换图层
// transformFeatures.Transform(featureLayer, linkLayer);
// // 执行仿射变换
// transformFeatures.TransformAffine(featureLayer, linkLayer);

var affine_transform = new TransformByLinkLayer()
{
    LinkLayer = linkLayer,
    TransformType = TransformMethodType.Affine // TransformMethodType.Similarity
};
// 变换选定的一组要素
transformFeatures.Transform(MapView.Active.GetFeatures(polygon), affine_transform);
// 执行仿射变换
transformFeatures.Transform(featureLayer, affine_transform);

// 执行操作
// 必须在 QueuedTask.Run 中调用
transformFeatures.Execute();

// 或者使用异步版本
// await transformFeatures.ExecuteAsync();

24 橡皮板功能

// 通过几何图形执行橡皮板
var rubbersheetMethod = new RubbersheetByGeometries()
{
    RubbersheetType = RubbersheetMethodType.Linear, // RubbersheetType 可以是 Linear 或 NearestNeighbor
    LinkLines = linkLines, // 链接线的 IEnumerable 列表 (polylines)
    AnchorPoints = anchorPoints, // 锚点的 IEnumerable 列表 (map points)
    LimitedAdjustmentAreas = limitedAdjustmentAreas // 有限调整区域的 IEnumerable 列表 (polygons)
};

var rubbersheetOp = new EditOperation();
// 对 "layer" 中落在有限调整区域内的要素执行线性橡皮板变换
rubbersheetOp.Rubbersheet(layer, rubbersheetMethod);
// 执行操作
rubbersheetOp.Execute();

// 或者,您也可以通过图层执行橡皮板
var rubbersheetMethod2 = new RubbersheetByLayers()
{
    RubbersheetType = RubbersheetMethodType.NearestNeighbor, // RubbersheetType 可以是 Linear 或 NearestNeighbor
    LinkLayer = linkLayer,
    AnchorPointLayer = anchorPointsLayer,
    LimitedAdjustmentAreaLayer = limitedAdjustmentAreaLayer
};

// 对 "layer" 中落在有限调整区域内的要素执行最近邻橡皮板变换
rubbersheetOp.Rubbersheet(layer, rubbersheetMethod2);
// 执行操作
rubbersheetOp.Execute();

25 执行剪辑、剪切和平面化

// 可以通过单个编辑操作执行多个操作。
var clipCutPlanarizeFeatures = new EditOperation();
clipCutPlanarizeFeatures.Name = "Clip, Cut, and Planarize Features";
clipCutPlanarizeFeatures.Clip(featureLayer, oid, clipPoly);
clipCutPlanarizeFeatures.Split(featureLayer, oid, cutLine);
clipCutPlanarizeFeatures.Planarize(featureLayer, oid);

// 注意:编辑操作是单一事务。
// 执行操作(按照声明的顺序)
clipCutPlanarizeFeatures.Execute();

// 或者使用异步版本
// await clipCutPlanarizeFeatures

26 编辑操作链

// 链操作是一种特殊情况。使用 "链操作" 需要多个事务可通过单个 "撤销" 撤销。

// 最常见的链操作用例是创建具有附件的要素。
// 添加附件需要对象 ID(新要素的)已经创建。
// 创建编辑操作
var editOperation1 = new EditOperation();
editOperation1.Name = string.Format("Create point in '{0}'", CurrentTemplate.Layer.Name);

long newFeatureID = -1;
// Create 操作必须执行,以便我们获得 object_id
var token2 = editOperation1.Create(this.CurrentTemplate, polygon);
if (editOperation1.IsSucceeded)
{
    newFeatureID = (long)token2.ObjectID;
}
// 必须在 QueuedTask 中
editOperation1.Execute();

// 或者使用异步版本
// await editOperation1.ExecuteAsync();

// 现在,因为我们有了对象 ID,我们可以添加附件。由于我们在链操作中,添加附件
// 可以作为 "撤销创建" 操作的一部分被撤销。换句话说,在 Pro UI 上只会显示一个撤销操作
// 而不是两个。
var editOperation2 = editOperation1.CreateChainedOperation();
// 使用新要素 ID 添加附件
editOperation2.AddAttachment(this.CurrentTemplate.Layer, newFeatureID, @"C:\data\images\Hydrant.jpg");

// editOperation1 和 editOperation2 在 UI 上显示为单个撤销操作,即使
// 我们有两个事务。
// 必须在 QueuedTask 中
editOperation2.Execute();

// 或者使用异步版本
// await editOperation2.ExecuteAsync();

27 通过行令牌添加附件

// ArcGIS Pro 2.5 扩展了 EditOperation.AddAttachment 方法,使其接受 RowToken 作为参数。
// 这允许您在一个事务中创建要素(使用 EditOperation.CreateEx)并添加附件。

var editOpAttach = new EditOperation();
editOpAttach.Name = string.Format("Create point in '{0}'", CurrentTemplate.Layer.Name);

var attachRowToken = editOpAttach.Create(this.CurrentTemplate, polygon);
editOpAttach.AddAttachment(attachRowToken, @"c:\temp\image.jpg");

// 必须在 QueuedTask 中
editOpAttach.Execute();

28 SetOnUndone, SetOnRedone, SetOnComitted

// SetOnUndone, SetOnRedone 和 SetOnComittedManage 可用于管理
// 与每个编辑操作相关的外部操作(例如写入日志表)。

// 获取选定要素并更新属性
var selectedFeatures = MapView.Active.Map.GetSelection();
var testInspector = new Inspector();
testInspector.Load(selectedFeatures.ToDictionary().Keys.First(), selectedFeatures.ToDictionary().Values.First());
testInspector["Name"] = "test";

// 创建并执行编辑操作
var updateTestField = new EditOperation();
updateTestField.Name = "Update test field";
updateTestField.Modify(testInspector);

// SetOn... 的操作
updateTestField.SetOnUndone(() =>
                            {
                                // 设置在此操作被撤销时调用的操作。
                                Debug.WriteLine("Operation is undone");
                            });

updateTestField.SetOnRedone(() =>
                            {
                                // 设置在此编辑操作重做时调用的操作。
                                Debug.WriteLine("Operation is redone");
                            });

updateTestField.SetOnComitted((bool b) => // 在编辑会话保存(true)/放弃(false)时调用。
                              {
                                  // 设置在此编辑操作提交时调用的操作。
                                  Debug.WriteLine("Operation is committed");
                              });

updateTestField.Execute();

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ArcGIS Pro SDK是用于创建ArcGIS Pro加载项的开发工具包。您可以使用ArcGIS Pro SDK来扩展ArcGIS Pro的功能,添加自定义工具、面板、任务和其他功能。\[1\] 要安装ArcGIS Pro SDK 3.0,您需要使用Visual Studio 2022,并从Visual Studio Marketplace搜索并安装以下三个扩展:ArcGIS Pro SDK for .NET,ArcGIS Pro SDK for .NET(Utilities),ArcGIS Pro SDK for .NET(Migration)\[1\]。请注意,ArcGIS Pro SDK for .NET扩展只能集成到Visual Studio 2022中,建议使用版本17.2或更高版本\[2\]。 ArcGIS Pro SDK for .NET提供了三个不同的扩展名(.vsix文件):ArcGIS Pro SDK for .NET用于创建ArcGIS Pro加载项的工程和项模板的集合,ArcGIS Pro SDK for .NET(Utilities)用于帮助创建ArcGIS Pro加载项的实用程序的集合,ArcGIS Pro SDK for .NET(Migration)用于将ArcGIS Pro SDK 2.x扩展模块迁移到ArcGIS Pro SDK 3.0 for .NET\[3\]。 总结来说,ArcGIS Pro SDK是用于创建ArcGIS Pro加载项的开发工具包,您可以使用它来扩展ArcGIS Pro的功能。要安装ArcGIS Pro SDK 3.0,您需要使用Visual Studio 2022,并从Visual Studio Marketplace安装相应的扩展。 #### 引用[.reference_title] - *1* *2* *3* [VS2022中ArcGIS Pro SDK for .NET安装和卸载指南](https://blog.csdn.net/u012685544/article/details/126317090)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值