/// <summary>
        /// Calculate the conversion from meters to other distance units
        /// </summary>
        /// <param name="toUnit">Convert from meters into this Units</param>
        /// <returns>The conversion value from meters into the parameter units</returns>
        public static double GetConversionFromMeter(ScaleLine.ScaleLineUnit toUnit)
        {
            // 1 meter = 3.2808334 US Feet (3.2808399 International Feet)
            double conversion = 1.0;

            switch (toUnit)
            {
            case ScaleLine.ScaleLineUnit.Meters: conversion = 1.0; break;

            case ScaleLine.ScaleLineUnit.Feet: conversion = 3.28083; break;

            case ScaleLine.ScaleLineUnit.Yards: conversion = 1.09361; break;

            case ScaleLine.ScaleLineUnit.Miles: conversion = 3.28083 / 5280; break;

            case ScaleLine.ScaleLineUnit.Inches: conversion = 3.28083 * 12.0; break;

            case ScaleLine.ScaleLineUnit.Decimeters: conversion = 10; break;

            case ScaleLine.ScaleLineUnit.Centimeters: conversion = 100; break;

            case ScaleLine.ScaleLineUnit.Millimeters: conversion = 1000; break;

            case ScaleLine.ScaleLineUnit.Kilometers: conversion = 0.001; break;

            case ScaleLine.ScaleLineUnit.NauticalMiles: conversion = 3.28083 / (5280 * 1.15077945); break;

            default: conversion = 1.0; break;
            }

            return(conversion);
        }
        /// <summary>
        /// Calculate the conversion from other distance units to meters
        /// </summary>
        /// <param name="fromUnit">The units from which to convert into meters</param>
        /// <returns>The conversion value from the parameter units into meters</returns>
        public static double GetConversionToMeter(ScaleLine.ScaleLineUnit fromUnit)
        {
            double conversion = 1.0;

            switch (fromUnit)
            {
            case ScaleLine.ScaleLineUnit.Meters: conversion = 1.0; break;

            case ScaleLine.ScaleLineUnit.Feet: conversion = 1.0 / 3.28083; break;

            case ScaleLine.ScaleLineUnit.Yards: conversion = 1.0 / 1.09361; break;

            case ScaleLine.ScaleLineUnit.Miles: conversion = 5280 / 3.28083; break;

            case ScaleLine.ScaleLineUnit.Inches: conversion = 1.0 / (3.28083 * 12.0); break;

            case ScaleLine.ScaleLineUnit.Decimeters: conversion = 0.1; break;

            case ScaleLine.ScaleLineUnit.Centimeters: conversion = 0.01; break;

            case ScaleLine.ScaleLineUnit.Millimeters: conversion = 0.001; break;

            case ScaleLine.ScaleLineUnit.Kilometers: conversion = 1000.0; break;

            case ScaleLine.ScaleLineUnit.NauticalMiles: conversion = (5280 * 1.15077945) / 3.28083; break;

            default: conversion = 1.0; break;
            }

            return(conversion);
        }
예제 #3
0
        private const double DEGREE_DISTANCE = EARTH_RADIUS * DEGREE_RADIANS; // distance of 1 degree at equator in meters

        public static double RatioScaleResolution(double centerY, int srWKID, ScaleLine.ScaleLineUnit mapUnits)
        {
            double ratio = 1.0;

            if (IsWebMercatorSR(srWKID))
            {
                // Transform Y center from web mercator to decimal degree
                centerY = Math.Min(Math.Max(centerY, -20037508.3427892), 20037508.3427892);

                MapPoint point = new MapPoint(0, centerY);
                centerY = point.WebMercatorToGeographic().Y;
                ratio   = Math.Cos(centerY * DEGREE_RADIANS) * SCREEN_DPI * 39.3700787; // 39.3700787 = ScaleLine.ScaleLineUnit.Meters/ScaleLine.ScaleLineUnit.Inches
            }
            else if (mapUnits == ScaleLine.ScaleLineUnit.DecimalDegrees || mapUnits == ScaleLine.ScaleLineUnit.Undefined)
            {
                if (Math.Abs(centerY) > 90)
                {
                    ratio = 0.0;
                }
                else
                {
                    ratio = Math.Cos(centerY * DEGREE_RADIANS) * DEGREE_DISTANCE * SCREEN_DPI * 39.3700787;
                }
            }
            else
            {
                ratio = (double)SCREEN_DPI * (int)mapUnits / (int)ScaleLine.ScaleLineUnit.Inches;
            }

            return(ratio);
        }
        /// <summary>
        /// Calculate the conversion from other units to decimal degrees at a specific Latitude
        /// </summary>
        /// <param name="latitude">Where the conversion happens</param>
        /// <param name="fromUnit">The units from which to convert into degrees</param>
        /// <returns>The conversion value from the parameter units into degrees</returns>
        public static double[] GetConversionToDegree(double latitude, ScaleLine.ScaleLineUnit fromUnit)
        {
            double[] meters     = Degree2Meter(latitude);
            double   conversion = GetConversionToMeter(fromUnit);

            return(new double[2] {
                conversion / meters[0], conversion / meters[1]
            });
        }
        /// <summary>
        /// Calculate the conversion from decimal degrees to other units at a specific Latitude
        /// </summary>
        /// <param name="latitude">Where the conversion happens</param>
        /// <param name="toUnit">Convert from degrees into this Units</param>
        /// <returns>The conversion value from degrees into the parameter units</returns>
        public static double[] GetConversionFromDegree(double latitude, ScaleLine.ScaleLineUnit toUnit)
        {
            double[] meters     = Degree2Meter(latitude);
            double   conversion = GetConversionFromMeter(toUnit);

            return(new double[2] {
                meters[0] * conversion, meters[1] * conversion
            });
        }
예제 #6
0
        private void GeometryService_ProjectCompleted(object sender, GraphicsEventArgs e)
        {
            ScaleLine.ScaleLineUnit units = UnitsHelper.GetUnitsByWKID(widgetConfig.ProjectToWKID);

            switch (this.measurementMode)
            {
            case MODE_LENGTH:
                geometryService.LengthsAsync(e.Results, units);
                break;

            case MODE_AREA:
                geometryService.AreasAndLengthsAsync(e.Results, units);
                break;
            }
        }
예제 #7
0
        /// <summary>
        /// Expand a geometry's extent - Help Map zoom to the geometry
        /// </summary>
        /// <param name="geometry">Geometry parameter: Point, Polyline, or Polygon</param>
        /// <param name="percent">Percentage to expand the geometry's extent</param>
        /// <returns>An expanded envelope</returns>
        public static Envelope ExpandGeometryExtent(Geometry geometry, double percent)
        {
            if (geometry != null && Application.Current.RootVisual != null)
            {
                Envelope ext = geometry.Extent;
                ScaleLine.ScaleLineUnit mapUnits = (Application.Current.RootVisual as MapPage).MapUnits;

                double radiusX = MINIMUM_MAP_WIDTH / 2.0;
                double radiusY = MINIMUM_MAP_WIDTH / 2.0;
                double minimum = MINIMUM_MAP_WIDTH;

                if (mapUnits == ScaleLine.ScaleLineUnit.DecimalDegrees)
                {
                    double[] conversion = UnitsHelper.GetConversionToDegree((ext.YMin + ext.YMax) / 2.0, ScaleLine.ScaleLineUnit.Meters);
                    radiusX *= conversion[0];
                    radiusY *= conversion[1];
                    minimum *= conversion[0];
                }
                else
                {
                    double conversion = UnitsHelper.GetConversionFromMeter(mapUnits);
                    radiusX *= conversion;
                    radiusY *= conversion;
                    minimum *= conversion;
                }

                double bufferX = (ext.Width < minimum) ? radiusX : (ext.Width * percent / 2.0);
                double bufferY = (ext.Height < minimum) ? radiusY : (ext.Height * percent / 2.0);

                ext.XMin = ext.XMin - bufferX;
                ext.XMax = ext.XMax + bufferX;
                ext.YMin = ext.YMin - bufferY;
                ext.YMax = ext.YMax + bufferY;

                return(ext);
            }
            else
            {
                return(null);
            }
        }
        private Polygon CreateBufferCircle(MapPoint center, double radius, bool toMercator)
        {
            double pi36 = Math.PI / 180.0;
            double rx = radius, ry = radius;
            double dx = 1.0, dy = 1.0;

            ScaleLine.ScaleLineUnit units = UnitsHelper.GetUnitsByWKID(center.SpatialReference.WKID);
            if (units == ScaleLine.ScaleLineUnit.DecimalDegrees)
            {
                double[] conversion = UnitsHelper.GetConversionToDegree(center.Y, ScaleLine.ScaleLineUnit.Meters);
                rx = radius * conversion[0];
                ry = radius * conversion[1];
            }
            else
            {
                double conversion = UnitsHelper.GetConversionFromMeter(units);
                rx = radius * conversion;
                ry = radius * conversion;
            }

            PointCollection pointSet      = new PointCollection();

            for (int i = 0; i <= 36; i++)
            {
                dx = center.X + rx * Math.Cos(i * 10 * pi36);
                dy = center.Y + ry * Math.Sin(i * 10 * pi36);
                MapPoint p = new MapPoint(dx, dy, new SpatialReference(center.SpatialReference.WKID));
                pointSet.Add((center.SpatialReference.WKID == 4326 && toMercator) ? p.GeographicToWebMercator() : p);
            }

            Polygon circle                = new Polygon();

            circle.Rings.Add(pointSet);
            circle.SpatialReference = new SpatialReference((center.SpatialReference.WKID == 4326 && toMercator) ? 102113 : center.SpatialReference.WKID);

            return(circle);
        }
        /// <summary>
        /// Get Units by Spatial Reference WKID - Not available for all WKID(s)
        /// </summary>
        /// <param name="wkid">Spatial Reference WKID</param>
        /// <returns>Units</returns>
        public static ScaleLine.ScaleLineUnit GetUnitsByWKID(int wkid)
        {
            ScaleLine.ScaleLineUnit units = ScaleLine.ScaleLineUnit.Meters;

            if (wkid > 4000 && wkid < 5000)
            {
                units = ScaleLine.ScaleLineUnit.DecimalDegrees;                                      // Current 4001 - 4904
            }
            else if (wkid > 37000 && wkid < 37500)
            {
                units = ScaleLine.ScaleLineUnit.DecimalDegrees;                                      // Current 37001 - 37260
            }
            else if (wkid > 103999 && wkid < 105000)
            {
                units = ScaleLine.ScaleLineUnit.DecimalDegrees;                                      // Current 104000 - 104970
            }
            else if (wkid >= 2222 && wkid <= 2289)
            {
                units = ScaleLine.ScaleLineUnit.Feet;
            }
            else if (wkid >= 2759 && wkid <= 2930)
            {
                units = ScaleLine.ScaleLineUnit.Feet;
            }
            else if (wkid >= 2964 && wkid <= 2968)
            {
                units = ScaleLine.ScaleLineUnit.Feet;
            }
            else if (wkid >= 3417 && wkid <= 3438)
            {
                units = ScaleLine.ScaleLineUnit.Feet;
            }
            else if (wkid >= 3441 && wkid <= 3446)
            {
                units = ScaleLine.ScaleLineUnit.Feet;
            }
            else if (wkid >= 3453 && wkid <= 3459)
            {
                units = ScaleLine.ScaleLineUnit.Feet;
            }
            else if (wkid >= 3560 && wkid <= 3570)
            {
                units = ScaleLine.ScaleLineUnit.Feet;
            }
            else if (wkid >= 3734 && wkid <= 3760)
            {
                units = ScaleLine.ScaleLineUnit.Feet;
            }
            else if (wkid == 3991 || wkid == 3992)
            {
                units = ScaleLine.ScaleLineUnit.Feet;
            }
            else if (wkid >= 26801 && wkid <= 26813)
            {
                units = ScaleLine.ScaleLineUnit.Feet;
            }
            else if (wkid >= 32164 && wkid <= 32167)
            {
                units = ScaleLine.ScaleLineUnit.Feet;
            }
            else if (wkid >= 32664 && wkid <= 32667)
            {
                units = ScaleLine.ScaleLineUnit.Feet;
            }
            else if (wkid == 102219 || wkid == 102220)
            {
                units = ScaleLine.ScaleLineUnit.Feet;
            }
            else if (wkid >= 102461 && wkid <= 102468)
            {
                units = ScaleLine.ScaleLineUnit.Feet;
            }
            else if (wkid >= 102629 && wkid <= 102766)
            {
                units = ScaleLine.ScaleLineUnit.Feet;
            }
            else if (wkid >= 103400 && wkid <= 103471)
            {
                units = ScaleLine.ScaleLineUnit.Feet;
            }
            else if (wkid >= 103700 && wkid <= 103793)
            {
                units = ScaleLine.ScaleLineUnit.Feet;
            }
            else if (wkid >= 103900 && wkid <= 103971)
            {
                units = ScaleLine.ScaleLineUnit.Feet;
            }
            else if (wkid == 2314 || wkid == 2992 || wkid == 2994 || wkid == 3089 || wkid == 3091)
            {
                units = ScaleLine.ScaleLineUnit.Feet;
            }
            else if (wkid == 3359 || wkid == 3361 || wkid == 3363 || wkid == 3365 || wkid == 3404)
            {
                units = ScaleLine.ScaleLineUnit.Feet;
            }
            else if (wkid == 65062)
            {
                units = ScaleLine.ScaleLineUnit.Feet;
            }
            else if (wkid == 102068 || wkid == 102069)
            {
                units = ScaleLine.ScaleLineUnit.Kilometers;
            }
            else
            {
                units = ScaleLine.ScaleLineUnit.Meters;
            }

            return(units);
        }
예제 #10
0
        private void ShowMeasurementResult(bool showLabel, ScaleLine.ScaleLineUnit outUnits)
        {
            showLabel = showLabel && CheckResultOnMap.IsChecked.Value;
            if (outUnits != ScaleLine.ScaleLineUnit.Undefined)
            {
                resultUnits = outUnits;
            }

            if (measurementMode == MODE_LENGTH && geometryService.LengthsLastResult != null)
            {
                // Length in meters
                double length = geometryService.LengthsLastResult[0] * UnitsHelper.GetConversionToMeter(resultUnits);

                // Length in selected units
                MeasurementUnits lenUnits = (ListLengthUnits.SelectedItem as ComboBoxItem).Tag as MeasurementUnits;
                TextLengthResult.Text = string.Format("{0}", Math.Round(length * lenUnits.Conversion, 3));

                if (showLabel && this.GraphicsLayer.Graphics.Count > 0)
                {
                    int k = this.GraphicsLayer.Graphics.Count - 1;
                    ESRI.ArcGIS.Client.Geometry.Geometry geometry = this.GraphicsLayer.Graphics[k].Geometry;
                    string  label      = string.Format("Length: {0} {1}", TextLengthResult.Text, lenUnits.Abbreviation);
                    Graphic lblGraphic = new Graphic()
                    {
                        Geometry = geometry.Extent.GetCenter(), Symbol = new TextSymbol()
                        {
                            Text = label, OffsetX = 30, OffsetY = 15, FontSize = 12.0, FontFamily = new FontFamily("Arial Black"), Foreground = new SolidColorBrush(Color.FromArgb(0xFF, 0x00, 0x00, 0xFF))
                        }
                    };
                    AddGraphic(lblGraphic);
                }
            }
            else if (measurementMode == MODE_AREA && geometryService.AreasAndLengthsLastResult != null)
            {
                // Length in meters
                double length = geometryService.AreasAndLengthsLastResult.Lengths[0] * UnitsHelper.GetConversionToMeter(resultUnits);
                // Area in square meters
                double area = Math.Abs(geometryService.AreasAndLengthsLastResult.Areas[0]) * Math.Pow(UnitsHelper.GetConversionToMeter(resultUnits), 2);

                // Length in selected units
                MeasurementUnits lenUnits = (ListLengthUnits.SelectedItem as ComboBoxItem).Tag as MeasurementUnits;
                TextLengthResult.Text = string.Format("{0}", Math.Round(length * lenUnits.Conversion, 3));

                // Area in selected units
                MeasurementUnits areaUnits = (ListAreaUnits.SelectedItem as ComboBoxItem).Tag as MeasurementUnits;
                TextAreaResult.Text = string.Format("{0}", Math.Round(area * areaUnits.Conversion, 3));

                if (showLabel && this.GraphicsLayer.Graphics.Count > 0)
                {
                    int k = this.GraphicsLayer.Graphics.Count - 1;
                    ESRI.ArcGIS.Client.Geometry.Geometry geometry = this.GraphicsLayer.Graphics[k].Geometry;
                    string  label      = string.Format("Parimeter: {0} {1}\nArea: {2} {3}", TextLengthResult.Text, lenUnits.Abbreviation, TextAreaResult.Text, areaUnits.Abbreviation);
                    Graphic lblGraphic = new Graphic()
                    {
                        Geometry = geometry.Extent.GetCenter(), Symbol = new TextSymbol()
                        {
                            Text = label, OffsetX = 50, OffsetY = 15, FontSize = 12.0, FontFamily = new FontFamily("Arial Black"), Foreground = new SolidColorBrush(Color.FromArgb(0xFF, 0x00, 0x00, 0x99))
                        }
                    };
                    AddGraphic(lblGraphic);
                }
            }

            this.IsBusy = false;
        }