private void btnConstructMultiPolygon_Click(object sender, EventArgs e) { if (gfactory == null) gfactory = new GeometryFactory(); multiPolygon = gfactory.CreateGeometry(gviGeometryType.gviGeometryMultiPolygon, gviVertexAttribute.gviVertexAttributeZ) as IMultiPolygon; if (multiPolygon == null) return; //添加第一个polygon IPolygon polygonFirst = gfactory.CreateGeometry(gviGeometryType.gviGeometryPolygon, gviVertexAttribute.gviVertexAttributeZ) as IPolygon; if (polygonFirst == null) return; /// 外环顺时针:1-4-3-2-1 /// 4-------3 /// | | /// | | /// 1-------2 IRing exteriorRing = polygonFirst.ExteriorRing; point = gfactory.CreatePoint(gviVertexAttribute.gviVertexAttributeZ); point.SetCoords(0, 0, 0, 0, 1); exteriorRing.AppendPoint(point); point.SetCoords(0, 200, 0, 0, 2); exteriorRing.AppendPoint(point); point.SetCoords(100, 200, 0, 0, 3); exteriorRing.AppendPoint(point); point.SetCoords(100, 0, 0, 0, 4); exteriorRing.AppendPoint(point); point.SetCoords(0, 0, 0, 0, 5); exteriorRing.AppendPoint(point); //闭合 /// 内环逆时针:1-2-3-4-1 /// 4-------3 /// | | /// | | /// 1-------2 IRing interiorRing = gfactory.CreateGeometry(gviGeometryType.gviGeometryRing, gviVertexAttribute.gviVertexAttributeZ) as IRing; point.SetCoords(25, 25, 0, 0, 1); interiorRing.AppendPoint(point); point.SetCoords(75, 25, 0, 0, 2); interiorRing.AppendPoint(point); point.SetCoords(75, 75, 0, 0, 3); interiorRing.AppendPoint(point); point.SetCoords(25, 75, 0, 0, 4); interiorRing.AppendPoint(point); point.SetCoords(25, 25, 0, 0, 5); interiorRing.AppendPoint(point); //闭合 polygonFirst.AddInteriorRing(interiorRing); //Clone一个新的内环 IRing pInteriorRingNew = interiorRing.Clone() as IRing; polygonFirst.AddInteriorRing(pInteriorRingNew); multiPolygon.AddPolygon(polygonFirst); //Clone一个新的polygon IPolygon pPolygonNew = polygonFirst.Clone() as IPolygon; multiPolygon.AddPolygon(pPolygonNew); MultiSurface geo = new MultiSurface(); // Geometry属性 geo.Dimension = multiPolygon.Dimension; if (multiPolygon.Envelope != null) { geo.MaxX = multiPolygon.Envelope.MaxX; geo.MaxY = multiPolygon.Envelope.MaxY; geo.MaxZ = multiPolygon.Envelope.MaxZ; geo.MinX = multiPolygon.Envelope.MinX; geo.MinY = multiPolygon.Envelope.MinY; geo.MinZ = multiPolygon.Envelope.MinZ; } geo.GeometryType = multiPolygon.GeometryType; geo.IsEmpty = multiPolygon.IsEmpty; geo.IsValid = multiPolygon.IsValid; geo.VertexAttribute = multiPolygon.VertexAttribute; geo.HasId = multiPolygon.HasId(); geo.HasM = multiPolygon.HasM(); geo.HasZ = multiPolygon.HasZ(); // GeometryCollection属性 geo.GeometryCount = multiPolygon.GeometryCount; geo.IsOverlap = multiPolygon.IsOverlap; // MultiSurface属性 geo.Area = multiPolygon.GetArea(); this.propertyGrid1.SelectedObject = geo; }