private static bool FindShape(PointD pt, List <EGIS.ShapeFileLib.ShapeFile> layers, int zoomLevel, ref int layerIndex, ref int recordIndex) { double zoom = TileUtil.ZoomLevelToScale(zoomLevel); double delta = 8.0 / zoom; //PointD ptf = new PointD(pt.X, pt.Y); for (int l = layers.Count - 1; l >= 0; l--) { RectangleD extent = layers[l].Extent; extent.Inflate(delta, delta); if ((extent.Contains(pt) || layers[l].ShapeType == ShapeType.Point || layers[l].ShapeType == ShapeType.PointM || layers[l].ShapeType == ShapeType.PointZ) && layers[l].IsVisibleAtZoomLevel((float)zoom)) { int selectedIndex = layers[l].GetShapeIndexContainingPoint(pt, delta); if (selectedIndex >= 0) { layerIndex = l; recordIndex = selectedIndex; return(true); } } } return(false); }
private static string LocateShape(PointD pt, List <EGIS.ShapeFileLib.ShapeFile> layers, int zoomLevel, List <SessionCustomRenderSettingsEntry> customRenderSettingsList, ref int layerIndex, ref int recordIndex) { //changed V3.3 - coords now sent in lat/long //convert pt to lat long from merc //pt = ShapeFile.MercatorToLL(pt); //System.Diagnostics.Debug.WriteLine(pt); double zoom = TileUtil.ZoomLevelToScale(zoomLevel); double delta = 8.0 / zoom; PointD ptf = new PointD(pt.X, pt.Y); //save the existing ICustomRenderSettings and set the dynamicCustomRenderSettings List <SessionCustomRenderSettingsEntry> defaultcustomRenderSettingsList = new List <SessionCustomRenderSettingsEntry>(); if (customRenderSettingsList != null) { for (int n = 0; n < customRenderSettingsList.Count; n++) { int index = customRenderSettingsList[n].LayerIndex; if (index < layers.Count) { defaultcustomRenderSettingsList.Add(new SessionCustomRenderSettingsEntry(layerIndex, layers[layerIndex].RenderSettings.CustomRenderSettings)); layers[layerIndex].RenderSettings.CustomRenderSettings = customRenderSettingsList[n].CustomRenderSettings; } } } try { for (int l = layers.Count - 1; l >= 0; l--) { bool useToolTip = (layers[l].RenderSettings != null && layers[l].RenderSettings.UseToolTip); bool useCustomToolTip = (useToolTip && layers[l].RenderSettings.CustomRenderSettings != null && layers[l].RenderSettings.CustomRenderSettings.UseCustomTooltips); if (layers[l].Extent.Contains(ptf) && layers[l].IsVisibleAtZoomLevel((float)zoom) && useToolTip) { int selectedIndex = layers[l].GetShapeIndexContainingPoint(ptf, delta); if (selectedIndex >= 0) { layerIndex = l; recordIndex = selectedIndex; if (useCustomToolTip) { return(layers[l].RenderSettings.CustomRenderSettings.GetRecordToolTip(selectedIndex)); } else { string s = "record : " + selectedIndex.ToString(System.Globalization.CultureInfo.InvariantCulture); if (layers[l].RenderSettings.ToolTipFieldIndex >= 0) { string temp = layers[l].RenderSettings.DbfReader.GetField(selectedIndex, layers[l].RenderSettings.ToolTipFieldIndex).Trim(); if (temp.Length > 0) { s += "<br/>" + temp; } } return(s); } } } } } finally { //restore any existing ICustomRenderSettings if (customRenderSettingsList != null) { for (int n = 0; n < defaultcustomRenderSettingsList.Count; n++) { layers[defaultcustomRenderSettingsList[n].LayerIndex].RenderSettings.CustomRenderSettings = defaultcustomRenderSettingsList[n].CustomRenderSettings; } } } return(null); }
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(); }