/// <summary> /// 获取多边形的所有环 /// </summary> /// <param name="polygon">多边形</param> /// <returns></returns> public static Dictionary <string, IRing> GetAllRings(IPolygon polygon) { Dictionary <string, IRing> rings = new Dictionary <string, IRing>(); int i = 0; foreach (IRing ring in PolygonHelper.GetExteriorRings(polygon)) { int j = 0; i++; rings.Add("外环" + i.ToString(), ring); foreach (IRing interring in PolygonHelper.GetInteriorRingsByExterior(ring, polygon)) { j++; rings.Add("外环" + i.ToString() + "内环" + j.ToString(), interring); } } return(rings); }
// //输出外环面 shape public bool OutPutPolygonExteriorRing(IFeatureClass featclass, string outShapeFilePath, bool IsGetExtRingOfHaveInnerRing) { bool rbc = false; if (System.IO.File.Exists(outShapeFilePath) == true) { //输出Shape文件 LocalShapeFileOperator delshpOp = new LocalShapeFileOperator(); delshpOp.LocalShapePathFileName = outShapeFilePath; delshpOp.DeleteShapeFile(); delshpOp.Dispose(); } esriGeometryType geoType = featclass.ShapeType; //创建新的Shape文件 LocalShapeFileOperator shpOp = new LocalShapeFileOperator(); shpOp.LocalShapePathFileName = outShapeFilePath; string dir = shpOp.getDir(outShapeFilePath); string name = shpOp.getFileName(outShapeFilePath); ShapefileWorkspaceFactoryClass objwsf = new ShapefileWorkspaceFactoryClass(); IWorkspace objws = objwsf.OpenFromFile(dir, 0); IFeatureWorkspace feaureWS = objws as IFeatureWorkspace; //设置投影 ISpatialReference sr = (featclass as IGeoDataset).SpatialReference; shpOp.ShapeSpatialReference = sr; //设置shp文件的oid字段和几何字段 if (IsObjGeo == false) { if (featclass.HasOID == true) { this.OIDFieldName = featclass.OIDFieldName; } this.GeometryFieldName = featclass.ShapeFieldName; } shpOp.OIDFieldName = this.OIDFieldName; shpOp.GeometryFieldName = this.GeometryFieldName; //创建要素类 IFeatureClass fc = shpOp.CreateFeatureClass(feaureWS, name, esriFeatureType.esriFTSimple, geoType); if (fc != null) { TokayWorkspace.ComRelease(fc); fc = null; rbc = true; } TokayWorkspace.ComRelease(objws); feaureWS = null; objws = null; objwsf = null; //拷贝字段结构 IFeatureClass Dfeatclass = shpOp.getIFeatureClass(); ZhFeatureClass Szhfeatclass = new ZhPointFeatureClass(featclass); Szhfeatclass.CopyFieldsToObjectFeatureClass(Dfeatclass); //拷贝几何对象和属性数据 ZhFeature Szhfeat = null; IFeatureBuffer DfeatBuffer = null; IFeatureCursor featCurInsert = Dfeatclass.Insert(true); //获取总要素个数 int fIndex = 0; int tmpFCount = Szhfeatclass.FeatureClass.FeatureCount(null); frmProgressBar1 pb = new frmProgressBar1(); pb.Text = "正在输出shp文件..."; pb.Caption1.Text = "正在输出shp文件..."; pb.progressBar1.Maximum = tmpFCount + 1; pb.progressBar1.Value = 0; pb.Show(this.ParentForm); Application.DoEvents(); object refobj = Type.Missing; IPolygon s_p = null; IRing[] ExtRingArray = null; IRing[] InnerRingArray = null; IFeatureCursor featcur = Szhfeatclass.FeatureClass.Search(null, false); IFeature feat = featcur.NextFeature(); while (feat != null) { fIndex += 1; if (fIndex % 200 == 0) { pb.Caption1.Text = "已输出要素个数:" + fIndex.ToString() + "/总" + tmpFCount.ToString(); pb.progressBar1.Value = fIndex; Application.DoEvents(); featCurInsert.Flush(); } s_p = feat.ShapeCopy as IPolygon; //获取外环面几何对象 ExtRingArray = PolygonHelper.GetExteriorRings(s_p); if (ExtRingArray != null && ExtRingArray.Length > 0) { foreach (IRing r in ExtRingArray) { if (IsGetExtRingOfHaveInnerRing == true) { InnerRingArray = PolygonHelper.GetInteriorRingsByExterior(r, s_p); if (InnerRingArray != null && InnerRingArray.Length > 0) { //有内环 //外环构面并输出保存 DfeatBuffer = Dfeatclass.CreateFeatureBuffer(); PolygonClass pclass = new PolygonClass(); pclass.AddGeometry(r, ref refobj, ref refobj); pclass.SimplifyPreserveFromTo(); pclass.SpatialReference = sr; DfeatBuffer.Shape = pclass; //拷贝属性数据 Szhfeat = new ZHFeaturePoint(feat); Szhfeat.CopyField(ref DfeatBuffer); featCurInsert.InsertFeature(DfeatBuffer); // } } else { //外环构面并输出保存 DfeatBuffer = Dfeatclass.CreateFeatureBuffer(); PolygonClass pclass = new PolygonClass(); pclass.AddGeometry(r, ref refobj, ref refobj); pclass.SimplifyPreserveFromTo(); pclass.SpatialReference = sr; DfeatBuffer.Shape = pclass; //拷贝属性数据 Szhfeat = new ZHFeaturePoint(feat); Szhfeat.CopyField(ref DfeatBuffer); featCurInsert.InsertFeature(DfeatBuffer); // } } } feat = featcur.NextFeature(); } featCurInsert.Flush(); TokayWorkspace.ComRelease(featcur); featcur = null; TokayWorkspace.ComRelease(featCurInsert); featCurInsert = null; rbc = true; pb.Close(); pb.Dispose(); pb = null; return(rbc); }