Hi Esri,
I believe this may be a bug. I’m using PrintParameters from @ArcGIS/core version 4.33.14.
I can add a WMS raster layer from GeoServer, and it prints correctly if the raster contains RGB values. However, if the raster only contains a grey index with a style, the layer does not display in the printed map.
The printing function I’m using is Execute Task of ArcGIS Server.
What I found:
Direct WMS URL works:
If the WMS URL is https://xyzx:8443/geoserver/wms, it prints correctly. For example:
{
"type": "wms",
"customLayerParameters": null,
"customParameters": null,
"transparentBackground": true,
"visibleLayers": ["LayerName"],
"url": "https://xyzx:8443/geoserver/wms",
"version": "1.3.0",
"id": "19973df88a0-layer-53",
"title": "Canopy 05 metre",
"opacity": 1,
"minScale": 0,
"maxScale": 0
}Using PrintParameters automatically:
const params = new PrintParameters({
view: view.value,
template: template,
outSpatialReference: spatialReference
} as PrintParametersProperties);It automatically uses the layers on the MapView. For the WMS raster layer, the URL it passes becomes:
https://xyz:8443/geoserver/ows?version=1.3.0
This URL does not work, and the grey-index raster layer with a style is not displayed in the printed map.
Could you advise if this is expected behavior or a bug?
Thanks
Hi @mukecz1, thanks for posting your question here. It sounds like there is an issue with the URL passed to the print service. Here are the facts as I understood them:
WMS raster layer from GeoServer.
Prints correctly if the raster contains RGB values.
Does not print if the raster only contains a grey index with a style.
I have a hunch about what's going on, but it would be super helpful if you could share a test-app or test services so I could reproduce on my end and compare?
Hi @Noah-Sager ,
Unfortunately, I cannot share either the app or the service. The workaround for me is to use this code before passing it to
PrintParameters
. As you can see, I only replaced the URL endpoint from /ows?version=1.3.0 to /wms:
mapView.map.allLayers.forEach((layer: any) => {
if (layer && layer.visible && layer.type === 'wms' && layer.url && layer.url.includes('/ows?version=')) {
// Store original URL for restoration
wmsLayersToRestore.push({ layer, originalUrl: layer.url });
// Temporarily correct the URL
layer.url = layer.url.replace(/\/ows\?version=[\d.]+/g, '/wms');
}
});
And restore them after printing by using:
wmsLayersToRestore.forEach(({ layer, originalUrl }) => {
layer.url = originalUrl;
});