private void GenerateTile(BackgroundWorker worker, int zoomLevel, int tileX, int tileY) { string quadKey = BingMapsTileSystem.TileXYToQuadKey(tileX, tileY, zoomLevel); if (this.IsParentTileEmpty(quadKey)) { Interlocked.Increment(ref _numTilesSkipped); } else { BingTileQuery query = this.CreateQuery(quadKey, _tableName, enDiskCacheMode.ReadWrite); Bitmap bmp = _svc.GetImage(query); bool isEmpty = bmp.Tag != null; if (isEmpty) { _emptyQuadKeys.Add(quadKey); Interlocked.Increment(ref _numTilesEmpty); } else { //_rasterFS.SaveTileBitmap(bmp, ImageFormat.Png, zoomLevel, tileX, tileY); //bmp.Dispose(); Interlocked.Increment(ref _numTiles); } } }
private BingTileQuery CreateQuery(string quadKey, string tableName, enDiskCacheMode cacheMode) { BingTileQuery query = new BingTileQuery(quadKey, cacheMode, Color.OrangeRed, Color.Black, 1); query.AddTable(tableName); return(query); }
public string GetGeoJson(BingTileQuery query) { int tileX, tileY, zoom; Metrics metrics = new Metrics(this._metricsType); metrics.Start("Global"); BoundingBoxQuery bboxQuery = BoundingBoxQuery.FromBingTileQuery(query); // Get tile coordinates BingMapsTileSystem.QuadKeyToTileXY(query.quadKey, out tileX, out tileY, out zoom); Queue <string> geoJsonQueue = new Queue <string>(); foreach (string table in query.Tables()) { string geojson = null; //bool foundInCache = false; //if (query.CacheMode != enDiskCacheMode.None) //{ // // If cacheMode is Read, see if image exists on disk // bmp = this.LoadTileFromDisc(tileX, tileY, zoom, table); // foundInCache = bmp != null; //} if (geojson == null) { DateTime start = DateTime.Now; geojson = GetGeoJson_BBox(bboxQuery, metrics, table); } //// Save to disc if image not empty and cacheMode is ReadWrite //if (query.CacheMode == enDiskCacheMode.ReadWrite // && !foundInCache // && bmp != null // && bmp.Tag == null) // this.SaveTileToDisc(tileX, tileY, zoom, table, bmp); geoJsonQueue.Enqueue(geojson); } return(geoJsonQueue.Dequeue()); }
public GeoJsonResult GetGeoJsonData(BingTileQuery query) { int tileX; int tileY; int zoom; int nwX; int nwY; double nwLat; double nwLon; double seLat; double seLon; BingMapsTileSystem.QuadKeyToTileXY(query.quadKey, out tileX, out tileY, out zoom); BingMapsTileSystem.TileXYToPixelXY(tileX, tileY, out nwX, out nwY); BingMapsTileSystem.PixelXYToLatLong(nwX, nwY, zoom, out nwLat, out nwLon); BingMapsTileSystem.PixelXYToLatLong(nwX + 256, nwY + 256, zoom, out seLat, out seLon); double res = BingMapsTileSystem.GroundResolution(seLat + (nwLat - seLat) / 2d, zoom); int numDigits = BingMapsTileSystem.UsefulDigits(res); object bbox = null; if (useGeography) { bbox = SqlServerModel.GeograhyFromBoundingBoxNwSe(nwLat, nwLon, seLat, seLon, 4326); } else { bbox = SqlServerModel.GeometryFromBoundingBoxNwSe(nwLat, nwLon, seLat, seLon, 4326); } return(GetGeoJsonData( new BoundingBoxQuery() { useGeography = useGeography, Box = bbox, Resolution = res, NumDigits = numDigits, Tables = query.Tables } )); }
public Bitmap GetImage(BingTileQuery query) { int tileX, tileY, zoom; Metrics metrics = new Metrics(this._metricsType); metrics.Start("Global"); BoundingBoxQuery bboxQuery = BoundingBoxQuery.FromBingTileQuery(query); // Get tile coordinates BingMapsTileSystem.QuadKeyToTileXY(query.quadKey, out tileX, out tileY, out zoom); Queue <Bitmap> bmpQueue = new Queue <Bitmap>(); foreach (string table in query.Tables()) { Bitmap bmp = null; bool foundInCache = false; if (query.CacheMode != enDiskCacheMode.None) { // If cacheMode is Read, see if image exists on disk bmp = this.LoadTileFromDisc(tileX, tileY, zoom, table); foundInCache = bmp != null; } if (bmp == null) { DateTime start = DateTime.Now; if (bboxQuery.IsBench) { bmp = GetBenchImageGeneric(bboxQuery, metrics, table, UseInMemoryCache); } else { //string test = GetGeoJson_BBox(bboxQuery, metrics, table); bmp = GetImage_BBox(bboxQuery, metrics, table); } //else // bmp = GetImageGeneric_FromDB(bboxQuery, metrics, table, false); } // Save to disc if image not empty and cacheMode is ReadWrite if (query.CacheMode == enDiskCacheMode.ReadWrite && !foundInCache && bmp != null && bmp.Tag == null) { this.SaveTileToDisc(tileX, tileY, zoom, table, bmp); } bmpQueue.Enqueue(bmp); } metrics.Stop("Global"); if (bmpQueue.Count <= 1) { Bitmap bmpOut = bmpQueue.Dequeue(); #region Calculate metrics to return. // Calculate metrics to return. switch (_metricsType) { case enMetricsType.OnlyTime: string msg = string.Empty; foreach (var kv in metrics.GetTaskTimes()) { msg += string.Format("{0}: {1,6:###,###} ms{2}", kv.Key, kv.Value.TotalMilliseconds, Environment.NewLine); } this.DrawMsgInImage(ref bmpOut, msg); break; default: break; } #endregion return(bmpOut); } else { Bitmap outBmp = bmpQueue.Dequeue(); using (Graphics g = Graphics.FromImage(outBmp)) { do { Bitmap curBmp = bmpQueue.Dequeue(); if (curBmp.Tag != null) { outBmp.Tag = curBmp.Tag; } g.DrawImageUnscaled(curBmp, 0, 0); curBmp.Dispose(); }while (bmpQueue.Count > 0); } return(outBmp); } }