Select to view content in your preferred language

Multi-Ring Buffer

965
1
07-16-2011 01:05 PM
karenvolarich
Occasional Contributor
Where in this code would I place a "foreach" to get the multiple rings for buffer distances to show?  I tried on buffer execute completed - but than the query async fails.  Any insight would be appreciated.


      private void EditorEditCompleted(object sender, Editor.EditEventArgs e)
        {
            if (e.Action == Editor.EditAction.Select)
            {
                _geometryService.CancelAsync();
                _queryTask.CancelAsync();

                foreach (Editor.Change item in e.Edits)
                {
                    Graphic clickGraphic = item.Graphic; //selected graphic
                    Layer layer = item.Layer;

                        clickGraphic.Symbol = LayoutRoot.Resources["YellowMarkerSymbol"] as ESRI.ArcGIS.Client.Symbols.Symbol;
                        clickGraphic.Geometry = item.Graphic.Geometry;
                       
                        _selectAndBufferGraphicsLayer.ClearGraphics();
                       
                        clickGraphic.SetZIndex(2);
                       
                        // If buffer spatial reference is GCS and unit is linear, geometry service will do geodesic buffering
                        ESRI.ArcGIS.Client.Tasks.BufferParameters bufferParams = new ESRI.ArcGIS.Client.Tasks.
                            BufferParameters()
                                                                                     {
                                                                                         BufferSpatialReference =
                                                                                             new SpatialReference(4326),
                                                                                         OutSpatialReference =
                                                                                             Map.SpatialReference,
                                                                                         Unit = LinearUnit.StatuteMile,
                                                                                     };
                        bufferParams.Distances.AddRange(new double[] {10, 20, 50});
                   
                        bufferParams.Features.Add(clickGraphic);

                        _geometryService.BufferAsync(bufferParams);
                    }
                }
            }
       

        void GeometryServiceBufferCompleted(object sender, GraphicsEventArgs args)
        {
           
                Graphic bufferGraphic = new Graphic();
                bufferGraphic.Geometry = args.Results[0].Geometry;
                bufferGraphic.Symbol = LayoutRoot.Resources["BufferSymbol"] as ESRI.ArcGIS.Client.Symbols.Symbol;
                bufferGraphic.SetZIndex(1);

                _selectAndBufferGraphicsLayer.Graphics.Add(bufferGraphic);

                ESRI.ArcGIS.Client.Tasks.Query query = new ESRI.ArcGIS.Client.Tasks.Query();
                query.ReturnGeometry = true;
                query.OutSpatialReference = Map.SpatialReference;
                query.Geometry = bufferGraphic.Geometry;
                query.OutFields.Add("*");

                _queryTask.ExecuteAsync(query);
           
        }

        private void QueryTaskExecuteCompleted(object sender, QueryEventArgs args)
        {
            if (args.FeatureSet.Features.Count < 1)
            {
                MessageBox.Show("No features found");
                return;
            }

            foreach (Graphic selectedGraphic in args.FeatureSet.Features)
            {
                selectedGraphic.Symbol = LayoutRoot.Resources["OfficeSymbol"] as ESRI.ArcGIS.Client.Symbols.Symbol;
                //_resultsGraphicsLayer.Graphics.Add(selectedGraphic);
            }
        }

        private void GeometryServiceFailed(object sender, TaskFailedEventArgs args)
        {
            MessageBox.Show("Geometry service failed: " + args.Error);
        }

        private void QueryTaskFailed(object sender, TaskFailedEventArgs args)
        {
            MessageBox.Show("Query failed: " + args.Error);
        }
0 Kudos
1 Reply
DominiqueBroux
Esri Frequent Contributor
You can't use an unique _geometryService to execute multiple requests in a loop.

Depending on your need, you can either create a new geoemtry service object in the loop, or (probably better) use an unique geometry object with a list of features (i.e you have to call 'Features.Add' in the loop but 'BufferAsync' outside of the loop.
0 Kudos