diff --git a/web/client/plugins/Print.jsx b/web/client/plugins/Print.jsx index 12d830b4af..ca08396232 100644 --- a/web/client/plugins/Print.jsx +++ b/web/client/plugins/Print.jsx @@ -246,7 +246,8 @@ export default { getDefaultPrintingService, getLayoutName, getPrintScales, - getNearestZoom + getNearestZoom, + isCompatibleWithSRS } = utilsMod; class Print extends React.Component { static propTypes = { @@ -527,19 +528,9 @@ export default { addParameter = (name, value) => { this.props.addPrintParameter("params." + name, value); }; - isCompatibleWithSRS = (projection, layer) => { - return projection === "EPSG:3857" || includes([ - "wms", - "wfs", - "vector", - "graticule", - "empty", - "arcgis" - ], layer.type) || layer.type === "wmts" && has(layer.allowedSRS, projection); - }; isAllowed = (layer, projection) => { return this.props.ignoreLayers.indexOf(layer.type) === -1 && - this.isCompatibleWithSRS(normalizeSRS(projection), layer); + isCompatibleWithSRS(normalizeSRS(projection), layer); }; isBackgroundIgnored = (layers, projection) => { diff --git a/web/client/utils/PrintUtils.js b/web/client/utils/PrintUtils.js index 4a011618a2..409b390121 100644 --- a/web/client/utils/PrintUtils.js +++ b/web/client/utils/PrintUtils.js @@ -35,6 +35,8 @@ import isNil from "lodash/isNil"; import get from "lodash/get"; import min from "lodash/min"; import trimEnd from 'lodash/trimEnd'; +import includes from 'lodash/includes'; +import has from 'lodash/has'; import { getGridGeoJson } from "./grids/MapGridsUtils"; import { isImageServerUrl } from './ArcGISUtils'; @@ -1173,6 +1175,26 @@ export const getOlDefaultStyle = (layer, styleType) => { } } }; +/** + * check compatibility between layer options and print projection + * @param {string} projection the projection code, e.g. EPSG:3857 + * @param {object} layer the layer options + * @returns {boolean} if layer is compatible with CRS selected for printing +*/ +export const isCompatibleWithSRS = (projection, layer) => { + const isProjectionCompatible = projection === "EPSG:3857"; + const isValidType = includes([ + "tms", // #10734 added tms among valid types to be printed + "wms", + "wfs", + "vector", + "graticule", + "empty", + "arcgis" + ], layer?.type); + const isValidWMTS = layer?.type === "wmts" && has(layer.allowedSRS, projection); + return isProjectionCompatible || isValidType || isValidWMTS; +}; PrintUtils = { @@ -1184,5 +1206,6 @@ PrintUtils = { toOpenLayers2Style, toOpenLayers2TextStyle, getWMTSMatrixIds, - getOlDefaultStyle + getOlDefaultStyle, + isCompatibleWithSRS }; diff --git a/web/client/utils/__tests__/PrintUtils-test.js b/web/client/utils/__tests__/PrintUtils-test.js index aa9f8a6cdf..d091e72a34 100644 --- a/web/client/utils/__tests__/PrintUtils-test.js +++ b/web/client/utils/__tests__/PrintUtils-test.js @@ -17,6 +17,7 @@ import { getNearestZoom, getMapfishPrintSpecification, rgbaTorgb, + isCompatibleWithSRS, specCreators, addTransformer, addMapTransformer, @@ -1052,5 +1053,89 @@ describe('PrintUtils', () => { expect(reqLayersCreditTxt).toEqual('OSM Simple Light Rendering GeoSolutions Data © OpenStreetMap contributors, ODbL | Attribution layer 02 | Attribution layer 03 @ polygon layer'); }); }); + it("test isCompatibleWithSRS", () => { + const prj3857 = "EPSG:3857"; + const prj4326 = "EPSG:4326"; + const tests = [{ + args: { + projection: prj3857, + layer: undefined + }, + result: true + }, + { + args: { + projection: undefined, + layer: {type: "wms"} + }, + result: true + }, + { + args: { + projection: undefined, + layer: {type: "wfs"} + }, + result: true + }, + { + args: { + projection: undefined, + layer: {type: "vector"} + }, + result: true + }, + { + args: { + projection: undefined, + layer: {type: "graticule"} + }, + result: true + }, + { + args: { + projection: undefined, + layer: {type: "empty"} + }, + result: true + }, + { + args: { + projection: undefined, + layer: {type: "arcgis"} + }, + result: true + }, + { + args: { + projection: prj4326, + layer: {type: "tms"} + }, + result: true + }, + { + args: { + projection: prj4326, + layer: {type: "incompatible"} + }, + result: false + }, + { + args: { + projection: prj4326, + layer: {type: "wmts"} + }, + result: false + }, { + args: { + projection: prj4326, + layer: {type: "wmts", allowedSRS: {"EPSG:4326": {}}} + }, + result: true + }]; + tests.forEach(({args, result}) => { + let res = isCompatibleWithSRS(args.projection, args.layer); + expect(res).toBe(result); + }); + }); }); });