/// <summary> /// Adds a polygon to the map /// </summary> /// <param name="polygon">The polygon to add</param> private void AddPolygon(TKPolygon polygon) { polygon.PropertyChanged += OnPolygonPropertyChanged; var mapPolygon = new MapPolygon(); if (polygon.Coordinates != null && polygon.Coordinates.Any()) { mapPolygon.Path = new Geopath(polygon.Coordinates.Select(i => new BasicGeoposition { Latitude = i.Latitude, Longitude = i.Longitude })); } if (polygon.Color != Color.Default) { mapPolygon.FillColor = polygon.Color.ToUWPColor(); } if (polygon.StrokeColor != Color.Default) { mapPolygon.StrokeColor = polygon.StrokeColor.ToUWPColor(); } mapPolygon.StrokeThickness = polygon.StrokeWidth; Map.MapElements.Add(mapPolygon); _polygons.Add(polygon, mapPolygon); }
private void OnPinClicked(TKCustomMapPin pin) { var firstPosition = Pins.First().Position; var position = pin.Position; // if the user tapped the first marker, we'll close the gap. // and prevent them from adding more points. _allowedToAddPoint = _allowedToAddPoint && Pins.Count > 1 && !(Math.Abs(position.Latitude - firstPosition.Latitude) <= 0 && Math.Abs(position.Longitude - firstPosition.Longitude) <= 0); if (!_allowedToAddPoint) { var polygon = new TKPolygon { Color = Color.FromHex("#7f000000"), StrokeColor = Color.Black, StrokeWidth = 2 }; foreach (var line in Polylines) { polygon.Coordinates.AddRange(line.LineCoordinates); } Polylines.Clear(); Polygons.Clear(); Pins.Clear(); Polygons.Add(polygon); } }
async void Locator() { var locator = CrossGeolocator.Current; locator.DesiredAccuracy = 25; var location = await locator.GetPositionAsync(); // comentado la posicion real para hacer pruebas en Cuenca var position = new Position(location.Latitude, location.Longitude); // var position = new Position(-2.908721,-79.038660); await Task.Delay(3000); Mapa.MoveToRegion(MapSpan.FromCenterAndRadius((position), Distance.FromMiles(.3))); await Task.Delay(3000); Mapa.MoveToMapRegion((MapSpan.FromCenterAndRadius(position, Distance.FromMiles(.3))), true); // Mapa.Polygons; var cordenadas = await apiService.GetMyPolygon(navigationService.GetAgenteActual().Id); if (cordenadas.Count() > 0) { // _____________________________ var poly = new TKPolygon { StrokeColor = Color.Blue, StrokeWidth = 2f, Color = new Color(0, 0, 255, 0.1), Coordinates = cordenadas, }; poligonos.Add(poly); Mapa.Polygons = poligonos; // _____________________________ } // Mapa.MapCenter = position; // Mapa.MoveToRegion(MapSpan.FromCenterAndRadius(position, Distance.FromMiles(.3))); // Mapa.MapRegion=(new MapSpan(position, 0.1, 0.1)); // Mapa = new TKCustomMap(MapSpan.FromCenterAndRadius(position, Distance.FromKilometers(2))); }
//renders polygons(plot area) public void PolyMap() { List <TKPolygon> polylist = new List <TKPolygon>(); for (int x = 0; x < ((List <Plot>)Application.Current.Properties["Plots"]).Count(); x++) { if (((List <Plot>)Application.Current.Properties["Plots"]).ElementAt(x).GetPolygon().Count > 0) { TKPolygon newpoly = new TKPolygon { Coordinates = ((List <Plot>)Application.Current.Properties["Plots"]).ElementAt(x).GetPolygon(), Color = Color.LightGray, StrokeColor = Color.LightGreen, }; polylist.Add(newpoly); } } MyMap.Polygons = polylist; }
/// <summary> /// Determines if a <see cref="Position"/> is inside a <see cref="TKPolygon"/> /// </summary> /// <param name="polygon">The Polygon to check</param> /// <param name="position">The Position to calculate</param> /// <returns><c>true</c> if the Position is inside the Polygon, otherwise <c>false</c></returns> public static bool Contains(this TKPolygon polygon, Position position) { var coordinates = polygon.Coordinates; var result = false; var j = coordinates.Count() - 1; for (var i = 0; i < coordinates.Count(); i++) { if ((coordinates[i].Longitude < position.Longitude && coordinates[j].Longitude >= position.Longitude || coordinates[j].Longitude < position.Longitude && coordinates[i].Longitude >= position.Longitude) && coordinates[i].Latitude + (position.Longitude - coordinates[i].Longitude) / (coordinates[j].Longitude - coordinates[i].Longitude) * (coordinates[j].Latitude - coordinates[i].Latitude) < position.Latitude) { result = !result; } j = i; } return(result); }
/// <summary> /// Adds a polygon to the map /// </summary> /// <param name="polygon">The polygon to add</param> private void AddPolygon(TKPolygon polygon) { polygon.PropertyChanged += OnPolygonPropertyChanged; var polygonOptions = new PolygonOptions(); if (polygon.Coordinates != null && polygon.Coordinates.Any()) { polygonOptions.Add(polygon.Coordinates.Select(i => i.ToLatLng()).ToArray()); } if (polygon.Color != Color.Default) { polygonOptions.InvokeFillColor(polygon.Color.ToAndroid().ToArgb()); } if (polygon.StrokeColor != Color.Default) { polygonOptions.InvokeStrokeColor(polygon.StrokeColor.ToAndroid().ToArgb()); } polygonOptions.InvokeStrokeWidth(polygonOptions.StrokeWidth); this._polygons.Add(polygon, this._googleMap.AddPolygon(polygonOptions)); }
/// <summary> /// Gets the area of a <see cref="TKPolygon"/> (defaults to m^2) /// </summary> /// <param name="polygon">The polygon to calculate</param> /// <param name="radius">The radius used in the calculation. Defaults to WGS 84. https://en.wikipedia.org/wiki/World_Geodetic_System</param> /// <returns>returns the area of a polygon</returns> public static double GetArea(this TKPolygon polygon, double radius = wgs84RADIUS) { var coordinates = polygon.Coordinates.EnsureCorrectWinding(); var size = coordinates.Count; if (size < 3) { return(0); } var total = 0d; var prev = coordinates[size - 1]; var prevTanLat = Math.Tan((Math.PI / 2 - ToRadian(prev.Latitude)) / 2); var prevLng = ToRadian(prev.Longitude); // For each edge, accumulate the signed area of the triangle formed by the North Pole // and that edge ("polar triangle"). foreach (var point in coordinates) { var tanLat = Math.Tan((Math.PI / 2 - ToRadian(point.Latitude)) / 2); var lng = ToRadian(point.Longitude); total += PolarTriangleArea(tanLat, lng, prevTanLat, prevLng); prevTanLat = tanLat; prevLng = lng; } var result = total * (radius * radius); return(Math.Abs(result)); double PolarTriangleArea(double tan1, double lng1, double tan2, double lng2) { var deltaLng = lng1 - lng2; var t = tan1 * tan2; return(2 * Math.Atan2(t * Math.Sin(deltaLng), 1 + t * Math.Cos(deltaLng))); } }
/// <summary> /// Gets the area of a <see cref="TKPolygon"/> in m^2 /// </summary> /// <param name="polygon">The polygon to calculate</param> /// <returns>returns the area of a polygon in m^2</returns> public static double GetAreaInSquareMeters(this TKPolygon polygon) => GetArea(polygon);