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))); }
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)); }
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); }