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());
        }
Exemple #4
0
        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);
            }
        }