private void ProcessRequestCore(HttpContext context) { DateTime dts = DateTime.Now; if (context.Request.Params["getshape"] != null) { ProcessGetShapeRequest(context); return; } int w = 256 * 3; int h = 256 * 3; int tileX = 0, tileY = 0, zoomLevel = 0; PointD centerPoint = PointD.Empty; double zoom = -1; int renderSettingsType = 0; int.TryParse(context.Request["rendertype"], out renderSettingsType); bool foundCompulsoryParameters = false; if (int.TryParse(context.Request["tx"], out tileX)) { if (int.TryParse(context.Request["ty"], out tileY)) { if (int.TryParse(context.Request["zoom"], out zoomLevel)) { centerPoint = TileUtil.GetMercatorCenterPointFromTile(tileX, tileY, zoomLevel); zoom = TileUtil.ZoomLevelToScale(zoomLevel); foundCompulsoryParameters = true; } } } if (!foundCompulsoryParameters) { throw new InvalidOperationException("compulsory parameters 'tx','ty' or 'zoom' missing"); } string cachePath = ""; bool useCache = CacheOnServer; if (useCache) { cachePath = CreateCachePath(context, tileX, tileY, zoomLevel); } if (string.IsNullOrEmpty(cachePath)) { useCache = false; } context.Response.ContentType = "image/x-png"; //is the image cached on the server? if (useCache && System.IO.File.Exists(cachePath)) { context.Response.Cache.SetCacheability(HttpCacheability.Public); context.Response.Cache.SetExpires(DateTime.Now.AddDays(7)); context.Response.WriteFile(cachePath); context.Response.Flush(); return; } //render the tile List <ShapeFile> mapLayers = CreateMapLayers(context); if (mapLayers == null) { throw new InvalidOperationException("No Map Layers"); } //check if any layers are Point layers bool containsPointLayer = false; for (int n = mapLayers.Count - 1; n >= 0; --n) { if (mapLayers[n].ShapeType == ShapeType.Point || mapLayers[n].ShapeType == ShapeType.PointM || mapLayers[n].ShapeType == ShapeType.PointZ) { containsPointLayer = true; } } if (containsPointLayer) { //draw to an image w x h so that labels overlapping tiles are rendered Bitmap bm = new Bitmap(256, 256, PixelFormat.Format24bppRgb); Bitmap bm2 = new Bitmap(w, h, PixelFormat.Format24bppRgb); try { Graphics g = Graphics.FromImage(bm); Graphics g2 = Graphics.FromImage(bm2); try { g2.Clear(MapBackgroundColor); RenderMap(g2, mapLayers, w, h, centerPoint, zoom); g.DrawImage(bm2, Rectangle.FromLTRB(0, 0, 256, 256), Rectangle.FromLTRB(256, 256, 512, 512), GraphicsUnit.Pixel); //perform custom painting } finally { g.Dispose(); g2.Dispose(); } using (MemoryStream ms = new MemoryStream()) { if (useCache) { try { bm.Save(cachePath, ImageFormat.Png); } catch { } } bm.Save(ms, ImageFormat.Png); context.Response.Cache.SetCacheability(HttpCacheability.Public); context.Response.Cache.SetExpires(DateTime.Now.AddDays(7)); ms.WriteTo(context.Response.OutputStream); } } finally { bm.Dispose(); bm2.Dispose(); } } else { Bitmap bm = new Bitmap(256, 256, PixelFormat.Format24bppRgb); try { Graphics g = Graphics.FromImage(bm); try { g.Clear(MapBackgroundColor); RenderMap(g, mapLayers, 256, 256, centerPoint, zoom); //perform custom painting } finally { g.Dispose(); } using (MemoryStream ms = new MemoryStream()) { if (useCache) { try { bm.Save(cachePath, ImageFormat.Png); } catch { } } bm.Save(ms, ImageFormat.Png); context.Response.Cache.SetCacheability(HttpCacheability.Public); context.Response.Cache.SetExpires(DateTime.Now.AddDays(7)); ms.WriteTo(context.Response.OutputStream); } } finally { bm.Dispose(); } } context.Response.Flush(); }