I need help with a sample code to get the X,Y Coordinates of the vertices of a selected polygon feature. I intend to pass this to text elements on the pagelayout control. Any help will be greatly appreciated.
Thank you
Worlanyo
Here is a sample that gets you from an IFeature (from a cursor) to a List of all the points (type PointF)...
Hope it helps.
Brent Hoskisson
private void GetVertices(IFeature f) { IPolygon4 parcel = f.Shape as IPolygon4; if (parcel != null) { List<List<System.Drawing.PointF>> polycoll = new List<List<System.Drawing.PointF>>(); if (parcel.ExteriorRingCount > 0) { IGeometryBag exteriorRings = parcel.ExteriorRingBag; IEnumGeometry exteriorRingsEnum = exteriorRings as IEnumGeometry; exteriorRingsEnum.Reset(); int ering = 0; IRing currentExteriorRing = exteriorRingsEnum.Next() as IRing; int extrings = parcel.ExteriorRingCount; while (extrings > 0 && currentExteriorRing != null) { ering++; ISegmentCollection segments = currentExteriorRing as ISegmentCollection; List<System.Drawing.PointF> spc = ProcessRing(segments); if (spc != null) polycoll.Add(spc); IGeometryBag interiorRings = parcel.InteriorRingBag[currentExteriorRing]; IEnumGeometry interiorRingsEnum = exteriorRings as IEnumGeometry; interiorRingsEnum.Reset(); int iring = 0; IRing currentInteriorRing = exteriorRingsEnum.Next() as IRing; int intrings = parcel.InteriorRingCount[currentExteriorRing]; while (intrings > 0 && currentInteriorRing != null) { iring++; ISegmentCollection insegments = currentInteriorRing as ISegmentCollection; List<System.Drawing.PointF> inspc = ProcessRing(insegments); if (inspc != null) polycoll.Add(inspc); currentInteriorRing = interiorRingsEnum.Next() as IRing; if (iring >= intrings) break; } currentExteriorRing = exteriorRingsEnum.Next() as IRing; if (ering >= extrings) break; } } } //do something with polycoll... } private List<System.Drawing.PointF> ProcessRing(ISegmentCollection segments) { int segcount = segments.SegmentCount; IEnumSegment enumsegment = segments.EnumSegments as IEnumSegment; if (enumsegment == null) { return null; } enumsegment.Reset(); int partIndex = 0; int segIndex = 0; ISegment querySeg; enumsegment.Next(out querySeg, ref partIndex, ref segIndex); List<System.Drawing.PointF> spc = new List<System.Drawing.PointF>(); while (querySeg != null && !querySeg.IsEmpty) { if (querySeg is Line) { //no additional information. } else { //Circle, Ellipse, Bezier... //get additional information to store about the line. } System.Drawing.PointF labpt = new System.Drawing.PointF((float)Math.Round(querySeg.FromPoint.X, 2, MidpointRounding.AwayFromZero), (float)Math.Round(querySeg.FromPoint.Y, 2, MidpointRounding.AwayFromZero)); spc.Add(labpt); enumsegment.Next(out querySeg, ref partIndex, ref segIndex); if (segIndex == 0) break; } if (spc != null) { spc.Add(spc[0]); //close the loop by adding the first point to the end... return spc; } else { return null; } }
Thank you very much, this really helped
Signed in members can post, follow updates, and more. New here? Register a free account.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.