一、Arcengine多部件处理
/// <summary>
/// 多部件处理
/// </summary>
/// <param name="pGeometry">任一要素</param>
/// <param name="listGeometry">多部件打散的列表</param>
/// <returns>是否为多部件</returns>
public static bool IsMuiltPart(IGeometry pGeometry, out List<IGeometry> listGeometry)
{
listGeometry = new List<IGeometry>();
IGeometryCollection pGeoColl = pGeometry as IGeometryCollection;
if (pGeoColl == null)
{
return false;
}
if (pGeoColl.GeometryCount <= 1)
{
return false;
}
IPolygon pGeoPolygon = pGeometry as IPolygon;
int iRCnt = pGeoPolygon.ExteriorRingCount;
if (iRCnt > 1)
{
IGeometryBag pExRings = (pGeometry as IPolygon4).ConnectedComponentBag;
IGeometryCollection geoColl = pExRings as IGeometryCollection;
for (int i = 0; i < iRCnt; i++)
{
if (pGeometry.GeometryType == esriGeometryType.esriGeometryPolygon)
{
IGeometry newGeom = geoColl.Geometry[i];
newGeom.SpatialReference = pGeometry.SpatialReference;
IGeometryCollection newGeoColl = new PolygonClass();
newGeoColl.AddGeometryCollection(newGeom as IGeometryCollection);
IGeometry pGeoNew2 = newGeoColl as IGeometry;
if (pGeoNew2 == null || pGeoNew2.IsEmpty) continue;
listGeometry.Add(pGeoNew2);
}
}
}
return true;
}
二、检验多部件、炸开处理
#region 校验合法性
ArrayList pFeatureArray = null;
pFeatureArray = Application.Editor.FeatureSelection();
int count=pFeatureArray.Count;
if (count<1)
{
MessageBox.Show("最少必须选择1个要素才能进行要素分解!", "提示");
return;
}
#endregion
try
{
//启动编辑操作
Application.Editor.StartOperation();
#region 对选中的要素进行多部件测试及分解
int multipartcount = 0;
for (int i = 0; i < count; i++)
{
IFeature pFeature = pFeatureArray as IFeature;
if (pFeature.ShapeCopy.IsEmpty) continue;
IGeometry pGeometry = pFeature.ShapeCopy;
IGeometryCollection pGeocoll = pGeometry as IGeometryCollection;
int geomcount = pGeocoll.GeometryCount;
if (geomcount > 1)
{
multipartcount++;
for (int k = 1; k < geomcount; k++)
{
IFeature newFeaturte = (pFeature.Class as IFeatureClass).CreateFeature();
IFeatureEdit pFeatureEdit = pFeature as IFeatureEdit;
pFeatureEdit.SplitAttributes(newFeaturte);
IGeometry newGeom = pGeocoll.get_Geometry(k);
if (pFeature.ShapeCopy.GeometryType == esriGeometryType.esriGeometryPolygon)
newGeom=GeometryHelper.ConstructPolygon(newGeom);
else
newGeom = GeometryHelper.ConstructPolyline(newGeom);
newGeom.SpatialReference = pFeature.ShapeCopy.SpatialReference;
newFeaturte.Shape = newGeom;
newFeaturte.Store();
}
IGeometry newGeom2 = pGeocoll.get_Geometry(0);
if (pFeature.ShapeCopy.GeometryType == esriGeometryType.esriGeometryPolygon)
newGeom2 = GeometryHelper.ConstructPolygon(newGeom2);
else
newGeom2 = GeometryHelper.ConstructPolyline(newGeom2);
newGeom2.SpatialReference = pFeature.ShapeCopy.SpatialReference;
pFeature.Shape = newGeom2;
pFeature.Store();
Application.Editor.StopOperation("分解多部件要素");
}
else
{
continue;
}
}
if (multipartcount == 0)
{
MessageBox.Show("未选择多部件要素!", "分解要素");
return;
}
#endregion
}
catch (Exception ex)
{
Application.Editor.AbortOperation();
MessageHelper.WriteLog("分解多部件要素", ex);
}
finally
{
Application.ActiveView.Refresh();
FlashFeatures();
}