public override Bitmap GetBitmap(int x, int y, Envelope envelope, int zoom) { var ts = TileSource; if (ts == null) return null; var zoomS = zoom.ToString(CultureInfo.InvariantCulture); try { var index = new TileIndex(x, y, zoom.ToString(CultureInfo.InvariantCulture)); var tc = TileCache; var bytes = tc != null ? tc.Find(index) : null; if (bytes == null) { var mapVertices = new[] { envelope.TopLeft().X, envelope.TopLeft().Y, envelope.BottomRight().X, envelope.BottomRight().Y }; double[] viewExtentZ = { 0.0, 0.0 }; Reproject.ReprojectPoints(mapVertices, viewExtentZ, Wgs84Proj, _data.CrsProjectionInfo, 0, mapVertices.Length / 2); var geogEnv = new Envelope(mapVertices[0], mapVertices[2], mapVertices[1], mapVertices[3]); bytes = ts.Provider.GetTile(new TileInfo {Extent = ToBrutileExtent(geogEnv), Index = index}); var bm = new Bitmap(new MemoryStream(bytes)); if (tc != null) { tc.Add(index, bytes); } return bm; } return new Bitmap(new MemoryStream(bytes)); } catch (Exception ex) { if (ex is WebException || ex is TimeoutException) { return ExceptionToBitmap(ex, TileSource.Schema.GetTileWidth(zoomS), TileSource.Schema.GetTileHeight(zoomS)); } Debug.WriteLine(ex.Message); } return null; }
public Tile[,] GetTiles(Envelope envelope, Rectangle bounds) { Coordinate mapTopLeft = envelope.TopLeft(); Coordinate mapBottomRight = envelope.BottomRight(); //Clip the coordinates so they are in the range of the web mercator projection mapTopLeft.Y = TileCalculator.Clip(mapTopLeft.Y, TileCalculator.MinLatitude, TileCalculator.MaxLatitude); mapTopLeft.X = TileCalculator.Clip(mapTopLeft.X, TileCalculator.MinLongitude, TileCalculator.MaxLongitude); mapBottomRight.Y = TileCalculator.Clip(mapBottomRight.Y, TileCalculator.MinLatitude, TileCalculator.MaxLatitude); mapBottomRight.X = TileCalculator.Clip(mapBottomRight.X, TileCalculator.MinLongitude, TileCalculator.MaxLongitude); int zoom = TileCalculator.DetermineZoomLevel(envelope, bounds); Point topLeftTileXY = TileCalculator.LatLongToTileXY(mapTopLeft, zoom); Point btmRightTileXY = TileCalculator.LatLongToTileXY(mapBottomRight, zoom); var tileMatrix = new Tile[(int)(btmRightTileXY.X - topLeftTileXY.X) + 1, (int)(btmRightTileXY.Y - topLeftTileXY.Y) + 1]; Parallel.For((int) topLeftTileXY.Y, (int) btmRightTileXY.Y + 1, y => Parallel.For((int) topLeftTileXY.X, (int) btmRightTileXY.X + 1, x => { var currTopLeftPixXY = TileCalculator.TileXYToTopLeftPixelXY(x, y); var currTopLeftCoord =TileCalculator.PixelXYToLatLong((int) currTopLeftPixXY.X, (int) currTopLeftPixXY.Y, zoom); var currBtmRightPixXY = TileCalculator.TileXYToBottomRightPixelXY(x, y); var currBtmRightCoord =TileCalculator.PixelXYToLatLong((int) currBtmRightPixXY.X, (int) currBtmRightPixXY.Y, zoom); var currEnv = new Envelope(currTopLeftCoord, currBtmRightCoord); var tile = GetTile(x, y, currEnv, zoom); tileMatrix[x - (int) topLeftTileXY.X, y - (int) topLeftTileXY.Y] =tile; } )); return tileMatrix; }
public Tiles GetTiles(Envelope envelope, Rectangle bounds, BackgroundWorker bw) { var mapTopLeft = envelope.TopLeft(); var mapBottomRight = envelope.BottomRight(); //Clip the coordinates so they are in the range of the web mercator projection mapTopLeft.Y = TileCalculator.Clip(mapTopLeft.Y, TileCalculator.MinLatitude, TileCalculator.MaxLatitude); mapTopLeft.X = TileCalculator.Clip(mapTopLeft.X, TileCalculator.MinLongitude, TileCalculator.MaxLongitude); mapBottomRight.Y = TileCalculator.Clip(mapBottomRight.Y, TileCalculator.MinLatitude, TileCalculator.MaxLatitude); mapBottomRight.X = TileCalculator.Clip(mapBottomRight.X, TileCalculator.MinLongitude, TileCalculator.MaxLongitude); var zoom = TileCalculator.DetermineZoomLevel(envelope, bounds); var topLeftTileXY = TileCalculator.LatLongToTileXY(mapTopLeft, zoom); var btmRightTileXY = TileCalculator.LatLongToTileXY(mapBottomRight, zoom); var tileMatrix = new Bitmap[(int)(btmRightTileXY.X - topLeftTileXY.X) + 1, (int)(btmRightTileXY.Y - topLeftTileXY.Y) + 1]; var po = new ParallelOptions { MaxDegreeOfParallelism = -1 }; Parallel.For((int)topLeftTileXY.Y, (int)btmRightTileXY.Y + 1, po, (y, loopState) => Parallel.For((int)topLeftTileXY.X, (int)btmRightTileXY.X + 1, po, (x, loopState2) => { if (bw.CancellationPending) { loopState.Stop(); loopState2.Stop(); return; } var currEnv = GetTileEnvelope(x, y, zoom); tileMatrix[x - (int)topLeftTileXY.X, y - (int)topLeftTileXY.Y] = GetTile(x, y, currEnv, zoom); } )); return new Tiles(tileMatrix, GetTileEnvelope((int)topLeftTileXY.X, (int)topLeftTileXY.Y, zoom), // top left tile = tileMatrix[0,0] GetTileEnvelope((int)btmRightTileXY.X, (int)btmRightTileXY.Y, zoom) // bottom right tile = tileMatrix[last, last] ); }