Need some example for UseGeodesicBuffering

1778
2
06-08-2014 05:52 PM
Kyeo-RehPark
New Contributor
I�??m trying to find a geodesic buffered region for a given polyline in a WGS_1984_UTM_Zone_52N coordinate system. However, When I try to get a buffered polygon for this, the program shows AccessViolationException for �??Attempted to read or write protected memory. This is often an indication that other memory is corrupt�?�. Below is what I tried:

public void DrawBuffer()
        {
            ESRI.ArcGIS.Display.IScreenDisplay screenDisplay = axMapControl1.ActiveView.ScreenDisplay;
            IElement pInptLine = new LineElementClass();

            object missing = Type.Missing;
            IFillShapeElement pElem = new CircleElementClass();
            ISimpleFillSymbol sysm = new SimpleFillSymbol();

            sysm.Style = esriSimpleFillStyle.esriSFSDiagonalCross;
            sysm.Outline.Width = 20;

            //Get the IRGBColor interface
            IRgbColor color = new RgbColorClass();
            //Set the color properties
            color.Red = 255;        color.Green = 0;    color.Blue = 0;
            color.Transparency = 255;

            sysm.Color = color;  sysm.Outline.Color = color;
            pElem.Symbol = sysm;

            ESRI.ArcGIS.Display.ISimpleLineSymbol simpleLineSymbol = new ESRI.ArcGIS.Display.SimpleLineSymbolClass();
            simpleLineSymbol.Color = color;

            ESRI.ArcGIS.Display.ISymbol symbol = simpleLineSymbol as ESRI.ArcGIS.Display.ISymbol; // Dynamic cast.
            ESRI.ArcGIS.Display.IRubberBand2 rubberBand = new ESRI.ArcGIS.Display.RubberLineClass();
            ESRI.ArcGIS.Geometry.IGeometry geometry = rubberBand.TrackNew(screenDisplay, symbol);

            screenDisplay.SetSymbol(symbol);
            screenDisplay.DrawPolyline(geometry);
            screenDisplay.FinishDrawing();

            //Start Buffering
            IConstructMultipoint myMultiPoint = new MultipointClass();
            myMultiPoint.ConstructDivideLength(geometry as ICurve, 10000);
            IGeometryCollection geometryBag = new GeometryBagClass();
            IGeometryCollection Rslt = new GeometryBagClass();
            IPointCollection pointCollection = myMultiPoint as IPointCollection;


            object Missing = Type.Missing;

            for(int i = 0; i<pointCollection.PointCount ; i++ )
            {
                geometryBag.AddGeometry(pointCollection.get_Point(i), ref Missing, ref Missing);
            }
            IGeometryBag enumGeometry = geometryBag as IGeometryBag;
            IBufferConstruction ipBufCon = new BufferConstruction();
            IBufferConstructionProperties2 ipBufConProp = (IBufferConstructionProperties2)ipBufCon;
            ipBufConProp.UseGeodesicBuffering = true;
            ipBufConProp.UnionOverlappingBuffers = true;
            ipBufCon.ConstructBuffers((IEnumGeometry)enumGeometry, 500.0 * 1000.0, Rslt);

IPolygon bufrPolygon = Rslt.get_Geometry(0) as IPolygon;

            //Fill the BufrPolygon
            IElement iElem = pElem as IElement;
            iElem.Geometry = bufrPolygon as IGeometry;

            IFillShapeElement pElemFillShp = pElem as IFillShapeElement;
//Add the result as an element of the map
            pElemFillShp.Symbol = sysm;
            axMapControl1.ActiveView.GraphicsContainer.AddElement(pElemFillShp as IElement, 0);
        }


Whenever I turned off the UseGeodesicBuffering, the program works fine. But when the property is true, the crash occurs. I�??m trying to find out the problem & debug the code, and still need some help. Any ideas why this code crashes or some working code example with UseGeodesicBuffering = true would be most grateful. Thank you in advance.
0 Kudos
2 Replies
AnthonyStevens
New Contributor II

I'm having the same problem (code below).  Did you ever get a solution to this error?  Thee error happens at bufferConstruction.ConstructBuffers(enumGeom, buffDist, bufferColl);.  Throws this error:  Attempted to read or write protected memory.  This is often an indication that other memory is corrupt.

                var map = ArcMap.Document.FocusMap;

                var graphicsContainer = (IGraphicsContainer)map;

                //get map unit

                var outUnits = map.MapUnits;

                var inUnits = esriUnits.esriMeters;

                var unitConverter = new UnitConverter();

                double buffDist = unitConverter.ConvertUnits(35, inUnits, outUnits);

                var selection = (IEnumFeature)map.FeatureSelection;

                selection.Reset();

                var feature = selection.Next();

                object missing = Type.Missing;

                var geomColl = new GeometryBagClass();

                geomColl.AddGeometry(feature.Shape, ref missing, ref missing);

                var enumGeom = (IEnumGeometry)geomColl;

                enumGeom.Reset();

                var bufferConstruction = new BufferConstructionClass();

                var bufferProps = (IBufferConstructionProperties2)bufferConstruction;

                bufferProps.UseGeodesicBuffering = true;

                var bufferColl = new GeometryBagClass();

                bufferConstruction.ConstructBuffers(enumGeom, buffDist, bufferColl);

0 Kudos
PavelNovoslavskij
New Contributor

It's because you're not setting spatial reference on geometry bag.

0 Kudos