public static void Pan(IViewport transform, Point currentMap, Point previousMap) { var current = transform.ScreenToWorld(currentMap.X, currentMap.Y); var previous = transform.ScreenToWorld(previousMap.X, previousMap.Y); var diffX = previous.X - current.X; var diffY = previous.Y - current.Y; transform.SetCenter(transform.Center.X + diffX, transform.Center.Y + diffY); }
/// <summary> /// Navigate to center and change resolution with animation /// </summary> /// <param name="center">New center to move to</param> /// <param name="resolution">New resolution to use</param> /// <param name="duration">Duration of animation in milliseconds</param> public void NavigateTo(Point center, double resolution, long duration = 300) { // Stop any old animation if there is one if (_animation != null) { _animation.Stop(false); _animation = null; } if (duration == 0) { _viewport.SetCenter(center); _viewport.SetResolution(resolution); Navigated?.Invoke(this, EventArgs.Empty); } else { var animations = new List <AnimationEntry>(); if (!_viewport.Center.Equals(center)) { var entry = new AnimationEntry( start: _viewport.Center, end: (ReadOnlyPoint)center, animationStart: 0, animationEnd: 1, easing: Easing.Linear, tick: CenterTick, final: CenterFinal ); animations.Add(entry); } if (_viewport.Resolution != resolution) { var entry = new AnimationEntry( start: _viewport.Resolution, end: resolution, animationStart: 0, animationEnd: 1, easing: Easing.Linear, tick: ResolutionTick, final: ResolutionFinal ); animations.Add(entry); } if (animations.Count == 0) { return; } _animation = new Animation(duration); _animation.Entries.AddRange(animations); _animation.Start(); } }
public void LimitExtent(IViewport viewport, BoundingBox mapEnvelope) { var maxExtent = PanLimits ?? mapEnvelope; if (maxExtent == null) { // Can be null because both panLimits and Map.Extent can be null. // The Map.Extent can be null if the extent of all layers is null return; } var x = viewport.Center.X; // todo: Figure out if the span check is useful // It is possible to specify a combination of PanLimits and ZoomLimits that are // impossible to apply. If the lowest allowed resolution does not fill the // screen it can never be kept within extents. At some point it was useful // to add a check for this. This check is not causing problems in case of small // rounding errors. I am not sure what the original problem was without the check. // I think the map started jumping from side to side when zooming out. Perhaps // The check should be done when setting the Pan/ZoomLimits. I disabled the check // for now. //if (MapWidthSpansViewport(maxExtent.Width, viewport.Width, viewport.Resolution)) // if it doesn't fit don't restrict { if (viewport.Extent.Left < maxExtent.Left) { x += maxExtent.Left - viewport.Extent.Left; } else if (viewport.Extent.Right > maxExtent.Right) { x += maxExtent.Right - viewport.Extent.Right; } } var y = viewport.Center.Y; //if (MapHeightSpansViewport(maxExtent.Height, viewport.Height, viewport.Resolution)) // if it doesn't fit don't restrict { if (viewport.Extent.Top > maxExtent.Top) { y += maxExtent.Top - viewport.Extent.Top; } else if (viewport.Extent.Bottom < maxExtent.Bottom) { y += maxExtent.Bottom - viewport.Extent.Bottom; } } viewport.SetCenter(x, y); }
/// <summary> /// Navigate center of viewport to center of extent and change resolution /// </summary> /// <param name="extent">New extent for viewport to show</param> /// <param name="scaleMethod">Scale method to use to determine resolution</param> public void NavigateTo(BoundingBox extent, ScaleMethod scaleMethod = ScaleMethod.Fit) { if (extent == null) { return; } var resolution = ZoomHelper.DetermineResolution( extent.Width, extent.Height, _viewport.Width, _viewport.Height, scaleMethod); _viewport.SetResolution(resolution); _viewport.SetCenter(extent.Centroid); Navigated?.Invoke(this, EventArgs.Empty); }
/// <summary> /// Navigate center of viewport to center of extent and change resolution /// </summary> /// <param name="extent">New extent for viewport to show</param> /// <param name="scaleMethod">Scale method to use to determin resolution</param> public void NavigateTo(BoundingBox extent, ScaleMethod scaleMethod = ScaleMethod.Fit) { if (extent == null) { return; } var resolution = ZoomHelper.DetermineResolution( extent.Width, extent.Height, _viewport.Width, _viewport.Height, scaleMethod); _viewport.SetResolution(resolution); _viewport.SetCenter(extent.Centroid); _map.RefreshData(_viewport.Extent, _viewport.Resolution, true); }
public void LimitExtent(IViewport viewport, BoundingBox mapEnvelope) { var maxExtent = PanLimits ?? mapEnvelope; if (maxExtent == null) { // Can be null because both panLimits and Map.Extent can be null. // The Map.Extent can be null if the extent of all layers is null return; } var x = viewport.Center.X; if (MapWidthSpansViewport(maxExtent.Width, viewport.Width, viewport.Resolution)) // if it doesn't fit don't restrict { if (viewport.Extent.Left < maxExtent.Left) { x += maxExtent.Left - viewport.Extent.Left; } if (viewport.Extent.Right > maxExtent.Right) { x += maxExtent.Right - viewport.Extent.Right; } } var y = viewport.Center.Y; if (MapHeightSpansViewport(maxExtent.Height, viewport.Height, viewport.Resolution)) // if it doesn't fit don't restrict { if (viewport.Extent.Top > maxExtent.Top) { y += maxExtent.Top - viewport.Extent.Top; } if (viewport.Extent.Bottom < maxExtent.Bottom) { y += maxExtent.Bottom - viewport.Extent.Bottom; } } viewport.SetCenter(x, y); }
public virtual void SetCenter(double x, double y) { _viewport.SetCenter(x, y); Limiter.LimitExtent(_viewport, Map.Envelope); }
/// <summary> /// Change center of viewport /// </summary> /// <param name="center">New center point of viewport</param> /// <param name="duration">Duration for animation in milliseconds.</param> /// <param name="easing">Function for easing</param> public void CenterOn(MPoint center, long duration = 0, Easing?easing = default) { _viewport.SetCenter(center, duration, easing); OnNavigated(duration, ChangeType.Discrete); }
public void LimitExtent(IViewport viewport, BoundingBox mapEnvelope) { var maxExtent = PanLimits ?? mapEnvelope; if (maxExtent == null) { // Can be null because both panLimits and Map.Extent can be null. // The Map.Extent can be null if the extent of all layers is null return; } if (PanMode == PanMode.KeepCenterWithinExtents) { var x = viewport.Center.X; if (viewport.Center.X < maxExtent.Left) { x = maxExtent.Left; } if (viewport.Center.X > maxExtent.Right) { x = maxExtent.Right; } var y = viewport.Center.Y; if (viewport.Center.Y > maxExtent.Top) { y = maxExtent.Top; } if (viewport.Center.Y < maxExtent.Bottom) { y = maxExtent.Bottom; } viewport.SetCenter(x, y); } else if (PanMode == PanMode.KeepViewportWithinExtents) { var x = viewport.Center.X; if (MapWidthSpansViewport(maxExtent.Width, viewport.Width, viewport.Resolution)) // if it does't fit don't restrict { //if ((viewport.Extent.Left < maxExtent.Left) && (viewport.Extent.Right > maxExtent.Right)) // throw new Exception(); if (viewport.Extent.Left < maxExtent.Left) { x += maxExtent.Left - viewport.Extent.Left; } if (viewport.Extent.Right > maxExtent.Right) { x += maxExtent.Right - viewport.Extent.Right; } } var y = viewport.Center.Y; if (MapHeightSpansViewport(maxExtent.Height, viewport.Height, viewport.Resolution)) // if it does't fit don't restrict { //if ((viewport.Extent.Top> maxExtent.Top) && (viewport.Extent.Bottom < maxExtent.Bottom)) // throw new Exception(); if (viewport.Extent.Top > maxExtent.Top) { y += maxExtent.Top - viewport.Extent.Top; } if (viewport.Extent.Bottom < maxExtent.Bottom) { y += maxExtent.Bottom - viewport.Extent.Bottom; } } viewport.SetCenter(x, y); } }