Example #1
0
        /// <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);
        }
Example #2
0
        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);
            }
        }
Example #3
0
        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)));
        }
Example #4
0
        //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;
        }
Example #5
0
        /// <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);
        }
Example #6
0
        /// <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));
        }
Example #7
0
        /// <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)));
            }
        }
Example #8
0
 /// <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);