@loaders.gl/wms 4.2.0-alpha.4 → 4.2.0-alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/csw-capabilities-loader.d.ts +1 -1
- package/dist/csw-capabilities-loader.d.ts.map +1 -1
- package/dist/csw-capabilities-loader.js +24 -16
- package/dist/csw-domain-loader.d.ts +1 -1
- package/dist/csw-domain-loader.d.ts.map +1 -1
- package/dist/csw-domain-loader.js +24 -16
- package/dist/csw-records-loader.d.ts +1 -1
- package/dist/csw-records-loader.d.ts.map +1 -1
- package/dist/csw-records-loader.js +24 -16
- package/dist/gml-loader.d.ts +1 -1
- package/dist/gml-loader.d.ts.map +1 -1
- package/dist/gml-loader.js +24 -16
- package/dist/index.cjs +76 -65
- package/dist/index.cjs.map +7 -0
- package/dist/index.d.ts +30 -30
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -1
- package/dist/lib/parsers/csw/parse-csw-capabilities.js +18 -13
- package/dist/lib/parsers/csw/parse-csw-domain.js +26 -18
- package/dist/lib/parsers/csw/parse-csw-records.js +47 -36
- package/dist/lib/parsers/csw/parse-exception-report.js +26 -8
- package/dist/lib/parsers/gml/deep-strict-equal.js +107 -39
- package/dist/lib/parsers/gml/parse-gml.js +299 -280
- package/dist/lib/parsers/wms/parse-wms-capabilities.js +207 -187
- package/dist/lib/parsers/wms/parse-wms-error.js +17 -6
- package/dist/lib/parsers/wms/parse-wms-features.js +20 -19
- package/dist/lib/parsers/wms/parse-wms-layer-description.js +10 -4
- package/dist/lib/parsers/xml/parse-xml-helpers.js +54 -45
- package/dist/lib/services/create-image-service.d.ts +1 -1
- package/dist/lib/services/create-image-service.d.ts.map +1 -1
- package/dist/lib/services/create-image-service.js +31 -19
- package/dist/lib/services/image-service.js +40 -33
- package/dist/services/arcgis/arcgis-image-service.d.ts +2 -2
- package/dist/services/arcgis/arcgis-image-service.d.ts.map +1 -1
- package/dist/services/arcgis/arcgis-image-service.js +92 -55
- package/dist/services/arcgis/arcgis-server.js +35 -28
- package/dist/services/create-image-source.d.ts +3 -3
- package/dist/services/create-image-source.d.ts.map +1 -1
- package/dist/services/create-image-source.js +11 -2
- package/dist/services/ogc/csw-service.d.ts +3 -3
- package/dist/services/ogc/csw-service.d.ts.map +1 -1
- package/dist/services/ogc/csw-service.js +159 -143
- package/dist/services/ogc/wms-service.d.ts +4 -4
- package/dist/services/ogc/wms-service.d.ts.map +1 -1
- package/dist/services/ogc/wms-service.js +306 -242
- package/dist/wip/data-source.js +58 -1
- package/dist/wip/lib/wcs/parse-wcs-capabilities.js +8 -11
- package/dist/wip/lib/wfs/parse-wfs-capabilities.js +12 -12
- package/dist/wip/lib/wfs/parse-wfs.js +20 -20
- package/dist/wip/lib/wmts/parse-wmts-capabilities.js +70 -12
- package/dist/wip/lib/wmts/parse-wmts.js +23 -20
- package/dist/wip/services/arcgis-feature-service.js +25 -22
- package/dist/wip/wcs-capabilities-loader.d.ts +1 -1
- package/dist/wip/wcs-capabilities-loader.d.ts.map +1 -1
- package/dist/wip/wcs-capabilities-loader.js +22 -16
- package/dist/wip/wfs-capabilities-loader.d.ts +1 -1
- package/dist/wip/wfs-capabilities-loader.d.ts.map +1 -1
- package/dist/wip/wfs-capabilities-loader.js +22 -16
- package/dist/wip/wms-feature-info-loader.d.ts +1 -1
- package/dist/wip/wms-feature-info-loader.d.ts.map +1 -1
- package/dist/wip/wms-feature-info-loader.js +10 -6
- package/dist/wip/wms-layer-description-loader.d.ts +1 -1
- package/dist/wip/wms-layer-description-loader.d.ts.map +1 -1
- package/dist/wip/wms-layer-description-loader.js +9 -6
- package/dist/wip/wmts-capabilities-loader.js +23 -16
- package/dist/wms-capabilities-loader.d.ts +2 -2
- package/dist/wms-capabilities-loader.d.ts.map +1 -1
- package/dist/wms-capabilities-loader.js +28 -16
- package/dist/wms-error-loader.js +34 -29
- package/package.json +10 -8
- package/dist/csw-capabilities-loader.js.map +0 -1
- package/dist/csw-domain-loader.js.map +0 -1
- package/dist/csw-records-loader.js.map +0 -1
- package/dist/gml-loader.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/parsers/csw/parse-csw-capabilities.js.map +0 -1
- package/dist/lib/parsers/csw/parse-csw-domain.js.map +0 -1
- package/dist/lib/parsers/csw/parse-csw-records.js.map +0 -1
- package/dist/lib/parsers/csw/parse-exception-report.js.map +0 -1
- package/dist/lib/parsers/gml/deep-strict-equal.js.map +0 -1
- package/dist/lib/parsers/gml/parse-gml.js.map +0 -1
- package/dist/lib/parsers/wms/parse-wms-capabilities.js.map +0 -1
- package/dist/lib/parsers/wms/parse-wms-error.js.map +0 -1
- package/dist/lib/parsers/wms/parse-wms-features.js.map +0 -1
- package/dist/lib/parsers/wms/parse-wms-layer-description.js.map +0 -1
- package/dist/lib/parsers/xml/parse-xml-helpers.js.map +0 -1
- package/dist/lib/services/create-image-service.js.map +0 -1
- package/dist/lib/services/image-service.js.map +0 -1
- package/dist/services/arcgis/arcgis-image-service.js.map +0 -1
- package/dist/services/arcgis/arcgis-server.js.map +0 -1
- package/dist/services/create-image-source.js.map +0 -1
- package/dist/services/ogc/csw-service.js.map +0 -1
- package/dist/services/ogc/wms-service.js.map +0 -1
- package/dist/wip/data-source.js.map +0 -1
- package/dist/wip/lib/wcs/parse-wcs-capabilities.js.map +0 -1
- package/dist/wip/lib/wfs/parse-wfs-capabilities.js.map +0 -1
- package/dist/wip/lib/wfs/parse-wfs.js.map +0 -1
- package/dist/wip/lib/wmts/parse-wmts-capabilities.js.map +0 -1
- package/dist/wip/lib/wmts/parse-wmts.js.map +0 -1
- package/dist/wip/services/arcgis-feature-service.js.map +0 -1
- package/dist/wip/services/wmts-service.ts.disabled +0 -348
- package/dist/wip/wcs-capabilities-loader.js.map +0 -1
- package/dist/wip/wfs-capabilities-loader.js.map +0 -1
- package/dist/wip/wms-feature-info-loader.js.map +0 -1
- package/dist/wip/wms-layer-description-loader.js.map +0 -1
- package/dist/wip/wms-layer-description-loader.md.disabled.md +0 -47
- package/dist/wip/wmts-capabilities-loader.js.map +0 -1
- package/dist/wms-capabilities-loader.js.map +0 -1
- package/dist/wms-error-loader.js.map +0 -1
|
@@ -1,211 +1,231 @@
|
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
1
4
|
import { XMLLoader } from '@loaders.gl/xml';
|
|
2
5
|
import { getXMLArray, getXMLStringArray, getXMLInteger, getXMLFloat, getXMLBoolean } from "../xml/parse-xml-helpers.js";
|
|
6
|
+
/**
|
|
7
|
+
* Parses a typed data structure from raw XML for `GetCapabilities` response
|
|
8
|
+
* @note Error handlings is fairly weak
|
|
9
|
+
*/
|
|
3
10
|
export function parseWMSCapabilities(xmlText, options) {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
11
|
+
const parsedXML = XMLLoader.parseTextSync?.(xmlText, options);
|
|
12
|
+
const xmlCapabilities = parsedXML.WMT_MS_Capabilities || parsedXML.WMS_Capabilities || parsedXML;
|
|
13
|
+
const capabilities = extractCapabilities(xmlCapabilities);
|
|
14
|
+
// In case the processed, normalized capabilities do not contain everything,
|
|
15
|
+
// the user can get the parsed XML structure.
|
|
16
|
+
if (options?.inheritedLayerProps) {
|
|
17
|
+
// Traverse layers and inject missing props from parents
|
|
18
|
+
for (const layer of capabilities.layers) {
|
|
19
|
+
addInheritedLayerProps(layer, null);
|
|
20
|
+
}
|
|
21
|
+
// Not yet implemented
|
|
22
|
+
}
|
|
23
|
+
if (options?.includeRawJSON) {
|
|
24
|
+
capabilities.json = xmlCapabilities;
|
|
25
|
+
}
|
|
26
|
+
if (options?.includeXMLText) {
|
|
27
|
+
capabilities.xml = xmlText;
|
|
28
|
+
}
|
|
29
|
+
return capabilities;
|
|
20
30
|
}
|
|
31
|
+
/** Extract typed capability data from XML */
|
|
21
32
|
function extractCapabilities(xml) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
|
|
33
|
+
const capabilities = {
|
|
34
|
+
version: String(xml.version || ''),
|
|
35
|
+
name: String(xml.Service?.Name || 'unnamed'),
|
|
36
|
+
title: xml.Service?.Title ? String(xml.Service?.Title) : undefined,
|
|
37
|
+
abstract: xml.Service?.Abstract ? String(xml.Service?.Abstract) : undefined,
|
|
38
|
+
keywords: getXMLStringArray(xml.Service?.KeywordList?.Keyword),
|
|
39
|
+
fees: xml.Service?.Fees ? JSON.stringify(xml.Service?.Fees) : undefined,
|
|
40
|
+
accessConstraints: xml.Service?.AccessConstraints
|
|
41
|
+
? JSON.stringify(xml.Service?.AccessConstraints)
|
|
42
|
+
: undefined,
|
|
43
|
+
layerLimit: getXMLInteger(xml.Service?.LayerLimit),
|
|
44
|
+
maxWidth: getXMLInteger(xml.Service?.maxWidth),
|
|
45
|
+
maxHeight: getXMLInteger(xml.Service?.maxHeight),
|
|
46
|
+
layers: [],
|
|
47
|
+
requests: extractRequests(xml.Capability?.Request),
|
|
48
|
+
exceptions: extractExceptions(xml.Exception)
|
|
49
|
+
// contact field is a mess of largely irrelevant information, put it last
|
|
50
|
+
// contact: xml.Service?.Contact ? JSON.stringify(xml.Service?.Contact) : undefined,
|
|
51
|
+
};
|
|
52
|
+
// LAYERS
|
|
53
|
+
const xmlLayers = getXMLArray(xml.Capability?.Layer);
|
|
54
|
+
for (const xmlSubLayer of xmlLayers) {
|
|
55
|
+
capabilities.layers.push(extractLayer(xmlSubLayer));
|
|
56
|
+
}
|
|
57
|
+
// Clean up object
|
|
58
|
+
for (const [key, value] of Object.entries(capabilities)) {
|
|
59
|
+
if (value === undefined) {
|
|
60
|
+
delete capabilities[key];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return capabilities;
|
|
48
64
|
}
|
|
65
|
+
/** Extract typed request metadata from XML requests field */
|
|
49
66
|
function extractRequests(xmlRequests) {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
}
|
|
57
|
-
return requests;
|
|
67
|
+
const requests = {};
|
|
68
|
+
for (const [name, xmlRequest] of Object.entries(xmlRequests || {})) {
|
|
69
|
+
const mimeTypes = getXMLStringArray(xmlRequest?.Format);
|
|
70
|
+
requests[name] = { mimeTypes };
|
|
71
|
+
}
|
|
72
|
+
return requests;
|
|
58
73
|
}
|
|
59
74
|
function extractExceptions(xmlException) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
75
|
+
const xmlExceptionFormats = getXMLArray(xmlException?.Format);
|
|
76
|
+
if (xmlExceptionFormats.length > 0) {
|
|
77
|
+
return {
|
|
78
|
+
mimeTypes: getXMLStringArray(xmlException)
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
return undefined;
|
|
67
82
|
}
|
|
83
|
+
/** Extract request data */
|
|
84
|
+
// eslint-disable-next-line complexity, max-statements
|
|
68
85
|
function extractLayer(xmlLayer) {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
86
|
+
const layer = {
|
|
87
|
+
// All layers must have a title
|
|
88
|
+
title: String(xmlLayer?.Title || ''),
|
|
89
|
+
// Name is required only if renderable
|
|
90
|
+
name: xmlLayer?.Name && String(xmlLayer?.Name),
|
|
91
|
+
abstract: xmlLayer?.Name && String(xmlLayer?.Abstract),
|
|
92
|
+
keywords: getXMLStringArray(xmlLayer.KeywordList?.Keyword)
|
|
93
|
+
};
|
|
94
|
+
// WMS 1.3.0 changes SRS to CRS
|
|
95
|
+
const crs = xmlLayer?.CRS || xmlLayer?.SRS;
|
|
96
|
+
if (crs && Array.isArray(crs) && crs.every((_) => typeof _ === 'string')) {
|
|
97
|
+
layer.crs = crs;
|
|
98
|
+
}
|
|
99
|
+
// v1.3.0 extract simple geographic bounding box
|
|
100
|
+
let geographicBoundingBox = xmlLayer?.EX_GeographicBoundingBox && extractEXBoundingBox(xmlLayer?.EX_GeographicBoundingBox);
|
|
101
|
+
if (geographicBoundingBox) {
|
|
102
|
+
layer.geographicBoundingBox = geographicBoundingBox;
|
|
103
|
+
}
|
|
104
|
+
// v1.1.1 extract simple geographic bounding box
|
|
105
|
+
geographicBoundingBox =
|
|
106
|
+
xmlLayer?.LatLonBoundingBox && extractLatLonBoundingBox(xmlLayer?.LatLonBoundingBox);
|
|
107
|
+
if (geographicBoundingBox) {
|
|
108
|
+
layer.geographicBoundingBox = geographicBoundingBox;
|
|
109
|
+
}
|
|
110
|
+
// Extract per-CRS bounding boxes
|
|
111
|
+
const boundingBoxes = xmlLayer?.BoundingBox && extractWMSBoundingBoxes(xmlLayer?.BoundingBox);
|
|
112
|
+
if (boundingBoxes && boundingBoxes.length > 0) {
|
|
113
|
+
layer.boundingBoxes = boundingBoxes;
|
|
114
|
+
}
|
|
115
|
+
// Extract dimensions
|
|
116
|
+
const xmlDimensions = getXMLArray(xmlLayer?.Dimension);
|
|
117
|
+
const dimensions = xmlDimensions.map((xml) => extractDimension(xml));
|
|
118
|
+
if (dimensions.length) {
|
|
119
|
+
layer.dimensions = dimensions;
|
|
120
|
+
}
|
|
121
|
+
if (xmlLayer?.opaque) {
|
|
122
|
+
layer.opaque = getXMLBoolean(xmlLayer?.opaque);
|
|
123
|
+
}
|
|
124
|
+
if (xmlLayer?.cascaded) {
|
|
125
|
+
layer.cascaded = getXMLBoolean(xmlLayer?.cascaded);
|
|
126
|
+
}
|
|
127
|
+
if (xmlLayer?.queryable) {
|
|
128
|
+
layer.queryable = getXMLBoolean(xmlLayer?.queryable);
|
|
129
|
+
}
|
|
130
|
+
// Single layer is not represented as array in XML
|
|
131
|
+
const xmlLayers = getXMLArray(xmlLayer?.Layer);
|
|
132
|
+
const layers = [];
|
|
133
|
+
for (const xmlSubLayer of xmlLayers) {
|
|
134
|
+
layers.push(extractLayer(xmlSubLayer));
|
|
135
|
+
}
|
|
136
|
+
if (layers.length > 0) {
|
|
137
|
+
layer.layers = layers;
|
|
138
|
+
}
|
|
139
|
+
// Clean up object
|
|
140
|
+
for (const [key, value] of Object.entries(layer)) {
|
|
141
|
+
if (value === undefined) {
|
|
142
|
+
delete layer[key];
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return layer;
|
|
120
146
|
}
|
|
147
|
+
/** WMS 1.3.0 Loosely defined geospatial bounding box in unspecified CRS for quick content searches */
|
|
121
148
|
function extractEXBoundingBox(xmlBoundingBox) {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
} = xmlBoundingBox;
|
|
128
|
-
return [[w, s], [e, n]];
|
|
149
|
+
const { westBoundLongitude: w, northBoundLatitude: n, eastBoundLongitude: e, southBoundLatitude: s } = xmlBoundingBox;
|
|
150
|
+
return [
|
|
151
|
+
[w, s],
|
|
152
|
+
[e, n]
|
|
153
|
+
];
|
|
129
154
|
}
|
|
155
|
+
/** WMS 1.1.1 Loosely defined geospatial bounding box in unspecified CRS for quick content searches */
|
|
130
156
|
function extractLatLonBoundingBox(xmlBoundingBox) {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
} = xmlBoundingBox;
|
|
137
|
-
return [[minx, miny], [maxx, maxy]];
|
|
157
|
+
const { minx, miny, maxx, maxy } = xmlBoundingBox;
|
|
158
|
+
return [
|
|
159
|
+
[minx, miny],
|
|
160
|
+
[maxx, maxy]
|
|
161
|
+
];
|
|
138
162
|
}
|
|
163
|
+
/** Loosely defined geospatial bounding box in unspecified CRS for quick content searches */
|
|
139
164
|
function extractWMSBoundingBoxes(xmlBoundingBoxes) {
|
|
140
|
-
|
|
141
|
-
|
|
165
|
+
const xmlBoxes = getXMLArray(xmlBoundingBoxes);
|
|
166
|
+
return xmlBoxes.map((xmlBox) => extractWMSBoundingBox(xmlBox));
|
|
142
167
|
}
|
|
168
|
+
/** Loosely defined geospatial bounding box in unspecified CRS for quick content searches */
|
|
143
169
|
function extractWMSBoundingBox(xmlBoundingBox) {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
boundingBox
|
|
160
|
-
}
|
|
161
|
-
if (resy) {
|
|
162
|
-
boundingBox.yResolution = resy;
|
|
163
|
-
}
|
|
164
|
-
return boundingBox;
|
|
170
|
+
const { CRS, SRS, minx, miny, maxx, maxy, resx, resy } = xmlBoundingBox;
|
|
171
|
+
const boundingBox = {
|
|
172
|
+
// CRS in 1.3.0, SRS in 1.1.1
|
|
173
|
+
crs: CRS || SRS,
|
|
174
|
+
boundingBox: [
|
|
175
|
+
[getXMLFloat(minx), getXMLFloat(miny)],
|
|
176
|
+
[getXMLFloat(maxx), getXMLFloat(maxy)]
|
|
177
|
+
]
|
|
178
|
+
};
|
|
179
|
+
if (resx) {
|
|
180
|
+
boundingBox.xResolution = resx;
|
|
181
|
+
}
|
|
182
|
+
if (resy) {
|
|
183
|
+
boundingBox.yResolution = resy;
|
|
184
|
+
}
|
|
185
|
+
return boundingBox;
|
|
165
186
|
}
|
|
187
|
+
/**
|
|
188
|
+
* Extracts optional WMS Dimension layer field
|
|
189
|
+
* @param xmlDimension
|
|
190
|
+
* @example <Dimension name="time" units="ISO8601" default="2018-01-01" nearestValue="0">2001-01-01/2018-01-01/P1Y</Dimension>
|
|
191
|
+
* @see https://mapserver.org/ogc/wms_dimension.html
|
|
192
|
+
*/
|
|
166
193
|
function extractDimension(xmlDimension) {
|
|
167
|
-
|
|
168
|
-
name,
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
dimension
|
|
185
|
-
}
|
|
186
|
-
if (xmlDimension.nearestValue) {
|
|
187
|
-
dimension.nearestValue = getXMLBoolean(xmlDimension.nearestValue);
|
|
188
|
-
}
|
|
189
|
-
if (xmlDimension.current) {
|
|
190
|
-
dimension.current = getXMLBoolean(xmlDimension.current);
|
|
191
|
-
}
|
|
192
|
-
return dimension;
|
|
194
|
+
const { name, units, value: extent } = xmlDimension;
|
|
195
|
+
const dimension = { name, units, extent };
|
|
196
|
+
if (xmlDimension.unitSymbol) {
|
|
197
|
+
dimension.unitSymbol = xmlDimension.unitSymbol;
|
|
198
|
+
}
|
|
199
|
+
if (xmlDimension.default) {
|
|
200
|
+
dimension.defaultValue = xmlDimension.default;
|
|
201
|
+
}
|
|
202
|
+
if (xmlDimension.multipleValues) {
|
|
203
|
+
dimension.multipleValues = getXMLBoolean(xmlDimension.multipleValues);
|
|
204
|
+
}
|
|
205
|
+
if (xmlDimension.nearestValue) {
|
|
206
|
+
dimension.nearestValue = getXMLBoolean(xmlDimension.nearestValue);
|
|
207
|
+
}
|
|
208
|
+
if (xmlDimension.current) {
|
|
209
|
+
dimension.current = getXMLBoolean(xmlDimension.current);
|
|
210
|
+
}
|
|
211
|
+
return dimension;
|
|
193
212
|
}
|
|
213
|
+
/** Traverse layers and inject missing props from parents */
|
|
214
|
+
// eslint-disable-next-line complexity
|
|
194
215
|
function addInheritedLayerProps(layer, parent) {
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
216
|
+
if (parent?.geographicBoundingBox && !layer.geographicBoundingBox) {
|
|
217
|
+
layer.geographicBoundingBox = [...parent.geographicBoundingBox];
|
|
218
|
+
}
|
|
219
|
+
if (parent?.crs && !layer.crs) {
|
|
220
|
+
layer.crs = [...parent.crs];
|
|
221
|
+
}
|
|
222
|
+
if (parent?.boundingBoxes && !layer.boundingBoxes) {
|
|
223
|
+
layer.boundingBoxes = [...parent.boundingBoxes];
|
|
224
|
+
}
|
|
225
|
+
if (parent?.dimensions && !layer.dimensions) {
|
|
226
|
+
layer.dimensions = [...parent.dimensions];
|
|
227
|
+
}
|
|
228
|
+
for (const subLayer of layer.layers || []) {
|
|
229
|
+
addInheritedLayerProps(subLayer, layer);
|
|
230
|
+
}
|
|
210
231
|
}
|
|
211
|
-
//# sourceMappingURL=parse-wms-capabilities.js.map
|
|
@@ -1,9 +1,20 @@
|
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
1
4
|
import { XMLLoader } from '@loaders.gl/xml';
|
|
5
|
+
/**
|
|
6
|
+
* Extract an error message from WMS error response XML
|
|
7
|
+
* @param text
|
|
8
|
+
* @param options
|
|
9
|
+
* @returns a string with a human readable message
|
|
10
|
+
*/
|
|
2
11
|
export function parseWMSError(text, options) {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
12
|
+
const parsedXML = XMLLoader.parseTextSync?.(text, options);
|
|
13
|
+
const serviceExceptionXML = parsedXML?.ServiceExceptionReport?.ServiceException ||
|
|
14
|
+
parsedXML?.['ogc:ServiceExceptionReport']?.['ogc:ServiceException'];
|
|
15
|
+
// Sigh, can be either a string or an object
|
|
16
|
+
const message = typeof serviceExceptionXML === 'string'
|
|
17
|
+
? serviceExceptionXML
|
|
18
|
+
: serviceExceptionXML.value || serviceExceptionXML.code || 'Unknown error';
|
|
19
|
+
return message;
|
|
8
20
|
}
|
|
9
|
-
//# sourceMappingURL=parse-wms-error.js.map
|
|
@@ -1,24 +1,25 @@
|
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
1
4
|
import { XMLLoader } from '@loaders.gl/xml';
|
|
5
|
+
/**
|
|
6
|
+
* Parses a typed data structure from raw XML for `GetFeatureInfo` response
|
|
7
|
+
* @note Error handlings is fairly weak
|
|
8
|
+
*/
|
|
2
9
|
export function parseWMSFeatureInfo(text, options) {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
};
|
|
10
|
+
const parsedXML = XMLLoader.parseTextSync?.(text, options);
|
|
11
|
+
const xmlFeatureInfo = parsedXML.FeatureInfoResponse?.FIELDS || [];
|
|
12
|
+
const xmlFeatures = Array.isArray(xmlFeatureInfo) ? xmlFeatureInfo : [xmlFeatureInfo];
|
|
13
|
+
return {
|
|
14
|
+
features: xmlFeatures.map((xmlFeature) => extractFeature(xmlFeature))
|
|
15
|
+
};
|
|
10
16
|
}
|
|
11
17
|
function extractFeature(xmlFeature) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
left: 0,
|
|
20
|
-
right: 0
|
|
21
|
-
}
|
|
22
|
-
};
|
|
18
|
+
const xmlFields = xmlFeature || {};
|
|
19
|
+
// TODO - not correct
|
|
20
|
+
return {
|
|
21
|
+
attributes: xmlFields,
|
|
22
|
+
type: '',
|
|
23
|
+
bounds: { bottom: 0, top: 0, left: 0, right: 0 }
|
|
24
|
+
};
|
|
23
25
|
}
|
|
24
|
-
//# sourceMappingURL=parse-wms-features.js.map
|
|
@@ -1,7 +1,13 @@
|
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
1
4
|
import { XMLLoader } from '@loaders.gl/xml';
|
|
5
|
+
/**
|
|
6
|
+
* Parses a typed data structure from raw XML for `GetFeatureInfo` response
|
|
7
|
+
* @note Error handlings is fairly weak
|
|
8
|
+
*/
|
|
2
9
|
export function parseWMSLayerDescription(text, options) {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
10
|
+
const parsedXML = XMLLoader.parseTextSync?.(text, options);
|
|
11
|
+
// TODO - implement parser
|
|
12
|
+
return parsedXML;
|
|
6
13
|
}
|
|
7
|
-
//# sourceMappingURL=parse-wms-layer-description.js.map
|
|
@@ -1,53 +1,62 @@
|
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
/** A single element of an array is not represented as an array in XML */
|
|
1
5
|
export function getXMLArray(xmlValue) {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
// Already an array, return as is
|
|
7
|
+
if (Array.isArray(xmlValue)) {
|
|
8
|
+
return xmlValue;
|
|
9
|
+
}
|
|
10
|
+
// Single value, wrap in array
|
|
11
|
+
if (xmlValue) {
|
|
12
|
+
return [xmlValue];
|
|
13
|
+
}
|
|
14
|
+
// nullish, return empty array
|
|
15
|
+
return [];
|
|
9
16
|
}
|
|
17
|
+
/** Get a list of strings from XML */
|
|
10
18
|
export function getXMLStringArray(xmlValue) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
19
|
+
const xmlArray = getXMLArray(xmlValue);
|
|
20
|
+
if (xmlArray.length > 0 && xmlArray.every((_) => typeof _ === 'string')) {
|
|
21
|
+
return xmlArray;
|
|
22
|
+
}
|
|
23
|
+
// TODO - error handling?
|
|
24
|
+
return [];
|
|
16
25
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
26
|
+
/** Get XML float */
|
|
27
|
+
export function getXMLFloat(xmlValue, defaultValue = undefined) {
|
|
28
|
+
switch (typeof xmlValue) {
|
|
29
|
+
case 'number':
|
|
30
|
+
return xmlValue;
|
|
31
|
+
case 'string':
|
|
32
|
+
return parseFloat(xmlValue);
|
|
33
|
+
default:
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
27
36
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
37
|
+
/** Get XML integer */
|
|
38
|
+
export function getXMLInteger(xmlValue, defaultValue = undefined) {
|
|
39
|
+
switch (typeof xmlValue) {
|
|
40
|
+
case 'number':
|
|
41
|
+
return xmlValue;
|
|
42
|
+
case 'string':
|
|
43
|
+
return parseInt(xmlValue, 10);
|
|
44
|
+
default:
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
38
47
|
}
|
|
48
|
+
/** Somewhat arbitrary boolean parsing */
|
|
39
49
|
export function getXMLBoolean(xmlValue) {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
50
|
+
switch (xmlValue) {
|
|
51
|
+
case 'true':
|
|
52
|
+
return true;
|
|
53
|
+
case 'false':
|
|
54
|
+
return false;
|
|
55
|
+
case '1':
|
|
56
|
+
return true;
|
|
57
|
+
case '0':
|
|
58
|
+
return false;
|
|
59
|
+
default:
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
52
62
|
}
|
|
53
|
-
//# sourceMappingURL=parse-xml-helpers.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ImageSource, Service } from '@loaders.gl/loader-utils';
|
|
2
|
-
import { ImageServiceProps } from
|
|
2
|
+
import { ImageServiceProps } from "./image-service.js";
|
|
3
3
|
export type CreateImageServiceProps = ImageServiceProps & {
|
|
4
4
|
type?: string | 'auto';
|
|
5
5
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-image-service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/create-image-service.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,WAAW,EAAE,OAAO,EAAC,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAC,iBAAiB,EAAC,
|
|
1
|
+
{"version":3,"file":"create-image-service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/create-image-service.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,WAAW,EAAE,OAAO,EAAC,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAC,iBAAiB,EAAC,2BAAwB;AAElD,MAAM,MAAM,uBAAuB,GAAG,iBAAiB,GAAG;IACxD,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,uBAAuB,EAC9B,QAAQ,EAAE,OAAO,EAAE,GAClB,WAAW,CASb"}
|