/// <summary>
        /// Gets a tile (X/Y) for a Geo-Coordinate at a given point.
        ///
        /// See https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#X_and_Y
        /// </summary>
        /// <param name="zoom">The zoom level hat which the tile coordinates shall be calculated.</param>
        /// <param name="point">The Point in Geo-Coordinates of whcih the tile shall be calculated.</param>
        /// <returns>The X/Y coordinates of the tile containing the given geo-coordinate.</returns>
        public MapVector GetTileForPoint(int zoom, MapPointLatLon point)
        {
            if (zoom < MinZoom || zoom > MaxZoom)
            {
                throw new ArgumentException($"zoom is not within MinZoom and MaxZoom {zoom}", nameof(zoom));
            }

            var projPoint = _projection.ToProjection(point);

            double shiftedLon = (1 + (projPoint.Lon / Math.Abs(_projection.MinProjectedLon))) / 2;
            double shiftedLat = (1 - (projPoint.Lat / Math.Abs(_projection.MinProjectedLat))) / 2;

            double n = GetTileCount(zoom);

            int x = (int)Math.Floor(n * shiftedLon);
            int y = (int)Math.Floor(n * shiftedLat);

            return(new MapVector()
            {
                X = x, Y = y
            });
        }