UNPKG

qwc2

Version:
727 lines (726 loc) 35.2 kB
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; } function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } /** * Copyright 2017-2024 Sourcepole AG * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. */ import axios from 'axios'; import deepmerge from 'deepmerge'; import { XMLParser } from 'fast-xml-parser'; import isEmpty from 'lodash.isempty'; import ol from 'openlayers'; import randomColor from 'randomcolor'; import url from 'url'; import { LayerRole } from '../actions/layers'; import StandardApp from '../components/StandardApp'; import ConfigUtils from './ConfigUtils'; import CoordinatesUtils from './CoordinatesUtils'; import LayerUtils from './LayerUtils'; import LocaleUtils from './LocaleUtils'; import MiscUtils from './MiscUtils'; function strcmp(a, b) { var al = a.toLowerCase(); var bl = b.toLowerCase(); if (al < bl) { return -1; } else if (al > bl) { return 1; } return 0; } var ServiceLayerUtils = { getWMTSLayers: function getWMTSLayers(capabilities, capabilitiesUrl, mapCrs) { var _this = this; if (!(capabilities !== null && capabilities !== void 0 && capabilities.Contents)) { return []; } var tileMatrices = capabilities.Contents.TileMatrixSet.reduce(function (res, entry) { var crsMatch = entry.SupportedCRS.match(/(EPSG).*:(\d+)/i); res[entry.Identifier] = { crs: crsMatch ? "EPSG:" + crsMatch[2] : entry.SupportedCRS, matrix: entry.TileMatrix }; return res; }, {}); var layers = capabilities.Contents.Layer.map(function (layer) { var _capabilities$Service, _capabilities$Service2, _capabilities$Service3; var styles = _this.getWMTSLayerStyles(capabilities, capabilitiesUrl, layer, tileMatrices); return { capabilitiesUrl: capabilitiesUrl, title: layer.Title, name: layer.Identifier, bbox: { crs: "EPSG:4326", bounds: layer.WGS84BoundingBox }, sublayers: styles, "abstract": layer.Abstract, attribution: { Title: ((_capabilities$Service = capabilities.ServiceProvider) === null || _capabilities$Service === void 0 ? void 0 : _capabilities$Service.ProviderName) || ((_capabilities$Service2 = capabilities.ServiceIdentification) === null || _capabilities$Service2 === void 0 ? void 0 : _capabilities$Service2.Title) || "", OnlineResource: ((_capabilities$Service3 = capabilities.ServiceProvider) === null || _capabilities$Service3 === void 0 ? void 0 : _capabilities$Service3.ProviderSite) || "" } }; }); layers.sort(function (a, b) { return a.title.localeCompare(b.title); }); return layers; }, getWMTSLayerStyles: function getWMTSLayerStyles(capabilities, capabilitiesUrl, layer, tileMatrices) { var _this2 = this; if (layer.Style.length === 1) { return this.getWMTSLayerTileMatrixSetLinks(capabilities, capabilitiesUrl, layer, tileMatrices, layer.Style[0].Identifier); } else { return layer.Style.map(function (style) { return { title: style.Identifier, sublayers: _this2.getWMTSLayerTileMatrixSetLinks(capabilities, capabilitiesUrl, layer, tileMatrices, style.Identifier) }; }); } }, getWMTSLayerTileMatrixSetLinks: function getWMTSLayerTileMatrixSetLinks(capabilities, capabilitiesUrl, layer, tileMatrices, style) { var tileMatrixSetLinks = layer.TileMatrixSetLink; var layerLinks = tileMatrixSetLinks.map(function (link) { var _MiscUtils$ensureArra, _capabilities$Operati, _capabilities$Service4, _capabilities$Service5, _capabilities$Service6; var tileMatrixSet = link.TileMatrixSet; var topMatrix = tileMatrices[tileMatrixSet].matrix[0]; var tileMatrixPrefix = topMatrix.Identifier.includes(":") ? topMatrix.Identifier.replace(/:[0-9]+$/, "") : ""; var origin = [topMatrix.TopLeftCorner[0], topMatrix.TopLeftCorner[1]]; try { var axisOrder = CoordinatesUtils.getAxisOrder(tileMatrices[tileMatrixSet].crs).substr(0, 2); if (axisOrder === 'ne') { origin = [topMatrix.TopLeftCorner[1], topMatrix.TopLeftCorner[0]]; } } catch (e) { // eslint-disable-next-line console.warn("Could not determine axis order for projection " + tileMatrices[tileMatrixSet].crs); return null; } var matrixIds = []; var resolutions = tileMatrices[tileMatrixSet].matrix.map(function (entry, index) { // 0.00028: assumed pixel width in meters, as per WMTS standard matrixIds.push(entry.Identifier); return entry.ScaleDenominator * 0.00028; }); var format = (_MiscUtils$ensureArra = MiscUtils.ensureArray(layer.Format).find(function (fmt) { return fmt === "image/png"; })) !== null && _MiscUtils$ensureArra !== void 0 ? _MiscUtils$ensureArra : MiscUtils.ensureArray(layer.Format)[0]; var getTile = MiscUtils.ensureArray((_capabilities$Operati = capabilities.OperationsMetadata) === null || _capabilities$Operati === void 0 || (_capabilities$Operati = _capabilities$Operati.GetTile) === null || _capabilities$Operati === void 0 || (_capabilities$Operati = _capabilities$Operati.DCP) === null || _capabilities$Operati === void 0 || (_capabilities$Operati = _capabilities$Operati.HTTP) === null || _capabilities$Operati === void 0 ? void 0 : _capabilities$Operati.Get)[0]; var getEncoding = MiscUtils.ensureArray(getTile === null || getTile === void 0 ? void 0 : getTile.Constraint).find(function (c) { return c.name === "GetEncoding"; }); var requestEncoding = MiscUtils.ensureArray(getEncoding === null || getEncoding === void 0 ? void 0 : getEncoding.AllowedValues.Value)[0]; var serviceUrl = null; if (requestEncoding === 'KVP') { serviceUrl = getTile.href; } else { serviceUrl = layer.ResourceURL.find(function (u) { return u.resourceType === "tile"; }).template; (layer.Dimension || []).forEach(function (dim) { serviceUrl = serviceUrl.replace("{" + dim.Identifier + "}", dim.Default); }); } return { type: "wmts", url: serviceUrl, capabilitiesUrl: capabilitiesUrl, title: layer.Title + " - " + tileMatrixSet, name: layer.Identifier, tileMatrixPrefix: tileMatrixPrefix, tileMatrixSet: tileMatrixSet, originX: origin[0], originY: origin[1], projection: tileMatrices[tileMatrixSet].crs, tileSize: [topMatrix.TileWidth, topMatrix.TileHeight], style: style, bbox: { crs: "EPSG:4326", bounds: layer.WGS84BoundingBox }, format: format, requestEncoding: requestEncoding, resolutions: resolutions, matrixIds: matrixIds, "abstract": layer.Abstract, attribution: { Title: ((_capabilities$Service4 = capabilities.ServiceProvider) === null || _capabilities$Service4 === void 0 ? void 0 : _capabilities$Service4.ProviderName) || ((_capabilities$Service5 = capabilities.ServiceIdentification) === null || _capabilities$Service5 === void 0 ? void 0 : _capabilities$Service5.Title) || "", OnlineResource: ((_capabilities$Service6 = capabilities.ServiceProvider) === null || _capabilities$Service6 === void 0 ? void 0 : _capabilities$Service6.ProviderSite) || "" } }; }).filter(Boolean); return layerLinks; }, getWMSLayers: function getWMSLayers(capabilities, calledServiceUrl) { var _capabilities, _capabilities2, _capabilities$WMS_Cap, _this3 = this; var asGroup = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; if (!((_capabilities = capabilities) !== null && _capabilities !== void 0 && _capabilities.WMS_Capabilities) && !((_capabilities2 = capabilities) !== null && _capabilities2 !== void 0 && _capabilities2.WMT_MS_Capabilities)) { return []; } capabilities = (_capabilities$WMS_Cap = capabilities.WMS_Capabilities) !== null && _capabilities$WMS_Cap !== void 0 ? _capabilities$WMS_Cap : capabilities.WMT_MS_Capabilities; var calledUrlParts = url.parse(calledServiceUrl, true); var extwmsparams = {}; calledUrlParts.query = Object.keys(calledUrlParts.query).filter(function (key) { // Extract extwms params if (key.toUpperCase().startsWith("EXTWMS.")) { extwmsparams[key.substring(7)] = calledUrlParts.query[key]; return false; } // Filter service and request from calledServiceUrl, but keep other parameters (i.e. MAP) return !["service", "request"].includes(key.toLowerCase()); }).reduce(function (res, key) { return _objectSpread(_objectSpread({}, res), {}, _defineProperty({}, key, calledUrlParts.query[key])); }, {}); delete calledUrlParts.search; var topLayer = capabilities.Capability.Layer; var getMapUrl = this.mergeCalledServiceUrlQuery(ServiceLayerUtils.getDCPTypes(capabilities.Capability.Request.GetMap.DCPType).HTTP.Get.OnlineResource.href, calledUrlParts); var featureInfoUrl = getMapUrl; try { featureInfoUrl = this.mergeCalledServiceUrlQuery(ServiceLayerUtils.getDCPTypes(capabilities.Capability.Request.GetFeatureInfo.DCPType).HTTP.Get.OnlineResource.href, calledUrlParts); } catch (e) { // pass } var mapFormats = null; try { mapFormats = MiscUtils.ensureArray(capabilities.Capability.Request.GetMap.Format); } catch (e) { mapFormats = ['image/png']; } var infoFormats = null; try { infoFormats = MiscUtils.ensureArray(capabilities.Capability.Request.GetFeatureInfo.Format); } catch (e) { infoFormats = ['text/plain']; } var externalLayerFeatureInfoFormats = ConfigUtils.getConfigProp("externalLayerFeatureInfoFormats") || {}; for (var _i = 0, _Object$keys = Object.keys(externalLayerFeatureInfoFormats); _i < _Object$keys.length; _i++) { var entry = _Object$keys[_i]; if (featureInfoUrl.toLowerCase().includes(entry.toLowerCase())) { infoFormats = [externalLayerFeatureInfoFormats[entry]]; break; } } var version = capabilities.version; var supportedCrs = MiscUtils.ensureArray(topLayer.crs); var topLayerExtent = null; if (topLayer.EX_GeographicBoundingBox) { topLayerExtent = { crs: "EPSG:4326", bounds: [parseFloat(topLayer.EX_GeographicBoundingBox.westBoundLongitude), parseFloat(topLayer.EX_GeographicBoundingBox.southBoundLatitude), parseFloat(topLayer.EX_GeographicBoundingBox.eastBoundLongitude), parseFloat(topLayer.EX_GeographicBoundingBox.northBoundLatitude)] }; } if (!topLayer.Layer || asGroup) { return [this.getWMSLayerParams(topLayer, supportedCrs, calledUrlParts, version, getMapUrl, featureInfoUrl, mapFormats, infoFormats, extwmsparams, topLayerExtent)].filter(function (entry) { return entry; }); } else { var entries = MiscUtils.ensureArray(topLayer.Layer).map(function (layer) { return _this3.getWMSLayerParams(layer, supportedCrs, calledUrlParts, version, getMapUrl, featureInfoUrl, mapFormats, infoFormats, extwmsparams, topLayerExtent); }).filter(function (entry) { return entry; }); return entries.sort(function (a, b) { return strcmp(a.title, b.title); }); } }, getWMSLayerParams: function getWMSLayerParams(layer, parentCrs, calledUrlParts, version, getMapUrl, featureInfoUrl, mapFormats, infoFormats, extwmsparams, topLayerExtent) { var _this4 = this, _Object$keys$, _layer$Attribution, _layer$Attribution2, _layer$opacity; var groupbbox = arguments.length > 10 && arguments[10] !== undefined ? arguments[10] : null; var supportedCrs = MiscUtils.ensureArray(layer.CRS); if (isEmpty(supportedCrs)) { supportedCrs = _toConsumableArray(parentCrs || []); } else { supportedCrs = [].concat(_toConsumableArray(parentCrs || []), _toConsumableArray(supportedCrs)); } var sublayers = []; var sublayerbounds = {}; if (!isEmpty(layer.Layer)) { sublayers = MiscUtils.ensureArray(layer.Layer).map(function (sublayer) { return _this4.getWMSLayerParams(sublayer, supportedCrs, calledUrlParts, version, getMapUrl, featureInfoUrl, mapFormats, infoFormats, extwmsparams, topLayerExtent, sublayerbounds); }).filter(function (entry) { return entry; }); } var bbox = null; if (isEmpty(layer.BoundingBox)) { if (!isEmpty(sublayerbounds)) { bbox = sublayerbounds; } else if (topLayerExtent) { bbox = topLayerExtent; } } else { var _boundingBox$CRS; var boundingBox = MiscUtils.ensureArray(layer.BoundingBox)[0]; bbox = { crs: (_boundingBox$CRS = boundingBox.CRS) !== null && _boundingBox$CRS !== void 0 ? _boundingBox$CRS : boundingBox.SRS, bounds: [boundingBox.minx, boundingBox.miny, boundingBox.maxx, boundingBox.maxy].map(Number) }; } if (groupbbox !== null) { if (isEmpty(groupbbox)) { Object.assign(groupbbox, bbox); } else if (bbox && bbox.crs === groupbbox.crs) { groupbbox.bounds[0] = Math.min(bbox.bounds[0], groupbbox.bounds[0]); groupbbox.bounds[1] = Math.min(bbox.bounds[1], groupbbox.bounds[1]); groupbbox.bounds[2] = Math.max(bbox.bounds[2], groupbbox.bounds[2]); groupbbox.bounds[3] = Math.max(bbox.bounds[3], groupbbox.bounds[3]); } } var legendUrl = getMapUrl; try { legendUrl = this.mergeCalledServiceUrlQuery(MiscUtils.ensureArray(MiscUtils.ensureArray(layer.Style)[0].LegendURL)[0].OnlineResource.href, calledUrlParts); } catch (e) { /* pass */ } var editConfigUrl = null; var wmsName = null; try { editConfigUrl = layer.EditConfig.OnlineResource.href; wmsName = layer.EditConfig.wms_name; } catch (e) { /* pass */ } var translationsUrl = null; try { translationsUrl = layer.Traslations.OnlineResource.href; } catch (e) { /* pass */ } var dimensions = []; MiscUtils.ensureArray(layer.Dimension).forEach(function (dim) { var _dim$fieldName, _dim$endFieldName; dimensions.push({ units: dim.units, name: dim.name, multiple: dim.multiple === '1', value: dim["#text"], fieldName: (_dim$fieldName = dim.fieldName) !== null && _dim$fieldName !== void 0 ? _dim$fieldName : null, endFieldName: (_dim$endFieldName = dim.endFieldName) !== null && _dim$endFieldName !== void 0 ? _dim$endFieldName : null }); }); var styles = MiscUtils.ensureArray(layer.Style).reduce(function (res, entry) { return _objectSpread(_objectSpread({}, res), {}, _defineProperty({}, String(entry.Name), entry.Title)); }, {}); var style = styles["default"] ? 'default' : (_Object$keys$ = Object.keys(styles)[0]) !== null && _Object$keys$ !== void 0 ? _Object$keys$ : ''; var attribution = { Title: (_layer$Attribution = layer.Attribution) === null || _layer$Attribution === void 0 ? void 0 : _layer$Attribution.Title, OnlineResource: (_layer$Attribution2 = layer.Attribution) === null || _layer$Attribution2 === void 0 || (_layer$Attribution2 = _layer$Attribution2.OnlineResource) === null || _layer$Attribution2 === void 0 ? void 0 : _layer$Attribution2.href }; return { type: "wms", name: String(layer.Name), title: layer.Title, "abstract": layer.Abstract, attribution: attribution, url: getMapUrl, featureInfoUrl: featureInfoUrl, legendUrl: legendUrl, editConfigUrl: editConfigUrl, translationsUrl: translationsUrl, wms_name: wmsName, version: version, infoFormats: infoFormats, mapFormats: mapFormats, queryable: layer.queryable === 1, sublayers: isEmpty(sublayers) ? null : sublayers, expanded: false, bbox: bbox, visibility: layer.visibilityChecked !== 0, opacity: ((_layer$opacity = layer.opacity) !== null && _layer$opacity !== void 0 ? _layer$opacity : 1) * 255, extwmsparams: extwmsparams, minScale: layer.MinScaleDenominator !== undefined ? Number(layer.MinScaleDenominator) : undefined, maxScale: layer.MinScaleDenominator !== undefined ? Number(layer.MaxScaleDenominator) : undefined, dimensions: dimensions, styles: styles, style: style, serverType: translationsUrl ? 'qgis' : null // If there is a translationsUrl, assume it is the qwc-ogc-service }; }, getWFSLayers: function getWFSLayers(capabilities, calledServiceUrl, mapCrs) { var _capabilities$WFS_Cap; var calledUrlParts = url.parse(calledServiceUrl, true); // Filter service and request from calledServiceUrl, but keep other parameters (i.e. MAP) calledUrlParts.query = Object.keys(calledUrlParts.query).filter(function (key) { return !["service", "request"].includes(key.toLowerCase()); }).reduce(function (res, key) { return _objectSpread(_objectSpread({}, res), {}, _defineProperty({}, key, calledUrlParts.query[key])); }, {}); delete calledUrlParts.search; if (!(capabilities !== null && capabilities !== void 0 && (_capabilities$WFS_Cap = capabilities.WFS_Capabilities) !== null && _capabilities$WFS_Cap !== void 0 && _capabilities$WFS_Cap.version)) { return []; } else if (capabilities.WFS_Capabilities.version < "1.1.0") { return ServiceLayerUtils.getWFS10Layers(capabilities.WFS_Capabilities, calledUrlParts); } else { return ServiceLayerUtils.getWFS11_20Layers(capabilities.WFS_Capabilities, calledUrlParts, mapCrs); } }, getWFS10Layers: function getWFS10Layers(capabilities, calledUrlParts) { var serviceUrl = null; var version = capabilities.version; var formats = null; try { serviceUrl = ServiceLayerUtils.getDCPTypes(MiscUtils.ensureArray(capabilities.Capability.Request.GetFeature.DCPType)).HTTP.Get.onlineResource; serviceUrl = this.mergeCalledServiceUrlQuery(serviceUrl, calledUrlParts); formats = Object.keys(capabilities.Capability.Request.GetFeature.ResultFormat); if (typeof formats === 'string') { // convert to list if single entry formats = [formats]; } } catch (e) { return []; } var layers = []; var _iterator = _createForOfIteratorHelper(MiscUtils.ensureArray(capabilities.FeatureTypeList.FeatureType)), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var featureType = _step.value; var name = void 0; var bbox = void 0; try { name = featureType.Name; var llbbox = featureType.LatLongBoundingBox; bbox = { crs: featureType.SRS, bounds: [llbbox.minx, llbbox.miny, llbbox.maxx, llbbox.maxy] }; } catch (e) { continue; // Name and bbox are required } var title = featureType.Title || name; var _abstract = featureType.Abstract || ""; layers.push({ type: "wfs", name: name, title: title, "abstract": _abstract, bbox: bbox, projection: featureType.SRS, url: serviceUrl, version: version, formats: formats, color: randomColor(), visibility: true }); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return layers; }, getWFS11_20Layers: function getWFS11_20Layers(capabilities, calledUrlParts, mapCrs) { var serviceUrl = null; var version = capabilities.version; var formats = null; try { var getFeatureOp = MiscUtils.ensureArray(capabilities.OperationsMetadata.Operation).find(function (el) { return el.name === "GetFeature"; }); serviceUrl = ServiceLayerUtils.getDCPTypes(MiscUtils.ensureArray(getFeatureOp.DCP)).HTTP.Get.href; serviceUrl = this.mergeCalledServiceUrlQuery(serviceUrl, calledUrlParts); var outputFormat = MiscUtils.ensureArray(getFeatureOp.Parameter).find(function (el) { return el.name === "outputFormat"; }); formats = MiscUtils.ensureArray(outputFormat.AllowedValues ? outputFormat.AllowedValues.Value : outputFormat.Value); } catch (e) { return []; } var layers = []; var _iterator2 = _createForOfIteratorHelper(MiscUtils.ensureArray(capabilities.FeatureTypeList.FeatureType)), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var featureType = _step2.value; var name = void 0; var bbox = void 0; try { name = featureType.Name; var lc = featureType.WGS84BoundingBox.LowerCorner.split(/\s+/); var uc = featureType.WGS84BoundingBox.UpperCorner.split(/\s+/); bbox = { crs: "EPSG:4326", bounds: [lc[0], lc[1], uc[0], uc[1]] }; } catch (e) { continue; // Name and bbox are required } var title = featureType.Title || name; var _abstract2 = featureType.Abstract || ""; var projections = [CoordinatesUtils.fromOgcUrnCrs(featureType.DefaultCRS || featureType.DefaultSRS)].concat(_toConsumableArray(MiscUtils.ensureArray(featureType.OtherCRS || featureType.OtherSRS || []).map(function (crs) { return CoordinatesUtils.fromOgcUrnCrs(crs); }))); var projection = projections.includes(mapCrs) ? mapCrs : projections[0]; layers.push({ type: "wfs", name: name, title: title, "abstract": _abstract2, bbox: bbox, projection: projection, url: serviceUrl, version: version, formats: formats, color: randomColor(), visibility: true }); } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } return layers; }, getCapabilities: function getCapabilities(baseUrl, params) { var urlParts = url.parse(baseUrl, true); if (params) { urlParts.query = _objectSpread(_objectSpread({}, Object.entries(urlParts.query).reduce(function (res, _ref) { var _ref2 = _slicedToArray(_ref, 2), key = _ref2[0], val = _ref2[1]; return _objectSpread(_objectSpread({}, res), {}, _defineProperty({}, key.toUpperCase(), val)); }, {})), params); delete urlParts.search; } if (urlParts.protocol === "http" && location.protocol === "https") { urlParts.protocol = "https"; } var requestUrl = url.format(urlParts); return new Promise(function (resolve, reject) { axios.get(requestUrl).then(function (response) { var options = { attributeNamePrefix: "", ignoreAttributes: false, parseTagValue: true, parseAttributeValue: true, removeNSPrefix: true }; resolve({ capabilities: new XMLParser(options).parse(response.data), requestUrl: requestUrl }); })["catch"](function (e) { reject(e); }); }); }, getWMTSCapabilities: function getWMTSCapabilities(serviceUrl) { return new Promise(function (resolve, reject) { var requestUrl = MiscUtils.adjustProtocol(serviceUrl); axios.get(requestUrl).then(function (response) { var wmtsFormat = new ol.format.WMTSCapabilities(); resolve({ capabilities: wmtsFormat.read(response.data), requestUrl: requestUrl }); })["catch"](reject); }); }, getWMSCapabilities: function getWMSCapabilities(serviceUrl) { return new Promise(function (resolve, reject) { ServiceLayerUtils.getCapabilities(serviceUrl, { SERVICE: 'WMS', REQUEST: 'GetProjectSettings' }).then(function (result) { var _result$capabilities; if ((_result$capabilities = result.capabilities) !== null && _result$capabilities !== void 0 && _result$capabilities.WMS_Capabilities) { resolve(result); } else { ServiceLayerUtils.getCapabilities(serviceUrl, { SERVICE: 'WMS', REQUEST: 'GetCapabilities' }).then(resolve); } })["catch"](function () { ServiceLayerUtils.getCapabilities(serviceUrl, { SERVICE: 'WMS', REQUEST: 'GetCapabilities' }).then(resolve)["catch"](reject); }); }); }, getWFSCapabilities: function getWFSCapabilities(serviceUrl) { return new Promise(function (resolve, reject) { ServiceLayerUtils.getCapabilities(serviceUrl, { SERVICE: 'WFS', REQUEST: 'GetCapabilities' }).then(resolve)["catch"](reject); }); }, findLayers: function findLayers(type, serviceUrl, layerConfigs, mapCrs, callback) { var getCapabilities = null; var getLayers = null; if (type === "wmts") { getCapabilities = ServiceLayerUtils.getWMTSCapabilities; getLayers = function getLayers(capabilites, requestUrl) { return ServiceLayerUtils.getWMTSLayers(capabilites, requestUrl, mapCrs); }; } else if (type === "wms") { getCapabilities = ServiceLayerUtils.getWMSCapabilities; getLayers = function getLayers(capabilites, requestUrl) { return ServiceLayerUtils.getWMSLayers(capabilites, requestUrl, true); }; } else if (type === "wfs") { getCapabilities = ServiceLayerUtils.getWFSCapabilities; getLayers = function getLayers(capabilites, requestUrl) { return ServiceLayerUtils.getWFSLayers(capabilites, requestUrl, mapCrs); }; } getCapabilities(serviceUrl).then(function (_ref3) { var capabilities = _ref3.capabilities, requestUrl = _ref3.requestUrl; var layers = getLayers(capabilities, requestUrl); var _iterator3 = _createForOfIteratorHelper(layerConfigs), _step3; try { var _loop = function _loop() { var _LayerUtils$searchSub; var layerConfig = _step3.value; var layer = LayerUtils.matchSubLayer({ sublayers: layers }, function (l) { return l.name === layerConfig.name && (!layerConfig.style || l.style === layerConfig.style); }); // Some services (i.e. wms.geo.admin.ch) have same-named sublayers layer = (_LayerUtils$searchSub = LayerUtils.searchSubLayer(layer, "name", layerConfig.name)) !== null && _LayerUtils$searchSub !== void 0 ? _LayerUtils$searchSub : layer; if (layer) { layer = _objectSpread(_objectSpread({}, layer), {}, { id: layerConfig.id, opacity: layerConfig.opacity, visibility: layerConfig.visibility, style: layerConfig.style || layer.style, role: LayerRole.USERLAYER }); if (layer.type === "wms") { layer.params = { LAYERS: layerConfig.name }; } var metadataRequests = [new Promise(function (resolve, reject) { if (layer.editConfigUrl) { axios.get(layer.editConfigUrl).then(function (response) { layer.editConfig = response.data; delete layer.editConfigUrl; resolve(); })["catch"](function (e) { delete layer.editConfigUrl; resolve(); }); } else { resolve(); } }), new Promise(function (resolve, reject) { if (layer.translationsUrl) { axios.get(layer.translationsUrl.replace('{lang}', LocaleUtils.lang())).then(function (response) { layer.translations = response.data; delete layer.translationsUrl; resolve(); })["catch"](function (e) { delete layer.translationsUrl; resolve(); }); } else { resolve(); } })]; Promise.all(metadataRequests).then(function () { if (layer.translations) { var commonTranslations = StandardApp.store.getState().locale.messagesTree.maptranslations || {}; layer = LayerUtils.applyTranslations(layer, deepmerge(commonTranslations, layer.translations)); } callback(layerConfig.id, layer); }); } else { // eslint-disable-next-line console.warn("Could not find layer " + layerConfig.name); callback(layerConfig.id, null); } }; for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { _loop(); } } catch (err) { _iterator3.e(err); } finally { _iterator3.f(); } })["catch"](function () { // eslint-disable-next-line console.warn("Failed to read " + serviceUrl); var _iterator4 = _createForOfIteratorHelper(layerConfigs), _step4; try { for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) { var layerConfig = _step4.value; callback(layerConfig.id, null); } } catch (err) { _iterator4.e(err); } finally { _iterator4.f(); } }); }, getDCPTypes: function getDCPTypes(dcpTypes) { var result = {}; var _iterator5 = _createForOfIteratorHelper(MiscUtils.ensureArray(dcpTypes)), _step5; try { for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) { var dcpType = _step5.value; result = deepmerge(result, dcpType); } } catch (err) { _iterator5.e(err); } finally { _iterator5.f(); } return result; }, mergeCalledServiceUrlQuery: function mergeCalledServiceUrlQuery(capabilityUrl, calledServiceUrlParts) { if (ConfigUtils.getConfigProp("trustWmsCapabilityURLs")) { return url.format(capabilityUrl); } try { var _calledServiceUrlPart; var urlParts = url.parse(capabilityUrl, true); urlParts.host = calledServiceUrlParts.host; urlParts.protocol = (_calledServiceUrlPart = calledServiceUrlParts.protocol) !== null && _calledServiceUrlPart !== void 0 ? _calledServiceUrlPart : location.protocol; urlParts.query = _objectSpread(_objectSpread({}, calledServiceUrlParts.query), urlParts.query); delete urlParts.search; return url.format(urlParts); } catch (e) { return url.format(capabilityUrl); } } }; export default ServiceLayerUtils;