Ejemplo n.º 1
0
        override protected void DrawRasterParentLayer(IParentRasterLayer rLayer, ICancelTracker cancelTracker, IRasterLayer rootLayer)
        {
            if (rLayer is ILayer && ((ILayer)rLayer).Class is IRasterClass)
            {
                ((IRasterClass)((ILayer)rLayer).Class).BeginPaint(this.Display, cancelTracker);
            }
            else if (rLayer is IRasterClass)
            {
                ((IRasterClass)rLayer).BeginPaint(this.Display, cancelTracker);
            }
            string filterClause = String.Empty;

            if (rootLayer is IRasterCatalogLayer)
            {
                filterClause = ((((IRasterCatalogLayer)rootLayer).FilterQuery != null) ?
                                ((IRasterCatalogLayer)rootLayer).FilterQuery.WhereClause : String.Empty);
            }

            using (IRasterLayerCursor cursor = ((IParentRasterLayer)rLayer).ChildLayers(this, filterClause))
            {
                ILayer child;

                while ((child = cursor.NextRasterLayer) != null)
                //foreach (ILayer child in ((IParentRasterLayer)rLayer).ChildLayers(this, filterClause))
                {
                    if (!cancelTracker.Continue)
                    {
                        break;
                    }
                    if (child.Class is IParentRasterLayer)
                    {
                        DrawRasterParentLayer((IParentRasterLayer)child.Class, cancelTracker, rootLayer);
                        continue;
                    }
                    if (!(child is IRasterLayer))
                    {
                        continue;
                    }
                    IRasterLayer cLayer = (IRasterLayer)child;

                    RenderRasterLayerThread rlt = new RenderRasterLayerThread(this, cLayer, rootLayer, cancelTracker);
                    rlt.Render();

                    if (child.Class is IDisposable)
                    {
                        ((IDisposable)child.Class).Dispose();
                    }
                }
            }
            if (rLayer is ILayer && ((ILayer)rLayer).Class is IRasterClass)
            {
                ((IRasterClass)((ILayer)rLayer).Class).EndPaint(cancelTracker);
            }
            else if (rLayer is IRasterClass)
            {
                ((IRasterClass)rLayer).EndPaint(cancelTracker);
            }
        }
Ejemplo n.º 2
0
        override public bool RefreshMap(DrawPhase phase, ICancelTracker cancelTracker)
        {
            base._requestExceptions = null;

            if (_graphics != null && phase == DrawPhase.Graphics)
            {
                return(true);
            }

            this.ZoomTo(m_actMinX, m_actMinY, m_actMaxX, m_actMaxY);

            if (cancelTracker == null)
            {
                cancelTracker = new CancelTracker();
            }

            GeometricTransformer geoTransformer = new GeometricTransformer();

            //geoTransformer.ToSpatialReference = this.SpatialReference;

            if (_image == null)
            {
                _image = new System.Drawing.Bitmap(iWidth, iHeight, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            }

            _graphics = System.Drawing.Graphics.FromImage(_image);
            this.dpi  = _graphics.DpiX * this.ScaleSymbolFactor;

            if (BackgroundColor.A != 0 /* && !Display.MakeTransparent*/)
            {
                using (System.Drawing.SolidBrush brush = new System.Drawing.SolidBrush(BackgroundColor))
                {
                    _graphics.FillRectangle(brush, 0, 0, _image.Width, _image.Height);
                    brush.Dispose();
                }
            }

            if (phase == DrawPhase.All || phase == DrawPhase.Geography)
            {
                this.GeometricTransformer = geoTransformer;

                // Thread für MapServer Datasets starten...

                #region WebServiceLayer
                List <IWebServiceLayer> webServices;
                if (this.TOC != null)
                {
                    webServices = ListOperations <IWebServiceLayer> .Swap(this.TOC.VisibleWebServiceLayers);
                }
                else
                {
                    webServices = new List <IWebServiceLayer>();
                    foreach (IDatasetElement layer in this.MapElements)
                    {
                        if (!(layer is IWebServiceLayer))
                        {
                            continue;
                        }
                        if (((ILayer)layer).Visible)
                        {
                            webServices.Add((IWebServiceLayer)layer);
                        }
                    }
                }
                int webServiceOrder = 0, webServiceOrder2 = 1;
                foreach (IWebServiceLayer element in webServices)
                {
                    if (!((ILayer)element).Visible)
                    {
                        continue;
                    }
                    IWebServiceLayer wsLayer = LayerFactory.Create(((IWebServiceLayer)element).WebServiceClass.Clone() as IClass, element as ILayer) as IWebServiceLayer;

                    if (wsLayer == null || wsLayer.WebServiceClass == null)
                    {
                        continue;
                    }
                    wsLayer.WebServiceClass.SpatialReference = this.SpatialReference;

                    List <IWebServiceClass> additionalWebServices = new List <IWebServiceClass>();
                    if (BeforeRenderLayers != null)
                    {
                        List <ILayer> modLayers = new List <ILayer>();
                        foreach (IWebServiceTheme theme in wsLayer.WebServiceClass.Themes)
                        {
                            if (theme is ILayer)
                            {
                                modLayers.Add(theme as ILayer);
                            }
                        }
                        BeforeRenderLayers(this, modLayers);

                        foreach (ILayer additionalLayer in MapServerHelper.FindAdditionalWebServiceLayers(wsLayer.WebServiceClass, modLayers))
                        {
                            IWebServiceClass additionalWebService = MapServerHelper.CloneNonVisibleWebServiceClass(wsLayer.WebServiceClass);
                            MapServerHelper.CopyWebThemeProperties(additionalWebService, additionalLayer);

                            if (MapServerHelper.HasVisibleThemes(additionalWebService))
                            {
                                additionalWebServices.Add(additionalWebService);
                            }
                        }
                    }


                    ServiceRequestThread srt = new ServiceRequestThread(this, wsLayer, webServiceOrder++);
                    srt.finish += new ServiceRequestThread.RequestThreadFinished(MapRequestThread_finished);
                    Thread thread = new Thread(new ThreadStart(srt.ImageRequest));
                    m_imageMerger.max++;
                    thread.Start();


                    foreach (IWebServiceClass additionalWebService in additionalWebServices)
                    {
                        wsLayer = LayerFactory.Create(additionalWebService, element as ILayer) as IWebServiceLayer;
                        if (wsLayer == null || wsLayer.WebServiceClass == null)
                        {
                            continue;
                        }
                        wsLayer.WebServiceClass.SpatialReference = this.SpatialReference;

                        srt         = new ServiceRequestThread(this, wsLayer, (++webServiceOrder2) + webServices.Count);
                        srt.finish += new ServiceRequestThread.RequestThreadFinished(MapRequestThread_finished);
                        thread      = new Thread(new ThreadStart(srt.ImageRequest));
                        m_imageMerger.max++;
                        thread.Start();
                    }
                }
                #endregion

                List <ILayer> layers = new List <ILayer>();
                if (this.TOC != null)
                {
                    if (this.ToString() == "gView.MapServer.Instance.ServiceMap")
                    {
                        layers = ListOperations <ILayer> .Swap(this.TOC.Layers);
                    }
                    else
                    {
                        layers = ListOperations <ILayer> .Swap(this.TOC.VisibleLayers);
                    }
                }
                else
                {
                    layers = new List <ILayer>();
                    foreach (IDatasetElement layer in this.MapElements)
                    {
                        if (!(layer is ILayer))
                        {
                            continue;
                        }
                        if (((ILayer)layer).Visible)
                        {
                            layers.Add((ILayer)layer);
                        }
                    }
                }

                if (BeforeRenderLayers != null)
                {
                    //
                    // Kopie der Original Layer erstellen
                    // ACHTUNG: Renderer werden nicht kopiert!
                    // dürfen in BeforeRenderLayers nicht verändert werden...
                    // Eine zuweisung eines neuen Renderers ist jedoch legitim.
                    //
                    List <ILayer> modLayers = new List <ILayer>();
                    foreach (IDatasetElement element in layers)
                    {
                        if (!(element is ILayer) || element is IWebServiceTheme)
                        {
                            continue;
                        }
                        ILayer layer = (ILayer)element;
                        if (layer.MinimumScale > 1 && layer.MinimumScale > this.mapScale)
                        {
                            continue;
                        }
                        if (layer.MaximumScale > 1 && layer.MaximumScale < this.mapScale)
                        {
                            continue;
                        }

                        modLayers.Add(LayerFactory.Create(layer.Class, layer));
                    }
                    BeforeRenderLayers(this, modLayers);
                    layers = modLayers;
                }
                //layers = ModifyLayerList(layers);
                List <IFeatureLayer> labelLayers = this.OrderedLabelLayers(layers);

                LabelEngine.Init(this.Display, false);
                foreach (IDatasetElement element in layers)
                {
                    if (!cancelTracker.Continue)
                    {
                        break;
                    }

                    if (!(element is ILayer))
                    {
                        continue;
                    }
                    ILayer layer = (ILayer)element;

                    //if (_ceckLayerVisibilityBeforeDrawing)
                    //{
                    //    if (!LayerIsVisible(layer)) continue;
                    //}
                    if (!layer.Visible)
                    {
                        continue;
                    }
                    if (layer.MinimumScale > 1 && layer.MinimumScale > this.mapScale)
                    {
                        continue;
                    }
                    if (layer.MaximumScale > 1 && layer.MaximumScale < this.mapScale)
                    {
                        continue;
                    }
#if (DEBUG)
                    //Logger.LogDebug("Drawing Layer:" + element.Title);
#endif
                    SetGeotransformer((ILayer)element, geoTransformer);

                    if (layer is IFeatureLayer)
                    {
                        IFeatureLayer fLayer = (IFeatureLayer)layer;
                        if (fLayer.FeatureRenderer == null &&
                            (
                                fLayer.LabelRenderer == null ||
                                (fLayer.LabelRenderer != null && fLayer.LabelRenderer.RenderMode != LabelRenderMode.RenderWithFeature)
                            ))
                        {
                            //continue;
                        }
                        else
                        {
                            RenderFeatureLayerThread rlt = new RenderFeatureLayerThread(this, fLayer, cancelTracker, new FeatureCounter());
                            if (fLayer.LabelRenderer != null && fLayer.LabelRenderer.RenderMode == LabelRenderMode.RenderWithFeature)
                            {
                                rlt.UseLabelRenderer = true;
                            }
                            else
                            {
                                rlt.UseLabelRenderer = labelLayers.IndexOf(fLayer) == 0;  // letzten Layer gleich mitlabeln
                            }
                            if (rlt.UseLabelRenderer)
                            {
                                labelLayers.Remove(fLayer);
                            }

                            rlt.Render();
                        }
                        //thread = new Thread(new ThreadStart(rlt.Render));
                        //thread.Start();
                    }
                    if (layer is IRasterLayer && ((IRasterLayer)layer).RasterClass != null)
                    {
                        IRasterLayer rLayer = (IRasterLayer)layer;
                        if (rLayer.RasterClass.Polygon == null)
                        {
                            continue;
                        }

                        IEnvelope dispEnvelope = this.Envelope;
                        if (Display.GeometricTransformer != null)
                        {
                            dispEnvelope = (IEnvelope)((IGeometry)Display.GeometricTransformer.InvTransform2D(dispEnvelope)).Envelope;
                        }

                        if (gView.Framework.SpatialAlgorithms.Algorithm.IntersectBox(rLayer.RasterClass.Polygon, dispEnvelope))
                        {
                            if (rLayer.Class is IParentRasterLayer)
                            {
                                DrawRasterParentLayer((IParentRasterLayer)rLayer.Class, cancelTracker, rLayer);
                            }
                            else
                            {
                                RenderRasterLayerThread rlt = new RenderRasterLayerThread(this, rLayer, rLayer, cancelTracker);
                                rlt.Render();

                                //thread = new Thread(new ThreadStart(rlt.Render));
                                //thread.Start();
                            }
                        }
                    }
                    // Andere Layer (zB IRasterLayer)

#if (DEBUG)
                    //Logger.LogDebug("Finished drawing layer: " + element.Title);
#endif
                }

                // Label Features
                if (labelLayers.Count != 0)
                {
                    foreach (IFeatureLayer fLayer in labelLayers)
                    {
                        this.SetGeotransformer(fLayer, geoTransformer);

                        if (!fLayer.Visible)
                        {
                            continue;
                        }
                        RenderLabelThread rlt = new RenderLabelThread(this, fLayer, cancelTracker);
                        rlt.Render();
                    }
                }

                LabelEngine.Draw(this.Display, cancelTracker);
                LabelEngine.Release();

                if (cancelTracker.Continue)
                {
                    while (m_imageMerger.Count < m_imageMerger.max)
                    {
                        Thread.Sleep(10);
                    }
                }
                if (_drawScaleBar)
                {
                    m_imageMerger.mapScale = this.mapScale;
                    m_imageMerger.dpi      = this.dpi;
                }
#if (DEBUG)
                //Logger.LogDebug("Merge Images");
#endif
                m_imageMerger.Merge(_image, this.Display);
                m_imageMerger.Clear();
#if (DEBUG)
                //Logger.LogDebug("Merge Images Finished");
#endif
            }

            if (phase == DrawPhase.All || phase == DrawPhase.Graphics)
            {
                foreach (IGraphicElement grElement in Display.GraphicsContainer.Elements)
                {
                    grElement.Draw(Display);
                }
            }

            base.AppendExceptionsToImage();

            if (_graphics != null)
            {
                _graphics.Dispose();
            }
            _graphics = null;

            if (geoTransformer != null)
            {
                this.GeometricTransformer = null;
                geoTransformer.Release();
                geoTransformer = null;
            }
            return(true);
        }