[Route("/[controller]/SlippyPlaceData/{styleSet}/{dataKey}/{zoom}/{x}/{y}.png")] //slippy map conventions. public ActionResult DrawSlippyTileCustomElements(int x, int y, int zoom, string styleSet, string dataKey) { try { PerformanceTracker pt = new PerformanceTracker("DrawSlippyTileCustomElements"); string tileKey = x.ToString() + "|" + y.ToString() + "|" + zoom.ToString(); var info = new ImageStats(zoom, x, y, IMapTiles.SlippyTileSizeSquare); if (!DataCheck.IsInBounds(cache.Get <IPreparedGeometry>("serverBounds"), info.area)) { pt.Stop("OOB"); return(StatusCode(500)); } byte[] tileData = getExistingSlippyTile(tileKey, styleSet); if (tileData != null) { pt.Stop(tileKey + "|" + styleSet); return(File(tileData, "image/png")); } //Make tile var places = GetPlacesForTile(info, null, styleSet); var paintOps = MapTileSupport.GetPaintOpsForCustomDataElements(dataKey, styleSet, info); tileData = FinishSlippyMapTile(info, paintOps, tileKey, styleSet); pt.Stop(tileKey + "|" + styleSet + "|" + Configuration.GetValue <string>("MapTilesEngine")); return(File(tileData, "image/png")); } catch (Exception ex) { ErrorLogger.LogError(ex); return(StatusCode(500)); } }