qwc2
Version:
QGIS Web Client
727 lines (726 loc) • 35.2 kB
JavaScript
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;