Ejemplo n.º 1
0
        /// <summary>
        /// Navigates the <see cref="XamGeographicMap"/> to specified geographic region of the world
        /// </summary>
        /// <param name="geoMap">an instance of XamGeographicMap</param>
        /// <param name="geoRegion">a geographic region of the world</param>
        public static void NavigateTo(this XamGeographicMap geoMap, GeoRegion geoRegion)
        {
            var windowRect = geoMap.GetZoomFromGeographic(geoRegion.NorthWest.ToPoint(), geoRegion.SouthEast.ToPoint());

            // conversion of geographic region to window rect works when XamGeographicMap view was initialized
            if (windowRect == new Rect(0, 0, 1, 1))
            {
                geoMap.GridAreaRectChanged += (o, e) =>
                {
                    windowRect        = geoMap.GetZoomFromGeographic(geoRegion.NorthWest.ToPoint(), geoRegion.SouthEast.ToPoint());
                    geoMap.WindowRect = windowRect;
                };
            }
            else
            {
                geoMap.WindowRect = windowRect;
            }
        }
Ejemplo n.º 2
0
        public static void ZoomMapToRegion(this XamGeographicMap geoMap, GeoRect region, TimeSpan zoomDuration)
        {
            Rect currentWindowRect = geoMap.WindowRect;
            //GeoRegion geodeticGeoRegion = region;
            var winRect = geoMap.GetZoomFromGeographic(region.ToRect());

            //GeoRegion cartesianGeoRegion = ProjectMapRegion(geodeticGeoRegion, map);
            //MapWindowRect = cartesianGeoRegion.ToRect();
            var dTL = geoMap.WindowRect.TopLeft().DistanceVector(winRect.TopLeft());
            var dTR = geoMap.WindowRect.TopRight().DistanceVector(winRect.TopRight());
            var dBR = geoMap.WindowRect.BottomRight().DistanceVector(winRect.BottomRight());
            var dBL = geoMap.WindowRect.BottomLeft().DistanceVector(winRect.BottomLeft());


            var StartTime = DateTime.MinValue;

            //var zoomInterval = zoomDuration.TotalMilliseconds / 2000.0;
            var zoomInterval = zoomDuration.TotalMilliseconds / 2000.0;

            var counter = 0;
            var timer   = new DispatcherTimer {
                Interval = TimeSpan.FromMilliseconds(10)
            };

            timer.Tick += (o, e) =>
            {
                if (StartTime == DateTime.MinValue)
                {
                    StartTime = DateTime.Now;
                }
                double tick     = (DateTime.Now - StartTime).Ticks / TimeSpan.TicksPerMillisecond;
                double duration = zoomDuration.TotalMilliseconds;
                var    factor   = 50.0;
                //TODO add logic for smooth transition between map's window Rect
                //double lin = duration > 1.0 ? MathUtil.Clamp(tick / duration, 0.0, 1.0) : 1.0;
                //var tLog = Math.Log(1.0 + factor * Math.E / (Math.E - 1.0));
                //var trig = 0.5 - 0.5 * Math.Cos(Math.PI * factor);


                //System.Diagnostics.Debug.WriteLine("  log " + tLog + "  tri " + trig);

                var top    = geoMap.WindowRect.Top + (dTL.Y / factor);
                var left   = geoMap.WindowRect.Left + (dTL.X / factor);
                var bottom = geoMap.WindowRect.Bottom + (dBR.Y / factor);
                var right  = geoMap.WindowRect.Right + (dBR.X / factor);

                counter++;
                var rect = new Rect(new Point(left, top), new Point(right, bottom));
                if (counter > factor || winRect.Contains(rect))
                {
                    ((DispatcherTimer)o).Stop();
                }

                geoMap.WindowRect = rect;
            };
            timer.Start();
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Zooms XamGeographicMap to a given geographic location
        /// </summary>
        /// <param name="geoMap"></param>
        /// <param name="geoLocation"></param>
        /// <param name="mapZoomScale"></param>
        public static void ZoomMapToLocation(this XamGeographicMap geoMap, GeoLocation geoLocation, double mapZoomScale = 0.1)
        {
            //validate geoMargin
            if (double.IsInfinity(mapZoomScale) || double.IsNaN(mapZoomScale))
            {
                mapZoomScale = 0.1;
            }

            mapZoomScale = System.Math.Abs(mapZoomScale);
            //// navigate to a geographic location
            //var geoRect = new Rect(geoLocation.Longitude - geoMargin, geoLocation.Latitude - geoMargin, 2 * geoMargin, 2 * geoMargin);
            ////Rect windowRect = geoMap.GetZoomFromGeographic(geoRect);
            //var geoRegion = new GeoRegion(geoLocation, geoMargin);
            //var southEast = new Point(geoLocation.Longitude - geoMargin, geoLocation.Latitude + geoMargin);
            //var northWest = new Point(geoLocation.Longitude + geoMargin, geoLocation.Latitude - geoMargin);

            //var windowRect2 = geoMap.GetZoomFromGeographic(geoRegion.NorthWest.ToPoint(), geoRegion.SouthEast.ToPoint());
            //var windowRect = geoMap.GetZoomFromGeographic(northWest, southEast);



            var longitudeOffset = (180 * 2 * mapZoomScale) / 2;
            var latitudeOffset  = (85 * 2 * mapZoomScale) / 2;


            var cartLocation  = geoMap.GetWindowPoint(geoLocation.ToPoint());
            var cartNorthWest = new Point(cartLocation.X - 50, cartLocation.Y - 50);
            var cartSouthEast = new Point(cartLocation.X + 50, cartLocation.Y + 50);

            var w = cartSouthEast.X - cartNorthWest.X;
            var h = cartSouthEast.Y - cartNorthWest.Y;

            var cartRect = new Rect(cartNorthWest.X, cartNorthWest.Y, w, h);

            DebugManager.Log("cartRect " + cartRect);
            var geoRect = geoMap.GetGeographicFromZoom(cartRect);

            DebugManager.Log("geoRect  " + geoRect);



            var northWest = new Point(geoLocation.Longitude - longitudeOffset, geoLocation.Latitude + latitudeOffset);
            var southEast = new Point(geoLocation.Longitude + longitudeOffset, geoLocation.Latitude - latitudeOffset);



            var geoRegion44 = new GeoRegion(northWest, southEast);

            northWest = geoMap.GetGeographicPoint(cartNorthWest);
            southEast = geoMap.GetGeographicPoint(cartSouthEast);
            DebugManager.Log("cartNorthWest " + cartNorthWest + " cartSouthEast " + cartSouthEast);
            DebugManager.Log("geoNorthWest  " + northWest + " geoSouthEast  " + southEast);


            var windowRect44 = geoMap.GetZoomFromGeographic(northWest, southEast);

            windowRect44 = geoMap.GetZoomFromGeographic(geoRect);


            DebugManager.Log("geoLocation " + geoLocation.ToPoint());
            DebugManager.Log("geoRegion44 " + geoRegion44.ToRect());
            //DebugManager.Log("geoRect4    " + geoRect4);
            //DebugManager.Log("windowRect4 " + windowRect4);
            DebugManager.Log("windowRect4 " + windowRect44);

            geoMap.WindowRect = windowRect44;
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Zooms XamGeographicMap to a given geographic location based on source map
        /// </summary>
        /// <param name="geoMap"></param>
        /// <param name="sourceMap"></param>
        /// <param name="mouseLocation">in Cartesian coordinates</param>
        /// <param name="mapZoomMagnification">magnification of source map</param>
        public static void ZoomMapToLocation(this XamGeographicMap geoMap, XamGeographicMap sourceMap, Point mouseLocation, double mapZoomMagnification = 4.0)
        {
            if (mapZoomMagnification < 0.001)
            {
                mapZoomMagnification = 0.001;
            }
            //if (mapZoomMagnification < 1) mapZoomMagnification = 1;
            //var offset = (sourceMap.GetMapZoomScale() * (geoMap.GetMapViewportScale() / 2)) / mapZoomMagnification;
            //var pixcelNorthWest = new Point(mouseLocation.X - offset, mouseLocation.Y - offset);
            //var pixcelSouthEast = new Point(mouseLocation.X + offset, mouseLocation.Y + offset);

            var offsetX = (sourceMap.ActualWindowScale * (geoMap.ViewportRect.Width / 2)) / mapZoomMagnification;
            var offsetY = (sourceMap.ActualWindowScale * (geoMap.ViewportRect.Height / 2)) / mapZoomMagnification;

            var pixcelNorthWest = new Point(mouseLocation.X - offsetX, mouseLocation.Y - offsetY);
            var pixcelSouthEast = new Point(mouseLocation.X + offsetX, mouseLocation.Y + offsetY);

            var w = pixcelSouthEast.X - pixcelNorthWest.X;
            var h = pixcelSouthEast.Y - pixcelNorthWest.Y;

            var pixRect = new Rect(pixcelNorthWest.X, pixcelNorthWest.Y, w, h);

            // init appropriate axis scaler parameters
            var xaxis   = sourceMap.XAxis;
            var yaxis   = sourceMap.YAxis;
            var xParams = new ScalerParams(sourceMap.ActualWindowRect, sourceMap.ViewportRect, xaxis.IsInverted);

            xParams.EffectiveViewportRect = sourceMap.EffectiveViewport;
            var yParams = new ScalerParams(sourceMap.ActualWindowRect, sourceMap.ViewportRect, yaxis.IsInverted);

            yParams.EffectiveViewportRect = sourceMap.EffectiveViewport;

            var gL = xaxis.GetUnscaledValue(pixRect.Left, xParams);
            var gT = yaxis.GetUnscaledValue(pixRect.Bottom, yParams);
            var gR = xaxis.GetUnscaledValue(pixRect.Right, xParams);
            var gB = yaxis.GetUnscaledValue(pixRect.Top, yParams);

            var gH = gB - gT;
            var gW = gR - gL;

            //DebugManager.LogWarning("gT " + gT + " gB " + gB + " gL " + gL + " gR " + gR + " | gH " + gH + " gW " + gW);


            //if (gT <= GeoGlobal.MapSphericalMercator.LatitudeMin) return;
            //if (gB >= GeoGlobal.MapSphericalMercator.LatitudeMax) return;

            //if (gR >= GeoGlobal.MapSphericalMercator.LongitudeMax) return;
            //if (gL <= GeoGlobal.MapSphericalMercator.LongitudeMin) return;



            if (gT <= GeoGlobal.WorldsMercator.LatitudeMin && gR >= GeoGlobal.WorldsMercator.LongitudeMax)
            {
                return;
            }
            if (gT <= GeoGlobal.WorldsMercator.LatitudeMin && gL <= GeoGlobal.WorldsMercator.LongitudeMin)
            {
                return;
            }

            if (gB >= GeoGlobal.WorldsMercator.LatitudeMax && gR >= GeoGlobal.WorldsMercator.LongitudeMax)
            {
                return;
            }
            if (gB >= GeoGlobal.WorldsMercator.LatitudeMax && gL <= GeoGlobal.WorldsMercator.LongitudeMin)
            {
                return;
            }

            if (gT < GeoGlobal.WorldsMercator.LatitudeMin)
            {
                gT = GeoGlobal.WorldsMercator.LatitudeMin;
            }
            if (gB > GeoGlobal.WorldsMercator.LatitudeMax)
            {
                gB = GeoGlobal.WorldsMercator.LatitudeMax;
            }

            if (gR > GeoGlobal.WorldsMercator.LongitudeMax)
            {
                gR = GeoGlobal.WorldsMercator.LongitudeMax;
            }
            if (gL < GeoGlobal.WorldsMercator.LongitudeMin)
            {
                gL = GeoGlobal.WorldsMercator.LongitudeMin;
            }

            gH = System.Math.Abs(gB - gT);
            gW = System.Math.Abs(gR - gL);

            //if (gT + gH > GeoGlobal.MapSphericalMercator.LatitudeMax)
            //{
            //    gB = GeoGlobal.MapSphericalMercator.LatitudeMax;
            //    gT = gB - gH;
            //    //gT = gT - (gH);

            //}
            //if (gT < GeoGlobal.MapSphericalMercator.LatitudeMin)
            //{
            //    gT = GeoGlobal.MapSphericalMercator.LatitudeMin; // +(gH);
            //    gB = gT + gH; // +(gH);
            //    //return;
            //}


            var geoRect = new Rect(gL, gT, gW, gH);
            var winRect = geoMap.GetZoomFromGeographic(geoRect);

            //DebugManager.LogWarning("geoRect    " + geoRect.ToString());
            //DebugManager.LogWarning("winRect    " + winRect.ToString());
            //DebugManager.LogWarning("     "  );

            geoMap.WindowRect = winRect;
        }
Ejemplo n.º 5
0
        public static void ZoomMapToRegion(this XamGeographicMap geoMap, GeoRegion region)
        {
            var windowRect = geoMap.GetZoomFromGeographic(region.ToRect());

            geoMap.ZoomMapToWindow(windowRect);
        }