/// <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); }
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 }); }
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; } }
/// <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); }
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; }