赞
踩
环境:Visual Studio 2022 + .NET6 + ArcGIS Pro SDK 3.0
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();
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();
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();
});
//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();
});
var tableTemplate = standaloneTable.GetTemplates().FirstOrDefault();
var createRow = new EditOperation();
createRow.Name = "Create a row in a table";
//使用所选表模板在独立表中创建新行
createRow.Create(tableTemplate);
createRow.Execute();
var clipFeatures = new EditOperation();
clipFeatures.Name = "Clip Features";
clipFeatures.Clip(featureLayer, oid, clipPoly, ClipMode.PreserveArea);
//执行操作
//必须在 QueuedTask.Run 中调用
clipFeatures.Execute();
//或者使用异步版本
//await clipFeatures.ExecuteAsync();
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();
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();
{
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();
}
}
var explodeFeatures = new EditOperation();
explodeFeatures.Name = "Explode Features";
//将多部分转换为每个部分一个要素
//提供要转换多个的 ID 列表
explodeFeatures.Explode(featureLayer, new List<long>() { oid }, true);
//执行操作
//必须在 QueuedTask.Run 中调用
explodeFeatures.Execute();
//或者使用异步版本
//await explodeFeatures.ExecuteAsync();
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();
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();
//按属性搜索
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();
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();
});
//从图层获取所有选定的 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();
// 获取图层中的所有选定 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();
// 注意 - 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();
// 从选定的要素创建并行要素
// 查找道路图层
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();
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();
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();
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();
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();
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();
// 通过几何图形执行橡皮板
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();
// 可以通过单个编辑操作执行多个操作。
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
// 链操作是一种特殊情况。使用 "链操作" 需要多个事务可通过单个 "撤销" 撤销。
// 最常见的链操作用例是创建具有附件的要素。
// 添加附件需要对象 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();
// 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();
// 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();
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。