private async void ShowServiceAreasButtonClick(object sender, EventArgs e) { // Finish any drawings in progress. if (_myMapView.SketchEditor.CompleteCommand.CanExecute(null)) { _myMapView.SketchEditor.CompleteCommand.Execute(null); } // Update the UI. _barrierButton.Text = "Draw barrier"; // Use a local variable for the graphics overlay. GraphicCollection allGraphics = _myMapView.GraphicsOverlays[0].Graphics; // Get a list of the facilities from the graphics overlay. List <ServiceAreaFacility> serviceAreaFacilities = (from g in allGraphics where (string)g.Attributes["Type"] == "Facility" select new ServiceAreaFacility((MapPoint)g.Geometry)).ToList(); // Check that there is at least 1 facility to find a service area for. if (!serviceAreaFacilities.Any()) { CreateErrorDialog("Must have at least one Facility!"); return; } // Create the service area task and parameters based on the Uri. ServiceAreaTask serviceAreaTask = await ServiceAreaTask.CreateAsync(_serviceAreaUri); // Store the default parameters for the service area in an object. ServiceAreaParameters serviceAreaParameters = await serviceAreaTask.CreateDefaultParametersAsync(); // Add impedance cutoffs for facilities (drive time minutes). serviceAreaParameters.DefaultImpedanceCutoffs.Add(2.0); serviceAreaParameters.DefaultImpedanceCutoffs.Add(5.0); // Set the level of detail for the polygons. serviceAreaParameters.PolygonDetail = ServiceAreaPolygonDetail.High; // Get a list of the barriers from the graphics overlay. List <PolylineBarrier> polylineBarriers = (from g in allGraphics where (string)g.Attributes["Type"] == "Barrier" select new PolylineBarrier((Polyline)g.Geometry)).ToList(); // Add the barriers to the service area parameters. serviceAreaParameters.SetPolylineBarriers(polylineBarriers); // Update the parameters to include all of the placed facilities. serviceAreaParameters.SetFacilities(serviceAreaFacilities); // Clear existing graphics for service areas. foreach (Graphic g in allGraphics.ToList()) { // Check if the graphic g is a service area. if ((string)g.Attributes["Type"] == "ServiceArea") { allGraphics.Remove(g); } } try { // Solve for the service area of the facilities. ServiceAreaResult result = await serviceAreaTask.SolveServiceAreaAsync(serviceAreaParameters); // Loop over each facility. for (int i = 0; i < serviceAreaFacilities.Count; i++) { // Create list of polygons from a service facility. List <ServiceAreaPolygon> polygons = result.GetResultPolygons(i).ToList(); // Symbol for the outline of the service areas. SimpleLineSymbol serviceOutline = new SimpleLineSymbol(SimpleLineSymbolStyle.Solid, System.Drawing.Color.DarkGray, 3.0f); // Create a list of fill symbols for the polygons. List <SimpleFillSymbol> fillSymbols = new List <SimpleFillSymbol>(); fillSymbols.Add(new SimpleFillSymbol(SimpleFillSymbolStyle.Solid, System.Drawing.Color.FromArgb(70, 255, 0, 0), serviceOutline)); fillSymbols.Add(new SimpleFillSymbol(SimpleFillSymbolStyle.Solid, System.Drawing.Color.FromArgb(70, 255, 165, 0), serviceOutline)); // Loop over every polygon in every facilities result. for (int j = 0; j < polygons.Count; j++) { // Create the graphic for the service areas, alternating between fill symbols. Graphic serviceGraphic = new Graphic(polygons[j].Geometry, new Dictionary <string, object>() { { "Type", "ServiceArea" } }, fillSymbols[j % 2]) { ZIndex = 0 }; // Add graphic for service area. Alternate the color of each polygon. allGraphics.Add(serviceGraphic); } } } catch (Esri.ArcGISRuntime.Http.ArcGISWebException exception) { if (exception.Message.ToString().Equals("Unable to complete operation.")) { CreateErrorDialog("Facility not within San Diego area!"); } else { CreateErrorDialog("An ArcGIS web exception occurred. \n" + exception.Message); } } }