internal Rect GetTileBounds(double tileGridScale, Point tileGridTopLeft, Size viewportSize) { var scale = tileGridScale / ViewportScale; var matrix = new Matrix(scale, 0d, 0d, scale, 0d, 0d); matrix.Rotate(-ViewportRotation); // viewport origin in map coordinates // var origin = InverseViewportTransform.Transform(new Point()); // translate origin to tile grid origin in pixels // matrix.Translate( tileGridScale * (origin.X - tileGridTopLeft.X), tileGridScale * (tileGridTopLeft.Y - origin.Y)); // transforms viewport bounds to tile pixel bounds // var transform = new MatrixTransform { Matrix = matrix }; return(transform.TransformBounds(new Rect(0d, 0d, viewportSize.Width, viewportSize.Height))); }
/// <summary> /// Transforms a Rect in viewport coordinates to a BoundingBox in geographic coordinates. /// </summary> public BoundingBox ViewportRectToBoundingBox(Rect rect) { var p1 = InverseViewportTransform.Transform(new Point(rect.X, rect.Y)); var p2 = InverseViewportTransform.Transform(new Point(rect.X, rect.Y + rect.Height)); var p3 = InverseViewportTransform.Transform(new Point(rect.X + rect.Width, rect.Y)); var p4 = InverseViewportTransform.Transform(new Point(rect.X + rect.Width, rect.Y + rect.Height)); rect.X = Math.Min(p1.X, Math.Min(p2.X, Math.Min(p3.X, p4.X))); rect.Y = Math.Min(p1.Y, Math.Min(p2.Y, Math.Min(p3.Y, p4.Y))); rect.Width = Math.Max(p1.X, Math.Max(p2.X, Math.Max(p3.X, p4.X))) - rect.X; rect.Height = Math.Max(p1.Y, Math.Max(p2.Y, Math.Max(p3.Y, p4.Y))) - rect.Y; return(RectToBoundingBox(rect)); }
/// <summary> /// Transforms a Point in viewport coordinates to a Location in geographic coordinates. /// </summary> public Location ViewportPointToLocation(Point point) { return(PointToLocation(InverseViewportTransform.Transform(point))); }