コード例 #1
0
ファイル: WMSController.cs プロジェクト: nemesv/ASTRA.EMSG
        public ActionResult Export(string f,
                                   string layers,
                                   string transparent,
                                   string format,
                                   string bbox,
                                   string size,
                                   string bboxsr,
                                   string imagesr,
                                   string layerdefs)
        {
            WMSRestParameter wmsParameter = new WMSRestParameter(layers, bbox, size, transparent, format, bboxsr, GisConstants.SRS, layerdefs, f);

            return(RequestHandler(createWMSRequest.WMSRequest(WMSRequestType.OverlayEMSGLayer, wmsParameter)));
        }
コード例 #2
0
        public string CreateMapRequestString(WMSRestParameter parameter, Guid mandandID)
        {
            if (string.IsNullOrEmpty(parameter.FORMAT))
            {
                parameter.FORMAT = "image/jpeg";
            }

            string[] allLayers = (parameter.LAYERS.Replace("show:", "")).Split(',');

            string layerIdsFromConfig = "";

            //iteration für wms request mit mehreren layern
            foreach (string singleLayer in allLayers)
            {
                if (!string.IsNullOrEmpty(singleLayer))
                {
                    string id = new ServerConfigurationProvider().GetWMSLayerId(singleLayer);
                    if (parameter.LAYERDEFS != null && parameter.LAYERDEFS.Contains(singleLayer))
                    {
                        string[] layerIDsWithNearlySameContent = id.Split(','); //zb. Zustandsabschnitt u. zustandsabschnitt_indexIsNull
                        string   tempLayerDefs = parameter.LAYERDEFS;           //zwischenspeichern
                        parameter.LAYERDEFS = "";                               //zurücksetzen d. layerdefs
                        //ACHTUNG funktioniert NICHT bei einer Abfrage mit mehreren ReportLayern wenn gleichzeitig mehrere andere RestLayer abgefragt werden!!!
                        foreach (string tempL in layerIDsWithNearlySameContent)
                        {
                            parameter.LAYERDEFS += tempLayerDefs.Replace(singleLayer, tempL) + ";";
                        }
                    }
                    //zusammenfassen aller layer die angezeigt werden sollen
                    layerIdsFromConfig += (layerIdsFromConfig != "" ? "," : "") + id;
                }
            }
            //mandantfilter for every layer
            Dictionary <string, string> cqlFilterDict = new Dictionary <string, string>();

            string[] layerIDs = layerIdsFromConfig.Split(',');//list with ids from this layer from config file

            foreach (string singleLayerId in layerIDs)
            {
                cqlFilterDict.Add(singleLayerId, "MANDANT_ID%3D'" + mandandID.ToString() + "'");
            }

            if (parameter.LAYERDEFS != null)
            {
                string[] defintions = parameter.LAYERDEFS.Split(';');
                foreach (string def in defintions)
                {
                    if (String.IsNullOrEmpty(def))
                    {
                        continue;
                    }
                    string layerId = def.Split(':')[0];
                    string filter  = def.Substring(layerId.Length + 1);
                    cqlFilterDict[layerId] += " and " + filter;
                }
            }

            string[] size      = parameter.SIZE.Split(',');
            string   width     = size[0];
            string   height    = size[1];
            string   cqlFilter = "";

            foreach (string layerId in layerIDs)
            {
                if (!String.IsNullOrEmpty(cqlFilter))
                {
                    cqlFilter += ";";
                }
                cqlFilter += cqlFilterDict[layerId];
            }

            return(String.Format(
                       "?service=wms&version=1.3&request=GetMap&layers={1}&transparent={2}&format={0}%2F{3}&bbox={4}&width={5}&height={6}&crs={7}&format_options=dpi:{8}&CQL_FILTER={9}",
                       parameter.F,
                       layerIdsFromConfig,
                       parameter.TRANSPARENT,
                       parameter.FORMAT,
                       parameter.BBOX,
                       width,
                       height,
                       parameter.IMAGESR,
                       parameter.DPI,
                       cqlFilter));
        }
コード例 #3
0
ファイル: GISReportService.cs プロジェクト: nemesv/ASTRA.EMSG
        public List <Stream> PrepareAndSendWMSRequests(EmsgGisReportParameter emsgGisReportParameter, TileDefinition tile, int dpi, bool isPreview)
        {
            List <Stream>        responseStreamList = new List <Stream>();
            List <Thread>        threads            = new List <Thread>();
            List <RequestWorker> workers            = new List <RequestWorker>();

            #region request background tile
            if (!string.IsNullOrEmpty(emsgGisReportParameter.BackgroundLayers))
            {
                WMSParameter wmsBackrParameter = new WMSParameter(LAYERS: emsgGisReportParameter.BackgroundLayers,
                                                                  BBOX: tile.ExtentToString(),
                                                                  HEIGHT: tile.TileHeight.ToString(),
                                                                  WIDTH: tile.TileWidth.ToString(),
                                                                  FORMAT: isPreview ? "jpeg" : "png24");
                //HttpResponseObject tileResponseBackground = createWMSRequest.WMSRequest(WMSRequestType.BackgroundLayer, wmsBackrParameter);
                RequestWorker worker = new RequestWorker(0, wmsBackrParameter, this.createWMSRequest, HttpContext.Current, WMSRequestType.BackgroundLayer);
                Thread        thread = new Thread(new ThreadStart(worker.Run));
                thread.Start();
                threads.Add(thread);
                workers.Add(worker);
                //if (ValidateResponse(tileResponseBackground))
                //    responseStreamList.Add(tileResponseBackground.responseStream);
            }
            else
            {
                WMSParameter wmsAVBackgroundParameter = new WMSParameter(LAYERS: emsgGisReportParameter.LayersAVBackground,
                                                                         BBOX: tile.ExtentToString(),
                                                                         HEIGHT: tile.TileHeight.ToString(),
                                                                         WIDTH: tile.TileWidth.ToString(),
                                                                         FORMAT: "image/png");

                //HttpResponseObject tileResponseAVBackground = createWMSRequest.WMSRequest(WMSRequestType.AVCLayer, wmsAVBackgroundParameter);
                RequestWorker worker = new RequestWorker(0, wmsAVBackgroundParameter, this.createWMSRequest, HttpContext.Current, WMSRequestType.AVCLayer);
                Thread        thread = new Thread(new ThreadStart(worker.Run));
                thread.Start();
                threads.Add(thread);
                workers.Add(worker);
                //if(ValidateResponse(tileResponseAVBackground))
                //    responseStreamList.Add(tileResponseAVBackground.responseStream);
            }
            #endregion



            #region request AV tile
            if (emsgGisReportParameter.LayersAV != null)
            {
                var reportDefinition = new ReportDefintion(dpi);

                bool containsHausnummernLayer = false;

                var avLayer = emsgGisReportParameter.LayersAV.Split(',').ToList();

                containsHausnummernLayer = avLayer.Remove(new ServerConfigurationProvider().AvUeberlagerndLayers);

                //the Layer "Hausnummer" aka "ch.bfs.gebaeude_wohnungs_register-label" this layer only contains labels Because we request high resolution images this labels become unreadable small so this layer is requested with "low dpi" and then resized
                #region request Hausnummer tile
                if (containsHausnummernLayer)
                {
                    int reducedTileHeight = (int)Math.Ceiling((tile.TileHeight / reportDefinition.dpi * 120d));
                    int reducedTileWidth  = (int)Math.Ceiling((tile.TileWidth / reportDefinition.dpi * 120d));

                    WMSParameter wmsAVHNParameter = new WMSParameter(LAYERS: new ServerConfigurationProvider().AvUeberlagerndLayers,
                                                                     BBOX: tile.ExtentToString(),
                                                                     HEIGHT: reducedTileHeight.ToString(),
                                                                     WIDTH: reducedTileWidth.ToString());

                    //HttpResponseObject tileResponseAVHN = createWMSRequest.WMSRequest(WMSRequestType.AVLayer, wmsAVHNParameter);
                    RequestWorker worker = new RequestWorker(1, wmsAVHNParameter, this.createWMSRequest, HttpContext.Current, WMSRequestType.AVLayer);
                    Thread        thread = new Thread(new ThreadStart(worker.Run));
                    thread.Start();
                    threads.Add(thread);
                    workers.Add(worker);
                    //if (ValidateResponse(tileResponseAVHN))
                    //    responseStreamList.Add(resizeBitmap(tileResponseAVHN.responseStream, tile.TileHeight, tile.TileWidth));
                }


                string avLayerToDownload = string.Join(",", avLayer);

                WMSParameter wmsAVParameter = new WMSParameter(LAYERS: avLayerToDownload,
                                                               BBOX: tile.ExtentToString(),
                                                               HEIGHT: tile.TileHeight.ToString(),
                                                               WIDTH: tile.TileWidth.ToString());

                //HttpResponseObject tileResponseAV = createWMSRequest.WMSRequest(WMSRequestType.AVLayer, wmsAVParameter);
                RequestWorker avworker = new RequestWorker(2, wmsAVParameter, this.createWMSRequest, HttpContext.Current, WMSRequestType.AVLayer);
                Thread        avthread = new Thread(new ThreadStart(avworker.Run));
                avthread.Start();
                threads.Add(avthread);
                workers.Add(avworker);
                //if (ValidateResponse(tileResponseAV))
                //    responseStreamList.Add(resizeBitmap(tileResponseAV.responseStream, tile.TileHeight, tile.TileWidth));



                #endregion request Hausnummer tile
            }
            #endregion

            #region request EMSG feature tile
            if (emsgGisReportParameter.Layers != null)
            {
                var emsgLayers = emsgGisReportParameter.Layers.Split(',').ToList();
                emsgLayers.Reverse();
                string emsgLayersToDownload = string.Join(",", emsgLayers);

                WMSRestParameter wmsParameter = new WMSRestParameter(emsgLayersToDownload,
                                                                     tile.ExtentToString(),
                                                                     tile.TileSizeToString(),
                                                                     layerdefs: emsgGisReportParameter.LayerDefs,
                                                                     dpi: dpi.ToString());

                //HttpResponseObject tileResponseEMSGFeatures = createWMSRequest.WMSRequest(WMSRequestType.OverlayEMSGLayer, wmsParameter);
                RequestWorker worker = new RequestWorker(3, wmsParameter, this.createWMSRequest, HttpContext.Current, WMSRequestType.OverlayEMSGLayer);
                Thread        thread = new Thread(new ThreadStart(worker.Run));
                thread.Start();
                threads.Add(thread);
                workers.Add(worker);

                //if (ValidateResponse(tileResponseEMSGFeatures))
                //    responseStreamList.Add(tileResponseEMSGFeatures.responseStream);
            }
            #endregion


            foreach (Thread thread in threads)
            {
                thread.Join();
            }
            workers = workers.OrderBy(w => w.order).ToList();
            foreach (RequestWorker worker in workers)
            {
                if (worker.exception != null)
                {
                    throw worker.exception;
                }
                if (ValidateResponse(worker.response))
                {
                    responseStreamList.Add(worker.response.responseStream);
                }
            }


            return(responseStreamList);
        }