/// <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; } }
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(); }
/// <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; }
/// <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; }
public static void ZoomMapToRegion(this XamGeographicMap geoMap, GeoRegion region) { var windowRect = geoMap.GetZoomFromGeographic(region.ToRect()); geoMap.ZoomMapToWindow(windowRect); }