예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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();
        }