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);
        }
示例#2
0
        /// <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);
        }
示例#4
0
        /// <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);
        }
示例#5
0
        /// <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);
        }
示例#6
0
        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);
        }
示例#7
0
 public virtual void SetCenter(double x, double y)
 {
     _viewport.SetCenter(x, y);
     Limiter.LimitExtent(_viewport, Map.Envelope);
 }
示例#8
0
 /// <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);
 }
示例#9
0
        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);
            }
        }