private async Task FindServiceAreas() { try { // Create the service area task. _serviceAreaTask = await ServiceAreaTask.CreateAsync(new Uri(NetworkAnalysisUrl)); // Create the default parameters for the service. ServiceAreaParameters serviceAreaParameters = await _serviceAreaTask.CreateDefaultParametersAsync(); // Configure the service area parameters. serviceAreaParameters.PolygonDetail = ServiceAreaPolygonDetail.High; serviceAreaParameters.ReturnPolygons = true; serviceAreaParameters.DefaultImpedanceCutoffs.Clear(); serviceAreaParameters.DefaultImpedanceCutoffs.Add(0); serviceAreaParameters.DefaultImpedanceCutoffs.Add(3); serviceAreaParameters.DefaultImpedanceCutoffs.Add(5); // A query that finds all of the relevant facilities from the facilities feature service. QueryParameters facilityQueryParameters = new QueryParameters(); facilityQueryParameters.WhereClause = "1=1"; // Provide the feature service and the query as parameters to the service area task. serviceAreaParameters.SetFacilities(_facilitiesTable, facilityQueryParameters); // Perform the service area analysis. ServiceAreaResult result = await _serviceAreaTask.SolveServiceAreaAsync(serviceAreaParameters); // Count the features in the facilities layer. long facilityCount = await _facilitiesTable.QueryFeatureCountAsync(facilityQueryParameters); // Get the service area for each facility. for (int facilityIndex = 0; facilityIndex < facilityCount; facilityIndex++) { // Get each area polygon from the result for that facility. List <ServiceAreaPolygon> areaPolygons = result.GetResultPolygons(facilityIndex).ToList(); // Add each service area polygon to the graphics overlay. for (int polygonIndex = 0; polygonIndex < areaPolygons.Count; polygonIndex++) { // Get the polygon from the result. Polygon resultingPolygon = areaPolygons[polygonIndex].Geometry; // Choose a symbol for the polygon. SimpleFillSymbol selectedSymbol = _fillSymbols[polygonIndex % _fillSymbols.Count]; // Create and add the graphic. _resultOverlay.Graphics.Add(new Graphic(resultingPolygon, selectedSymbol)); } } // Zoom to the extent of the results. await _myMapView.SetViewpointGeometryAsync(_resultOverlay.Extent, 50); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex); ShowMessage("Error", "Couldn't complete service area analysis."); } }
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); } } }