@itwin/core-frontend
Version:
iTwin.js frontend components
226 lines • 9.77 kB
JavaScript
"use strict";
/*---------------------------------------------------------------------------------------------
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
/** @packageDocumentation
* @module Views
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.WmsCapabilities = exports.WmsCapability = void 0;
const wms_capabilities_1 = __importDefault(require("wms-capabilities"));
const internal_1 = require("../../../tile/internal");
function rangeFromJSONArray(json) {
return (Array.isArray(json) && json.length === 4) ? internal_1.MapCartoRectangle.fromDegrees(json[0], json[1], json[2], json[3]) : undefined;
}
function rangeFromJSON(json) {
if (undefined !== json.LatLonBoundingBox)
return rangeFromJSONArray(json.LatLonBoundingBox);
else if (Array.isArray(json.EX_GeographicBoundingBox)) {
return rangeFromJSONArray(json.EX_GeographicBoundingBox);
}
else {
if (Array.isArray(json.BoundingBox))
for (const boundingBox of json.BoundingBox) {
if (boundingBox.crs === "CRS:84" || boundingBox.crs === "EPSG:4326") {
return rangeFromJSONArray(boundingBox.extent);
}
}
return undefined;
}
}
function initArray(input) {
return Array.isArray(input) ? input.slice() : undefined;
}
/** Encapsulation of the capabilities for an WMS server
*/
var WmsCapability;
(function (WmsCapability) {
class Service {
name;
title;
abstract;
onlineResource;
contactInformation;
accessConstraints;
constructor(json) {
this.name = json.Name ? json.Name : "";
this.title = json.Title;
this.abstract = json.Abstract;
this.onlineResource = json.OnlineResource;
this.contactInformation = json.ContactInformation;
this.accessConstraints = json.AccessConstraints;
}
}
WmsCapability.Service = Service;
class Layer {
queryable;
title;
srs;
cartoRange;
subLayers = new Array();
static PREFIX_SEPARATOR = ":";
constructor(json, capabilities) {
this.queryable = json.queryable;
this.title = json.title;
this.srs = initArray(capabilities.isVersion13 ? json.CRS : json.SRS);
this.cartoRange = rangeFromJSON(json);
this.subLayers.push(new SubLayer(json, capabilities));
}
getSubLayers(visible = true) {
const subLayers = new Array();
let index = 1;
let childrenFound = false;
const pushSubLayer = ((subLayer, parent) => {
let children;
const id = index++;
if (subLayer.children) {
childrenFound = false;
children = new Array();
subLayer.children.forEach((child) => {
children.push(index);
pushSubLayer(child, id);
});
}
subLayers.push({ name: subLayer.name, title: subLayer.title, visible, parent, children, id });
});
this.subLayers.forEach((subLayer) => pushSubLayer(subLayer));
if (!childrenFound) {
const prefixed = new Map();
subLayers.forEach((subLayer) => {
if (subLayer.name && subLayer.name.indexOf(Layer.PREFIX_SEPARATOR) > 0) {
const prefix = subLayer.name.slice(0, subLayer.name.indexOf(Layer.PREFIX_SEPARATOR));
const found = prefixed.get(prefix);
if (found)
found.push(subLayer);
else
prefixed.set(prefix, [subLayer]);
}
});
if (prefixed.size > 1) {
// Preserve the root node if any.
const rootNode = (this.subLayers.length === 1 && this.subLayers[0].children && this.subLayers[0].children.length > 1) ? subLayers.find((curSubLayer) => this.subLayers[0].name === curSubLayer.name)?.id : undefined;
prefixed.forEach((children, parent) => {
children.forEach((child) => {
child.parent = index;
// Remove the prefix from the title if present.
if (child.title && child.title.indexOf(parent + Layer.PREFIX_SEPARATOR) === 0)
child.title = child.title.slice(parent.length + Layer.PREFIX_SEPARATOR.length);
});
subLayers.push({ name: "", title: parent, parent: rootNode, id: index++, children: children.map((child) => child.id), visible });
});
}
}
return subLayers;
}
getSubLayersCrs(layerNameFilter) {
const subLayerCrs = new Map();
const processSubLayer = ((subLayer) => {
if (layerNameFilter.includes(subLayer.name)) {
subLayerCrs.set(subLayer.name, subLayer.crs);
}
if (subLayer.children) {
subLayer.children.forEach((child) => {
processSubLayer(child);
});
}
});
this.subLayers.forEach((subLayer) => processSubLayer(subLayer));
return subLayerCrs;
}
}
WmsCapability.Layer = Layer;
class SubLayer {
parent;
name;
title;
crs;
ownCrs; // CRS specific to this layer (ie. not including inherited CRS)
cartoRange;
children;
queryable;
constructor(_json, capabilities, parent) {
this.parent = parent;
const getParentCrs = (parentLayer, crsSet) => {
parentLayer.crs.forEach((parentCrs) => crsSet.add(parentCrs));
if (parentLayer.parent) {
getParentCrs(parentLayer.parent, crsSet);
}
};
this.name = _json.Name ? _json.Name : "";
this.title = _json.Title;
this.queryable = _json.queryable ? true : false;
this.cartoRange = rangeFromJSON(_json);
this.ownCrs = capabilities.isVersion13 ? _json.CRS : _json.SRS;
const crs = new Set(this.ownCrs);
if (parent) {
getParentCrs(parent, crs);
}
this.crs = [...crs];
if (Array.isArray(_json.Layer)) {
this.children = new Array();
for (const childLayer of _json.Layer) {
this.children.push(new SubLayer(childLayer, capabilities, this));
}
}
}
}
WmsCapability.SubLayer = SubLayer;
})(WmsCapability || (exports.WmsCapability = WmsCapability = {}));
class WmsCapabilities {
_json;
static _capabilitiesCache = new Map();
service;
version;
isVersion13;
layer;
get json() { return this._json; }
get maxLevel() { return this.layer ? this.layer.subLayers.length : -1; }
get cartoRange() { return this.layer?.cartoRange; }
get featureInfoSupported() { return undefined !== this._json.Capability?.Request?.GetFeatureInfo; }
get featureInfoFormats() { return Array.isArray(this._json.Capability?.Request?.GetFeatureInfo?.Format) ? this._json.Capability?.Request?.GetFeatureInfo?.Format : undefined; }
constructor(_json) {
this._json = _json;
this.version = _json.version;
this.isVersion13 = _json.version !== undefined && 0 === _json.version.indexOf("1.3");
this.service = new WmsCapability.Service(_json.Service);
if (_json.Capability)
this.layer = new WmsCapability.Layer(_json.Capability.Layer, this);
}
static async create(url, credentials, ignoreCache, queryParams) {
if (!ignoreCache) {
const cached = WmsCapabilities._capabilitiesCache.get(url);
if (cached !== undefined)
return cached;
}
const tmpUrl = new URL(internal_1.WmsUtilities.getBaseUrl(url));
tmpUrl.searchParams.append("request", "GetCapabilities");
tmpUrl.searchParams.append("service", "WMS");
if (queryParams) {
Object.keys(queryParams).forEach((paramKey) => {
if (!tmpUrl.searchParams.has(paramKey))
tmpUrl.searchParams.append(paramKey, queryParams[paramKey]);
});
}
const xmlCapabilities = await internal_1.WmsUtilities.fetchXml(tmpUrl.toString(), credentials);
if (!xmlCapabilities)
return undefined;
const capabilities = new WmsCapabilities(new wms_capabilities_1.default().parse(xmlCapabilities));
if (!credentials) {
// Avoid caching protected data
WmsCapabilities._capabilitiesCache.set(url, capabilities);
}
return capabilities;
}
getSubLayers(visible = true) {
return this.layer ? this.layer.getSubLayers(visible) : undefined;
}
getSubLayersCrs(subLayerNames) {
return this.layer ? this.layer.getSubLayersCrs(subLayerNames) : undefined;
}
}
exports.WmsCapabilities = WmsCapabilities;
//# sourceMappingURL=WmsCapabilities.js.map