C#Arcengine不使用gp服务,复制一个图层中的要素,然后粘贴到另一个图层
时间: 2024-03-12 18:46:53 浏览: 19
您可以使用C# ArcObjects中的以下代码从一个图层中复制要素并粘贴到另一个图层。假设您已经创建了两个要素图层`sourceFeatureLayer`和`targetFeatureLayer`,并且已经选择了要复制的要素。
```
// 获取源图层和目标图层的FeatureClass
IFeatureClass sourceFeatureClass = sourceFeatureLayer.FeatureClass;
IFeatureClass targetFeatureClass = targetFeatureLayer.FeatureClass;
// 获取源图层和目标图层的字段
IFields sourceFields = sourceFeatureClass.Fields;
IFields targetFields = targetFeatureClass.Fields;
// 创建查询过滤器
IQueryFilter queryFilter = new QueryFilterClass();
queryFilter.WhereClause = sourceFeatureLayer.SelectionSet.IDs.Count > 0 ? sourceFeatureLayer.SelectionSet.IDs.AsArray().Select(x => $"{sourceFeatureClass.OIDFieldName} = {x}").Aggregate((x, y) => $"{x} OR {y}") : null;
// 使用游标遍历要素并复制到目标图层
IFeatureCursor sourceFeatureCursor = sourceFeatureClass.Search(queryFilter, true);
IFeatureCursor targetFeatureCursor = targetFeatureClass.Insert(true);
IFeature sourceFeature = null;
IFeatureBuffer targetFeatureBuffer = null;
while ((sourceFeature = sourceFeatureCursor.NextFeature()) != null)
{
// 创建目标要素
targetFeatureBuffer = targetFeatureClass.CreateFeatureBuffer();
sourceFeature.Store();
// 复制字段值
for (int i = 0; i < sourceFields.FieldCount; i++)
{
IField sourceField = sourceFields.get_Field(i);
IField targetField = targetFields.get_Field(targetFields.FindField(sourceField.Name));
if (sourceField.Type == targetField.Type)
{
targetFeatureBuffer.set_Value(i, sourceFeature.get_Value(i));
}
}
// 复制几何
IGeometry sourceGeometry = sourceFeature.ShapeCopy;
IGeometry targetGeometry = sourceGeometry.Copy();
targetFeatureBuffer.Shape = targetGeometry;
// 插入目标要素
targetFeatureCursor.InsertFeature(targetFeatureBuffer);
}
// 释放游标
System.Runtime.InteropServices.Marshal.ReleaseComObject(sourceFeatureCursor);
System.Runtime.InteropServices.Marshal.ReleaseComObject(targetFeatureCursor);
// 更新目标图层
targetFeatureLayer.FeatureClass = targetFeatureClass;
targetFeatureLayer.Name = "New Feature Layer";
// 显示目标图层
IMxDocument mxDocument = (IMxDocument)ArcMap.Application.Document;
IMap map = mxDocument.FocusMap;
map.AddLayer(targetFeatureLayer);
mxDocument.UpdateContents();
mxDocument.ActiveView.Refresh();
```