private async Task DoGeodesicLength()
        {
            ResetButton.IsEnabled = false;

            try
            {
                if (MyMapView.Editor.IsActive)
                {
                    MyMapView.Editor.Cancel.Execute(null);
                }

                //Get the input polygon geometry from the user
                inputGeom = await MyMapView.Editor.RequestShapeAsync(DrawShape.Polyline);

                if (inputGeom != null)
                {
                    //Add the polygon drawn by the user
                    var g = new Graphic
                    {
                        Geometry = inputGeom,
                    };
                    myGraphicsLayer.Graphics.Add(g);


                    //Get the label point for the input geometry
                    var length = GeometryEngine.GeodesicLength(inputGeom);
                    LineLengthTextBlock.Text       = length.ToString("N2") + " m";
                    LineLengthTextBlock.Visibility = Windows.UI.Xaml.Visibility.Visible;
                }
            }
            catch (Exception)
            {
            }
            ResetButton.IsEnabled = true;
        }
Пример #2
0
        /// <summary>
        /// Raises the <see cref="MeasureUpdated"/> and updates display based on <see cref="MeasureItemCollection"/>,
        /// <see cref="TotalLength"/> and <see cref="Area"/> properties.
        /// </summary>
        private void UpdateDisplay(Polyline polyline)
        {
            Polygon area = null;

            if (polyline != null && polyline.Parts[0].Count > 2)
            {
                area = new Polygon(polyline.Parts, polyline.SpatialReference);
            }
            OnMeasureUpdated((Geometry)area ?? polyline);
            MapPoint previousPoint   = null;
            int      coordinateIndex = 0;

            foreach (var measureItem in MeasureItemCollection)
            {
                measureItem.CoordinateIndex = coordinateIndex++;
                if (previousPoint != null)
                {
                    measureItem.Length = GeometryEngine.GeodesicLength(
                        new Polyline(new MapPoint[] { previousPoint, measureItem.Location },
                                     measureItem.Location.SpatialReference),
                        GeodeticCurveType.GreatElliptic);
                }
                previousPoint = measureItem.Location;
            }

            MeasureSummary.TotalLength = polyline == null || polyline.Parts[0].Count < 2
                ? 0
                : GeometryEngine.GeodesicLength(polyline);
            MeasureSummary.Area = area == null
                ? 0
                : GeometryEngine.GeodesicArea(area);
        }
Пример #3
0
        // Draw and densify a user defined polygon
        private async void DensifyButton_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                resultsPanel.Visibility = Visibility.Collapsed;
                inputGraphics.Graphics.Clear();
                resultGraphics.Graphics.Clear();

                // Request polygon or polyline from the user
                DrawShape drawShape = (DrawShape)comboShapeType.SelectedItem;
                var       original  = await mapView.Editor.RequestShapeAsync(drawShape, _fillSymbol);

                // Add original shape vertices to input graphics layer
                var coordsOriginal = ((IEnumerable <CoordinateCollection>)original).First();
                foreach (var coord in coordsOriginal)
                {
                    inputGraphics.Graphics.Add(new Graphic(new MapPoint(coord, original.SpatialReference), _origVertexSymbol));
                }

                // Densify the shape
                var densify = GeometryEngine.GeodesicDensify(original, mapView.Extent.Width / 100, LinearUnits.Meters);
                inputGraphics.Graphics.Add(new Graphic(densify, _fillSymbol));

                // Add new vertices to result graphics layer
                var coordsDensify = ((IEnumerable <CoordinateCollection>)densify).First();
                foreach (var coord in coordsDensify)
                {
                    resultGraphics.Graphics.Add(new Graphic(new MapPoint(coord, original.SpatialReference), _newVertexSymbol));
                }

                // Results
                Dictionary <string, object> results = new Dictionary <string, object>();
                results["Length"] = GeometryEngine.GeodesicLength(densify) * METERS_TO_MILES;
                if (original is Polygon)
                {
                    results["Area"] = GeometryEngine.GeodesicArea(densify) * SQUARE_METERS_TO_MILES;
                }
                else
                {
                    results["Area"] = "N/A";
                }
                results["Vertices Before"] = coordsOriginal.Count();
                results["Vertices After"]  = coordsDensify.Count();

                resultsListView.ItemsSource = results;
                resultsPanel.Visibility     = Visibility.Visible;
            }
            catch (TaskCanceledException)
            {
            }
            catch (Exception ex)
            {
                MessageBox.Show("Densify Error: " + ex.Message, "Geodesic Densify Sample");
            }
        }
        /// <summary>
        /// Gets a point a certain distance down a polyline
        /// </summary>
        /// <param name="dist">Distance in meters along the line</param>
        /// <param name="course"></param>
        /// <returns></returns>
        private double[] PointAlongLine(double dist, out double course)
        {
            double accDist = 0;

            course = double.NaN;
            if (dist > lineLength)             //reached end - move to next direction, or start over
            {
                directionIndex++;
                Route currDir;
                if (directionIndex >= m_route.Routes.Count)
                {
                    directionIndex = 0;
                }
                currDir       = m_route.Routes[directionIndex];
                lineLength    = GeometryEngine.GeodesicLength(currDir.RouteGraphic.Geometry);
                totalDistance = 0;
                drivePath     = currDir.RouteGraphic.Geometry as Polyline;
                course        = 0; dist = 0;
                var start = drivePath.Paths[0][0];
            }
            //else
            {
                for (int j = 0; j < drivePath.Paths.Count; j++)
                {
                    var part = drivePath.Paths[j];
                    for (int i = 0; i < part.Count - 1; i++)
                    {
                        var p1 = part[i];
                        var p2 = part[i + 1];
                        if (p1.X == p2.X && p2.Y == p2.Y)
                        {
                            continue;
                        }
                        Polyline linesegment = new Polyline()
                        {
                            SpatialReference = SpatialReferences.Wgs84
                        };
                        linesegment.Paths.AddPart(new Coordinate[] { new Coordinate(p1.X, p1.Y), new Coordinate(p2.X, p2.Y) });
                        double distToWaypoint = GeometryEngine.GeodesicLength(linesegment);
                        if (dist < accDist + distToWaypoint)
                        {
                            var    distAlongSegment = dist - accDist;
                            double fraction         = distAlongSegment / distToWaypoint;
                            course = GetTrueBearingGeodesic(p1.X, p1.Y, p2.X, p2.Y);
                            return(GetPointFromHeadingGeodesic(new double[] { p1.X, p1.Y }, distAlongSegment, course));
                        }
                        accDist += distToWaypoint;
                    }
                }
            }
            return(null);
        }
Пример #5
0
        // Draw and densify a user defined polygon
        private async void DensifyButton_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                resultsPanel.Visibility = Visibility.Collapsed;
                _inputGraphics.Graphics.Clear();
                _resultGraphics.Graphics.Clear();

                // Request polygon or polyline from the user
                DrawShape drawShape = (DrawShape)comboShapeType.SelectedValue;
                var       original  = await mapView.Editor.RequestShapeAsync(drawShape, _fillSymbol);

                // Add original shape vertices to input graphics layer
                var coordsOriginal = ((IEnumerable <CoordinateCollection>)original).First();
                foreach (var coord in coordsOriginal)
                {
                    _inputGraphics.Graphics.Add(new Graphic(new MapPoint(coord, original.SpatialReference), _origVertexSymbol));
                }

                // Densify the shape
                var densify = GeometryEngine.GeodesicDensify(original, mapView.Extent.Width / 100, LinearUnits.Meters);
                _inputGraphics.Graphics.Add(new Graphic(densify, _fillSymbol));

                // Add new vertices to result graphics layer
                var coordsDensify = ((IEnumerable <CoordinateCollection>)densify).First();
                foreach (var coord in coordsDensify)
                {
                    _resultGraphics.Graphics.Add(new Graphic(new MapPoint(coord, original.SpatialReference), _newVertexSymbol));
                }

                // Results
                var results = new List <Tuple <string, object> >()
                {
                    new Tuple <string, object>("Length", GeometryEngine.GeodesicLength(densify) * METERS_TO_MILES),
                    new Tuple <string, object>("Area",
                                               (original is Polygon) ? (GeometryEngine.GeodesicArea(densify) * SQUARE_METERS_TO_MILES).ToString("0.000") : "N/A"),
                    new Tuple <string, object>("Vertices Before", coordsOriginal.Count()),
                    new Tuple <string, object>("Vertices After", coordsDensify.Count())
                };

                resultsListView.ItemsSource = results;
                resultsPanel.Visibility     = Visibility.Visible;
            }
            catch (TaskCanceledException)
            {
            }
            catch (Exception ex)
            {
                var _ = new MessageDialog("Densify Error: " + ex.Message, "Sample Error").ShowAsync();
            }
        }
        private static double GetDistance(Envelope extent)
        {
            // get the distance between the center of the current map extent and one of its corners
            if (extent != null && !extent.IsEmpty)
            {
                var d = GeometryEngine.GeodesicLength(new Polyline(new Coordinate[] { extent.GetCenter().Coordinate, new Coordinate(extent.XMin, extent.YMin) },
                                                                   extent.SpatialReference), GeodeticCurveType.GreatElliptic);

                // to increase the chances of finding results make sure the smallest returned distance is 5 Kilometers.
                return((d <= 5000.0) ? 5000.0 : d);
            }

            return(5000.0); // return a default distance of 5 Kilometers
        }
Пример #7
0
        private async void MyMapView_Tapped(object sender, Esri.ArcGISRuntime.Controls.MapViewInputEventArgs e)
        {
            _routeGraphicsOverlay = MyMapView.GraphicsOverlays["RouteGraphicsOverlay"];
            _stopsGraphicsOverlay = MyMapView.GraphicsOverlays["StopsGraphicsOverlay"];

            var graphicIdx = _stopsGraphicsOverlay.Graphics.Count + 1;

            _stopsGraphicsOverlay.Graphics.Add(CreateStopGraphic(e.Location, graphicIdx));

            if (_stopsGraphicsOverlay.Graphics.Count > 1)
            {
                try
                {
                    progress.Visibility = Visibility.Visible;

                    var routeTask = new OnlineRouteTask(
                        new Uri("http://sampleserver6.arcgisonline.com/arcgis/rest/services/NetworkAnalysis/SanDiego/NAServer/Route"));
                    var routeParams = await routeTask.GetDefaultParametersAsync();

                    routeParams.SetStops(_stopsGraphicsOverlay.Graphics);
                    routeParams.UseTimeWindows      = false;
                    routeParams.OutSpatialReference = MyMapView.SpatialReference;
                    routeParams.DirectionsLanguage  = new CultureInfo("en-Us");                    // CultureInfo.CurrentCulture;

                    var result = await routeTask.SolveAsync(routeParams);

                    if (result.Routes.Count > 0)
                    {
                        _routeGraphicsOverlay.Graphics.Clear();

                        var route = result.Routes.First().RouteFeature;
                        _routeGraphicsOverlay.Graphics.Add(new Graphic(route.Geometry));

                        var meters = GeometryEngine.GeodesicLength(route.Geometry, GeodeticCurveType.Geodesic);
                        txtDistance.Text = string.Format("{0:0.00} miles", LinearUnits.Miles.ConvertFromMeters(meters));

                        panelRouteInfo.Visibility = Visibility.Visible;
                    }
                }
                catch (Exception ex)
                {
                    var _x = new MessageDialog(ex.Message, "Sample Error").ShowAsync();
                }
                finally
                {
                    progress.Visibility = Visibility.Collapsed;
                }
            }
        }
Пример #8
0
        public async Task <RouteResult> GetRoute(IEnumerable <MapPoint> stops, CancellationToken cancellationToken)
        {
            if (stops == null)
            {
                throw new ArgumentNullException("stops");
            }

            List <Graphic> stopList = new List <Graphic>();

            foreach (var stop in stops)
            {
                stopList.Add(new Graphic(stop));
            }
            if (stopList.Count < 2)
            {
                throw new ArgumentException("Not enough stops");
            }

            //determine which route service to use. Long distance routes should use the long-route service
            Polyline line = new Polyline()
            {
                SpatialReference = SpatialReferences.Wgs84
            };

            line.Paths.AddPart(stops.Select(m => m.Coordinate));
            var    length = GeometryEngine.GeodesicLength(line);
            string svc    = routeService;

            if (length > 200000)
            {
                svc = longRouteService;
            }

            //Calculate route
            RouteTask task = new OnlineRouteTask(new Uri(svc))
            {
                HttpMessageHandler = messageHandler
            };
            var parameters = await task.GetDefaultParametersAsync().ConfigureAwait(false);

            parameters.Stops                     = new Esri.ArcGISRuntime.Tasks.NetworkAnalyst.FeaturesAsFeature(stopList);
            parameters.ReturnStops               = true;
            parameters.OutputLines               = OutputLine.TrueShapeWithMeasure;
            parameters.OutSpatialReference       = SpatialReferences.Wgs84;
            parameters.DirectionsLengthUnit      = LinearUnits.Meters;
            parameters.UseTimeWindows            = false;
            parameters.RestrictionAttributeNames = new List <string>(new string[] { "OneWay " });
            return(await task.SolveAsync(parameters, cancellationToken));
        }
        private async Task CalculateRouteAsync()
        {
            try
            {
                progress.Visibility = Visibility.Visible;

                RouteParameters routeParams = await _routeTask.GetDefaultParametersAsync();

                routeParams.OutSpatialReference = MyMapView.SpatialReference;
                routeParams.ReturnDirections    = false;

                routeParams.SetStops(_stopsGraphicsOverlay.Graphics);

                RouteResult routeResult = await _routeTask.SolveAsync(routeParams);

                if (routeResult.Routes.Count > 0)
                {
                    _routeGraphicsOverlay.Graphics.Clear();

                    var route = routeResult.Routes.First().RouteFeature;
                    _routeGraphicsOverlay.Graphics.Add(new Graphic(route.Geometry));

                    var meters = GeometryEngine.GeodesicLength(route.Geometry, GeodeticCurveType.Geodesic);
                    txtDistance.Text = string.Format("{0:0.00} miles", LinearUnits.Miles.ConvertFromMeters(meters));

                    panelRouteInfo.Visibility = Visibility.Visible;
                }
            }
            catch (AggregateException ex)
            {
                var innermostExceptions = ex.Flatten().InnerExceptions;
                if (innermostExceptions != null && innermostExceptions.Count > 0)
                {
                    MessageBox.Show(innermostExceptions[0].Message);
                }
                else
                {
                    MessageBox.Show(ex.Message);
                }
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message);
            }
            finally
            {
                progress.Visibility = Visibility.Collapsed;
            }
        }
Пример #10
0
        /// <summary>
        /// Gets a point a certain distance down a polyline
        /// </summary>
        /// <param name="dist">Distance in meters along the line</param>
        /// <param name="course"></param>
        /// <returns></returns>
        private double[] PointAlongLine(double dist, out double course)
        {
            double accDist = 0;

            course = double.NaN;
            if (dist > lineLength)             //reached end - move to next direction, or start over
            {
                directionIndex++;
                Route currDir;
                if (directionIndex >= m_route.Routes.Count)
                {
                    directionIndex = 0;
                }
                currDir       = m_route.Routes[directionIndex];
                lineLength    = GeometryEngine.GeodesicLength(currDir.RouteFeature.Geometry);
                totalDistance = 0;
                drivePath     = currDir.RouteFeature.Geometry as Polyline;
                course        = 0; dist = 0;
            }
            //else
            {
                var parts = drivePath.Parts.GetPartsAsPoints().ToList();
                for (int j = 0; j < parts.Count; j++)
                {
                    var part = parts[j].ToList();
                    for (int i = 0; i < part.Count - 1; i++)
                    {
                        var p1 = part[i];
                        var p2 = part[i + 1];
                        if (p1.X == p2.X && p2.Y == p2.Y)
                        {
                            continue;
                        }
                        double distToWaypoint = GeometryEngine.GeodesicDistance(p1, p2, LinearUnits.Meters);
                        if (dist < accDist + distToWaypoint)
                        {
                            var    distAlongSegment = dist - accDist;
                            double fraction         = distAlongSegment / distToWaypoint;
                            course = GetTrueBearingGeodesic(p1.X, p1.Y, p2.X, p2.Y);
                            return(GetPointFromHeadingGeodesic(new double[] { p1.X, p1.Y }, distAlongSegment, course));
                        }
                        accDist += distToWaypoint;
                    }
                }
            }
            return(null);
        }
Пример #11
0
        /// <summary>
        /// Creates a new camera offset from the provided camera around an ellipse.
        /// </summary>
        /// <param name="camera">The starting camera.</param>
        /// <param name="ellipse">The ellipse around which the camera will rotate.</param>
        /// <param name="centerPoint">The center point of the ellipse.</param>
        /// <param name="percentAlong">The percentage around the ellipse to create the camera.</param>
        private Camera OffsetCamera(Camera camera, Polyline ellipse, MapPoint centerPoint, double percentAlong)
        {
            camera = CloneCamera(camera);

            var fromPoint = GeometryEngine.MovePointAlongLine(ellipse, percentAlong, true, 0);

            var segment = LineBuilder.CreateLineSegment(new Coordinate2D(centerPoint.X, centerPoint.Y), new Coordinate2D(fromPoint.X, centerPoint.Y), centerPoint.SpatialReference);
            var difX    = GeometryEngine.GeodesicLength(PolylineBuilder.CreatePolyline(segment, segment.SpatialReference));

            if (centerPoint.X - fromPoint.X < 0)
            {
                difX *= -1;
            }

            segment = LineBuilder.CreateLineSegment(new Coordinate2D(centerPoint.X, centerPoint.Y), new Coordinate2D(centerPoint.X, fromPoint.Y), centerPoint.SpatialReference);
            var difY = GeometryEngine.GeodesicLength(PolylineBuilder.CreatePolyline(segment, segment.SpatialReference));

            if (centerPoint.Y - fromPoint.Y < 0)
            {
                difY *= -1;
            }

            var radian  = Math.Atan2(difX, difY);
            var heading = radian * -180 / Math.PI;

            camera.Heading = heading;

            var difZ       = centerPoint.Z - (camera.Z * ((camera.SpatialReference.IsGeographic) ? 1.0 : camera.SpatialReference.Unit.ConversionFactor));
            var hypotenuse = GeometryEngine.GeodesicDistance(fromPoint, centerPoint);

            radian = Math.Atan2(difZ, hypotenuse);
            var pitch = radian * 180 / Math.PI;

            camera.Pitch = pitch;

            if (fromPoint.SpatialReference.Wkid != camera.SpatialReference.Wkid)
            {
                var transformation = ProjectionTransformation.Create(fromPoint.SpatialReference, camera.SpatialReference);
                fromPoint = GeometryEngine.ProjectEx(fromPoint, transformation) as MapPoint;
            }

            camera.X = fromPoint.X;
            camera.Y = fromPoint.Y;
            return(camera);
        }
        private async void MeasureButton_Click(object sender, RoutedEventArgs e)
        {
            string message = null;

            try
            {
                var geometry = await MyMapView.Editor.RequestShapeAsync(DrawShape.Polyline);

                var polyline = geometry as Polyline;
                if (polyline != null && polyline.Parts != null && polyline.Parts.Count > 0)
                {
                    var vertices = polyline.Parts[0].GetPoints();
                    var count    = vertices != null?vertices.Count() : 0;

                    if (count > 1)
                    {
                        var result      = new StringBuilder();
                        var totalLength = GeometryEngine.GeodesicLength(polyline);
                        result.AppendFormat("Total Length\t:\t{0:0} m\n", totalLength);
                        if (count > 2)
                        {
                            var polygon = new Polygon(polyline.Parts, polyline.SpatialReference);
                            var area    = GeometryEngine.GeodesicArea(polygon);
                            result.AppendFormat("Area\t\t:\t{0:0} m²\n", area);
                        }
                        if (result.Length > 0)
                        {
                            message = string.Format("Measure results:\n{0}", result);
                        }
                    }
                }
            }
            catch (TaskCanceledException)
            {
            }
            catch (Exception ex)
            {
                message = ex.Message;
            }
            if (!string.IsNullOrWhiteSpace(message))
            {
                await new MessageDialog(message).ShowAsync();
            }
        }
Пример #13
0
        private async Task doCalculateAreaAndLength()
        {
            try
            {
                //Wait for user to draw
                var geom = await mapView1.Editor.RequestShapeAsync(DrawShape.Polygon);

                //show geometry on map
                _graphicsOverlay.Graphics.Clear();

                var g = new Graphic {
                    Geometry = geom, Symbol = LayoutRoot.Resources["DefaultFillSymbol"] as Esri.ArcGISRuntime.Symbology.Symbol
                };
                _graphicsOverlay.Graphics.Add(g);


                //Calculate results
                var areaPlanar = GeometryEngine.Area(geom);
                ResultsAreaPlanar.Text = string.Format("{0} millas cuad.", (areaPlanar * toSqMilesConversion).ToString("n3"));

                var perimPlanar = GeometryEngine.Length(geom);
                ResultsPerimeterPlanar.Text = string.Format("{0} millas", (perimPlanar * toMilesConversion).ToString("n3"));


                var areaGeodesic = GeometryEngine.GeodesicArea(geom);
                ResultsAreaGeodesic.Text = string.Format("{0} millas cuad.", (areaGeodesic * toSqMilesConversion).ToString("n3"));

                var perimGeodesic = GeometryEngine.GeodesicLength(geom);
                ResultsPerimeterGeodesic.Text = string.Format("{0} millas cuad.", (perimGeodesic * toMilesConversion).ToString("n3"));

                //Instructions.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
                Results.Visibility  = Windows.UI.Xaml.Visibility.Visible;
                Reiniciar.IsEnabled = true;
            }
            catch (System.Threading.Tasks.TaskCanceledException)
            {
                var dlg = new MessageDialog("El trazado actual ha sido cancelado.", "Tarea Cancelada!");
                var _x  = dlg.ShowAsync();
            }
        }
Пример #14
0
        private async Task DoCalculateAreaAndLengthAsync()
        {
            try
            {
                //Wait for user to draw
                var geom = await MyMapView.Editor.RequestShapeAsync(DrawShape.Polygon);

                //show geometry on map
                _graphicsOverlay.Graphics.Clear();

                var g = new Graphic
                {
                    Geometry = geom,
                    Symbol   = LayoutRoot.Resources["DefaultFillSymbol"] as Esri.ArcGISRuntime.Symbology.Symbol
                };
                _graphicsOverlay.Graphics.Add(g);

                //Calculate results
                var areaPlanar = GeometryEngine.Area(geom);
                ResultsAreaPlanar.Text = string.Format("{0} sq. miles", (areaPlanar * toSqMilesConversion).ToString("n3"));

                var perimPlanar = GeometryEngine.Length(geom);
                ResultsPerimeterPlanar.Text = string.Format("{0} miles", (perimPlanar * toMilesConversion).ToString("n3"));

                var areaGeodesic = GeometryEngine.GeodesicArea(geom);
                ResultsAreaGeodesic.Text = string.Format("{0} sq. miles", (areaGeodesic * toSqMilesConversion).ToString("n3"));

                var perimGeodesic = GeometryEngine.GeodesicLength(geom);
                ResultsPerimeterGeodesic.Text = string.Format("{0} miles", (perimGeodesic * toMilesConversion).ToString("n3"));

                Instructions.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
                Results.Visibility      = Windows.UI.Xaml.Visibility.Visible;
            }
            catch (TaskCanceledException)
            {
                var _x = new MessageDialog("Current sketch has been canceled.", "Task Canceled!").ShowAsync();
            }
        }
        private async Task doCalculateAreaAndLength()
        {
            try
            {
                // Wait for user to draw
                var geom = await mapView.Editor.RequestShapeAsync(DrawShape.Polygon);

                // show geometry on map
                graphicsLayer.Graphics.Clear();

                var graphic = new Graphic {
                    Geometry = geom, Symbol = LayoutRoot.Resources["DefaultFillSymbol"] as Symbol
                };
                graphicsLayer.Graphics.Add(graphic);

                // Calculate results
                var areaPlanar = GeometryEngine.Area(geom);
                ResultsAreaPlanar.Text = string.Format("{0} sq. miles", (areaPlanar * toSqMilesConversion).ToString("n3"));

                var perimPlanar = GeometryEngine.Length(geom);
                ResultsPerimeterPlanar.Text = string.Format("{0} miles", (perimPlanar * toMilesConversion).ToString("n3"));

                var areaGeodesic = GeometryEngine.GeodesicArea(geom);
                ResultsAreaGeodesic.Text = string.Format("{0} sq. miles", (areaGeodesic * toSqMilesConversion).ToString("n3"));

                var perimGeodesic = GeometryEngine.GeodesicLength(geom);
                ResultsPerimeterGeodesic.Text = string.Format("{0} miles", (perimGeodesic * toMilesConversion).ToString("n3"));

                Instructions.Visibility = Visibility.Collapsed;
                Results.Visibility      = Visibility.Visible;
            }
            catch (TaskCanceledException)
            {
                MessageBox.Show("Current sketch has been canceled.", "Task Canceled!");
            }
        }
        private void OnStatusUpdated(GeometryEditStatus status)
        {
            _measurements.Clear();
            var polyline = status.NewGeometry as Polyline;

            if (polyline == null || polyline.Parts == null || polyline.Parts.Count == 0)
            {
                return;
            }
            var vertices = polyline.Parts[0].GetPoints();

            if (vertices == null || !vertices.Any())
            {
                return;
            }
            var count = vertices.Count();

            if (count <= 1)
            {
                return;
            }
            MapPoint previous = null;
            int      i        = 1;

            foreach (var point in vertices)
            {
                if (previous == null)
                {
                    previous = point;
                    continue;
                }
                var lineSegment        = new Polyline(new MapPoint[] { previous, point }, polyline.SpatialReference);
                var intermediateLength = GeometryEngine.GeodesicLength(lineSegment);
                _measurements.Add(string.Format("[{0}-{1}]\t:\t{2:0} m\n", i, i + 1, intermediateLength));
                previous = point;
                i++;
            }
            var totalLength = GeometryEngine.GeodesicLength(polyline);

            TotalLength.Text = string.Format("Total Length\t:\t{0:0} m\n", totalLength);
            if (count <= 2)
            {
                return;
            }
            var layer = MyMapView.Map.Layers["ResultLayer"] as GraphicsLayer;

            if (layer == null)
            {
                return;
            }
            var graphic = layer.Graphics.FirstOrDefault();
            var polygon = new Polygon(vertices, polyline.SpatialReference);

            if (graphic != null)
            {
                graphic.Geometry = polygon;
            }
            else
            {
                layer.Graphics.Add(new Graphic(polygon));
            }
            if (count <= 1)
            {
                return;
            }
            if (count <= 2)
            {
                return;
            }
            var area = GeometryEngine.GeodesicArea(polygon);

            TotalArea.Text = string.Format("Area\t\t:\t{0:0} m²\n", area);
        }
Пример #17
0
        // Draw and densify a user defined polygon
        private async void DensifyButton_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                DensifyButton.IsEnabled = false;
                resultsPanel.Visibility = Visibility.Collapsed;
                _inputOverlay.Graphics.Clear();
                _resultsOverlay.Graphics.Clear();

                DrawShape drawShape;

                drawShape = (RadioPolyline.IsChecked.Value) ? drawShape = DrawShape.Polyline : drawShape = DrawShape.Polygon;

                // Use polyline as default
                Symbol symbolToUse = _lineSymbol;
                if (drawShape == DrawShape.Polygon)
                {
                    symbolToUse = _fillSymbol;
                }

                var original = await MyMapView.Editor.RequestShapeAsync(drawShape, symbolToUse);

                // Account for WrapAround
                var normalized = GeometryEngine.NormalizeCentralMeridian(original);

                // Add original shape vertices to input graphics layer
                var coordsOriginal = (normalized as Multipart).Parts.First().GetPoints();
                foreach (var coord in coordsOriginal)
                {
                    _inputOverlay.Graphics.Add(new Graphic(coord, _origVertexSymbol));
                }

                // Get current viewpoints extent from the MapView
                var currentViewpoint = MyMapView.GetCurrentViewpoint(ViewpointType.BoundingGeometry);
                var viewpointExtent  = currentViewpoint.TargetGeometry.Extent;

                // Densify the shape
                var densify = GeometryEngine.GeodesicDensify(normalized, viewpointExtent.Width / 100, LinearUnits.Meters);

                if (densify.GeometryType == GeometryType.Polygon)
                {
                    _inputOverlay.Graphics.Add(new Graphic(densify, _fillSymbol));
                }
                else
                {
                    _inputOverlay.Graphics.Add(new Graphic(densify, _lineSymbol));
                }

                // Add new vertices to result graphics layer
                var coordsDensify = (densify as Multipart).Parts.First().GetPoints();
                foreach (var coord in coordsDensify)
                {
                    _resultsOverlay.Graphics.Add(new Graphic(coord, _newVertexSymbol));
                }

                // Results
                var results = new List <Tuple <string, object> >()
                {
                    new Tuple <string, object>("Length", GeometryEngine.GeodesicLength(densify) * METERS_TO_MILES),
                    new Tuple <string, object>("Area",
                                               (normalized is Polygon) ? (GeometryEngine.GeodesicArea(densify) * SQUARE_METERS_TO_MILES).ToString("0.000") : "N/A"),
                    new Tuple <string, object>("Vertices Before", coordsOriginal.Count()),
                    new Tuple <string, object>("Vertices After", coordsDensify.Count())
                };

                resultsListView.ItemsSource = results;
                resultsPanel.Visibility     = Visibility.Visible;
            }
            catch (TaskCanceledException) { }
            catch (Exception ex)
            {
                var _x = new MessageDialog("Densify Error: " + ex.Message, "Sample Error").ShowAsync();
            }
            finally
            {
                DensifyButton.IsEnabled = true;
            }
        }
        // Draw and densify a user defined polygon
        private async void DensifyButton_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                resultsPanel.Visibility = Visibility.Collapsed;
                _inputOverlay.Graphics.Clear();
                _resultsOverlay.Graphics.Clear();

                // Request polygon or polyline from the user
                DrawShape drawShape = (DrawShape)comboShapeType.SelectedValue;

                // Use polyline as default
                Symbol symbolToUse = _lineSymbol;
                if (drawShape == DrawShape.Polygon)
                {
                    symbolToUse = _fillSymbol;
                }

                var original = await MyMapView.Editor.RequestShapeAsync(drawShape, symbolToUse);

                // Account for WrapAround
                var normalized = GeometryEngine.NormalizeCentralMeridian(original);

                // Add original shape vertices to input graphics layer
                var coordsOriginal = (normalized as Multipart).Parts.First().GetPoints();
                foreach (var mapPoint in coordsOriginal)
                {
                    _inputOverlay.Graphics.Add(new Graphic(mapPoint, _origVertexSymbol));
                }

                // Get current viewpoints extent from the MapView
                var currentViewpoint = MyMapView.GetCurrentViewpoint(ViewpointType.BoundingGeometry);
                var viewpointExtent  = currentViewpoint.TargetGeometry.Extent;

                // Densify the shape
                var densify = GeometryEngine.GeodesicDensify(normalized, viewpointExtent.Width / 100, LinearUnits.Meters);

                if (densify.GeometryType == GeometryType.Polygon)
                {
                    _inputOverlay.Graphics.Add(new Graphic(densify, _fillSymbol));
                }
                else
                {
                    _inputOverlay.Graphics.Add(new Graphic(densify, _lineSymbol));
                }

                // Add new vertices to result graphics layer
                var coordsDensify = (densify as Multipart).Parts.First().GetPoints();
                foreach (var mapPoint in coordsDensify)
                {
                    _resultsOverlay.Graphics.Add(new Graphic(mapPoint, _newVertexSymbol));
                }

                // Results
                Dictionary <string, object> results = new Dictionary <string, object>();
                results["Length"] = GeometryEngine.GeodesicLength(densify) * METERS_TO_MILES;
                if (normalized is Polygon)
                {
                    results["Area"] = GeometryEngine.GeodesicArea(densify) * SQUARE_METERS_TO_MILES;
                }
                else
                {
                    results["Area"] = "N/A";
                }
                results["Vertices Before"] = coordsOriginal.Count();
                results["Vertices After"]  = coordsDensify.Count();

                resultsListView.ItemsSource = results;
                resultsPanel.Visibility     = Visibility.Visible;
            }
            catch (TaskCanceledException) { }
            catch (Exception ex)
            {
                MessageBox.Show("Densify Error: " + ex.Message, "Geodesic Densify Sample");
            }
        }