@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.
Files changed (109) hide show
  1. package/dist/csw-capabilities-loader.d.ts +1 -1
  2. package/dist/csw-capabilities-loader.d.ts.map +1 -1
  3. package/dist/csw-capabilities-loader.js +24 -16
  4. package/dist/csw-domain-loader.d.ts +1 -1
  5. package/dist/csw-domain-loader.d.ts.map +1 -1
  6. package/dist/csw-domain-loader.js +24 -16
  7. package/dist/csw-records-loader.d.ts +1 -1
  8. package/dist/csw-records-loader.d.ts.map +1 -1
  9. package/dist/csw-records-loader.js +24 -16
  10. package/dist/gml-loader.d.ts +1 -1
  11. package/dist/gml-loader.d.ts.map +1 -1
  12. package/dist/gml-loader.js +24 -16
  13. package/dist/index.cjs +76 -65
  14. package/dist/index.cjs.map +7 -0
  15. package/dist/index.d.ts +30 -30
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +8 -1
  18. package/dist/lib/parsers/csw/parse-csw-capabilities.js +18 -13
  19. package/dist/lib/parsers/csw/parse-csw-domain.js +26 -18
  20. package/dist/lib/parsers/csw/parse-csw-records.js +47 -36
  21. package/dist/lib/parsers/csw/parse-exception-report.js +26 -8
  22. package/dist/lib/parsers/gml/deep-strict-equal.js +107 -39
  23. package/dist/lib/parsers/gml/parse-gml.js +299 -280
  24. package/dist/lib/parsers/wms/parse-wms-capabilities.js +207 -187
  25. package/dist/lib/parsers/wms/parse-wms-error.js +17 -6
  26. package/dist/lib/parsers/wms/parse-wms-features.js +20 -19
  27. package/dist/lib/parsers/wms/parse-wms-layer-description.js +10 -4
  28. package/dist/lib/parsers/xml/parse-xml-helpers.js +54 -45
  29. package/dist/lib/services/create-image-service.d.ts +1 -1
  30. package/dist/lib/services/create-image-service.d.ts.map +1 -1
  31. package/dist/lib/services/create-image-service.js +31 -19
  32. package/dist/lib/services/image-service.js +40 -33
  33. package/dist/services/arcgis/arcgis-image-service.d.ts +2 -2
  34. package/dist/services/arcgis/arcgis-image-service.d.ts.map +1 -1
  35. package/dist/services/arcgis/arcgis-image-service.js +92 -55
  36. package/dist/services/arcgis/arcgis-server.js +35 -28
  37. package/dist/services/create-image-source.d.ts +3 -3
  38. package/dist/services/create-image-source.d.ts.map +1 -1
  39. package/dist/services/create-image-source.js +11 -2
  40. package/dist/services/ogc/csw-service.d.ts +3 -3
  41. package/dist/services/ogc/csw-service.d.ts.map +1 -1
  42. package/dist/services/ogc/csw-service.js +159 -143
  43. package/dist/services/ogc/wms-service.d.ts +4 -4
  44. package/dist/services/ogc/wms-service.d.ts.map +1 -1
  45. package/dist/services/ogc/wms-service.js +306 -242
  46. package/dist/wip/data-source.js +58 -1
  47. package/dist/wip/lib/wcs/parse-wcs-capabilities.js +8 -11
  48. package/dist/wip/lib/wfs/parse-wfs-capabilities.js +12 -12
  49. package/dist/wip/lib/wfs/parse-wfs.js +20 -20
  50. package/dist/wip/lib/wmts/parse-wmts-capabilities.js +70 -12
  51. package/dist/wip/lib/wmts/parse-wmts.js +23 -20
  52. package/dist/wip/services/arcgis-feature-service.js +25 -22
  53. package/dist/wip/wcs-capabilities-loader.d.ts +1 -1
  54. package/dist/wip/wcs-capabilities-loader.d.ts.map +1 -1
  55. package/dist/wip/wcs-capabilities-loader.js +22 -16
  56. package/dist/wip/wfs-capabilities-loader.d.ts +1 -1
  57. package/dist/wip/wfs-capabilities-loader.d.ts.map +1 -1
  58. package/dist/wip/wfs-capabilities-loader.js +22 -16
  59. package/dist/wip/wms-feature-info-loader.d.ts +1 -1
  60. package/dist/wip/wms-feature-info-loader.d.ts.map +1 -1
  61. package/dist/wip/wms-feature-info-loader.js +10 -6
  62. package/dist/wip/wms-layer-description-loader.d.ts +1 -1
  63. package/dist/wip/wms-layer-description-loader.d.ts.map +1 -1
  64. package/dist/wip/wms-layer-description-loader.js +9 -6
  65. package/dist/wip/wmts-capabilities-loader.js +23 -16
  66. package/dist/wms-capabilities-loader.d.ts +2 -2
  67. package/dist/wms-capabilities-loader.d.ts.map +1 -1
  68. package/dist/wms-capabilities-loader.js +28 -16
  69. package/dist/wms-error-loader.js +34 -29
  70. package/package.json +10 -8
  71. package/dist/csw-capabilities-loader.js.map +0 -1
  72. package/dist/csw-domain-loader.js.map +0 -1
  73. package/dist/csw-records-loader.js.map +0 -1
  74. package/dist/gml-loader.js.map +0 -1
  75. package/dist/index.js.map +0 -1
  76. package/dist/lib/parsers/csw/parse-csw-capabilities.js.map +0 -1
  77. package/dist/lib/parsers/csw/parse-csw-domain.js.map +0 -1
  78. package/dist/lib/parsers/csw/parse-csw-records.js.map +0 -1
  79. package/dist/lib/parsers/csw/parse-exception-report.js.map +0 -1
  80. package/dist/lib/parsers/gml/deep-strict-equal.js.map +0 -1
  81. package/dist/lib/parsers/gml/parse-gml.js.map +0 -1
  82. package/dist/lib/parsers/wms/parse-wms-capabilities.js.map +0 -1
  83. package/dist/lib/parsers/wms/parse-wms-error.js.map +0 -1
  84. package/dist/lib/parsers/wms/parse-wms-features.js.map +0 -1
  85. package/dist/lib/parsers/wms/parse-wms-layer-description.js.map +0 -1
  86. package/dist/lib/parsers/xml/parse-xml-helpers.js.map +0 -1
  87. package/dist/lib/services/create-image-service.js.map +0 -1
  88. package/dist/lib/services/image-service.js.map +0 -1
  89. package/dist/services/arcgis/arcgis-image-service.js.map +0 -1
  90. package/dist/services/arcgis/arcgis-server.js.map +0 -1
  91. package/dist/services/create-image-source.js.map +0 -1
  92. package/dist/services/ogc/csw-service.js.map +0 -1
  93. package/dist/services/ogc/wms-service.js.map +0 -1
  94. package/dist/wip/data-source.js.map +0 -1
  95. package/dist/wip/lib/wcs/parse-wcs-capabilities.js.map +0 -1
  96. package/dist/wip/lib/wfs/parse-wfs-capabilities.js.map +0 -1
  97. package/dist/wip/lib/wfs/parse-wfs.js.map +0 -1
  98. package/dist/wip/lib/wmts/parse-wmts-capabilities.js.map +0 -1
  99. package/dist/wip/lib/wmts/parse-wmts.js.map +0 -1
  100. package/dist/wip/services/arcgis-feature-service.js.map +0 -1
  101. package/dist/wip/services/wmts-service.ts.disabled +0 -348
  102. package/dist/wip/wcs-capabilities-loader.js.map +0 -1
  103. package/dist/wip/wfs-capabilities-loader.js.map +0 -1
  104. package/dist/wip/wms-feature-info-loader.js.map +0 -1
  105. package/dist/wip/wms-layer-description-loader.js.map +0 -1
  106. package/dist/wip/wms-layer-description-loader.md.disabled.md +0 -47
  107. package/dist/wip/wmts-capabilities-loader.js.map +0 -1
  108. package/dist/wms-capabilities-loader.js.map +0 -1
  109. 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
- var _XMLLoader$parseTextS;
5
- const parsedXML = (_XMLLoader$parseTextS = XMLLoader.parseTextSync) === null || _XMLLoader$parseTextS === void 0 ? void 0 : _XMLLoader$parseTextS.call(XMLLoader, xmlText, options);
6
- const xmlCapabilities = parsedXML.WMT_MS_Capabilities || parsedXML.WMS_Capabilities || parsedXML;
7
- const capabilities = extractCapabilities(xmlCapabilities);
8
- if (options !== null && options !== void 0 && options.inheritedLayerProps) {
9
- for (const layer of capabilities.layers) {
10
- addInheritedLayerProps(layer, null);
11
- }
12
- }
13
- if (options !== null && options !== void 0 && options.includeRawJSON) {
14
- capabilities.json = xmlCapabilities;
15
- }
16
- if (options !== null && options !== void 0 && options.includeXMLText) {
17
- capabilities.xml = xmlText;
18
- }
19
- return capabilities;
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
- var _xml$Service, _xml$Service2, _xml$Service3, _xml$Service4, _xml$Service5, _xml$Service6, _xml$Service6$Keyword, _xml$Service7, _xml$Service8, _xml$Service9, _xml$Service10, _xml$Service11, _xml$Service12, _xml$Service13, _xml$Capability, _xml$Capability2;
23
- const capabilities = {
24
- version: String(xml.version || ''),
25
- name: String(((_xml$Service = xml.Service) === null || _xml$Service === void 0 ? void 0 : _xml$Service.Name) || 'unnamed'),
26
- title: (_xml$Service2 = xml.Service) !== null && _xml$Service2 !== void 0 && _xml$Service2.Title ? String((_xml$Service3 = xml.Service) === null || _xml$Service3 === void 0 ? void 0 : _xml$Service3.Title) : undefined,
27
- abstract: (_xml$Service4 = xml.Service) !== null && _xml$Service4 !== void 0 && _xml$Service4.Abstract ? String((_xml$Service5 = xml.Service) === null || _xml$Service5 === void 0 ? void 0 : _xml$Service5.Abstract) : undefined,
28
- keywords: getXMLStringArray((_xml$Service6 = xml.Service) === null || _xml$Service6 === void 0 ? void 0 : (_xml$Service6$Keyword = _xml$Service6.KeywordList) === null || _xml$Service6$Keyword === void 0 ? void 0 : _xml$Service6$Keyword.Keyword),
29
- fees: (_xml$Service7 = xml.Service) !== null && _xml$Service7 !== void 0 && _xml$Service7.Fees ? JSON.stringify((_xml$Service8 = xml.Service) === null || _xml$Service8 === void 0 ? void 0 : _xml$Service8.Fees) : undefined,
30
- accessConstraints: (_xml$Service9 = xml.Service) !== null && _xml$Service9 !== void 0 && _xml$Service9.AccessConstraints ? JSON.stringify((_xml$Service10 = xml.Service) === null || _xml$Service10 === void 0 ? void 0 : _xml$Service10.AccessConstraints) : undefined,
31
- layerLimit: getXMLInteger((_xml$Service11 = xml.Service) === null || _xml$Service11 === void 0 ? void 0 : _xml$Service11.LayerLimit),
32
- maxWidth: getXMLInteger((_xml$Service12 = xml.Service) === null || _xml$Service12 === void 0 ? void 0 : _xml$Service12.maxWidth),
33
- maxHeight: getXMLInteger((_xml$Service13 = xml.Service) === null || _xml$Service13 === void 0 ? void 0 : _xml$Service13.maxHeight),
34
- layers: [],
35
- requests: extractRequests((_xml$Capability = xml.Capability) === null || _xml$Capability === void 0 ? void 0 : _xml$Capability.Request),
36
- exceptions: extractExceptions(xml.Exception)
37
- };
38
- const xmlLayers = getXMLArray((_xml$Capability2 = xml.Capability) === null || _xml$Capability2 === void 0 ? void 0 : _xml$Capability2.Layer);
39
- for (const xmlSubLayer of xmlLayers) {
40
- capabilities.layers.push(extractLayer(xmlSubLayer));
41
- }
42
- for (const [key, value] of Object.entries(capabilities)) {
43
- if (value === undefined) {
44
- delete capabilities[key];
45
- }
46
- }
47
- return capabilities;
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
- const requests = {};
51
- for (const [name, xmlRequest] of Object.entries(xmlRequests || {})) {
52
- const mimeTypes = getXMLStringArray(xmlRequest === null || xmlRequest === void 0 ? void 0 : xmlRequest.Format);
53
- requests[name] = {
54
- mimeTypes
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
- const xmlExceptionFormats = getXMLArray(xmlException === null || xmlException === void 0 ? void 0 : xmlException.Format);
61
- if (xmlExceptionFormats.length > 0) {
62
- return {
63
- mimeTypes: getXMLStringArray(xmlException)
64
- };
65
- }
66
- return undefined;
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
- var _xmlLayer$KeywordList;
70
- const layer = {
71
- title: String((xmlLayer === null || xmlLayer === void 0 ? void 0 : xmlLayer.Title) || ''),
72
- name: (xmlLayer === null || xmlLayer === void 0 ? void 0 : xmlLayer.Name) && String(xmlLayer === null || xmlLayer === void 0 ? void 0 : xmlLayer.Name),
73
- abstract: (xmlLayer === null || xmlLayer === void 0 ? void 0 : xmlLayer.Name) && String(xmlLayer === null || xmlLayer === void 0 ? void 0 : xmlLayer.Abstract),
74
- keywords: getXMLStringArray((_xmlLayer$KeywordList = xmlLayer.KeywordList) === null || _xmlLayer$KeywordList === void 0 ? void 0 : _xmlLayer$KeywordList.Keyword)
75
- };
76
- const crs = (xmlLayer === null || xmlLayer === void 0 ? void 0 : xmlLayer.CRS) || (xmlLayer === null || xmlLayer === void 0 ? void 0 : xmlLayer.SRS);
77
- if (crs && Array.isArray(crs) && crs.every(_ => typeof _ === 'string')) {
78
- layer.crs = crs;
79
- }
80
- let geographicBoundingBox = (xmlLayer === null || xmlLayer === void 0 ? void 0 : xmlLayer.EX_GeographicBoundingBox) && extractEXBoundingBox(xmlLayer === null || xmlLayer === void 0 ? void 0 : xmlLayer.EX_GeographicBoundingBox);
81
- if (geographicBoundingBox) {
82
- layer.geographicBoundingBox = geographicBoundingBox;
83
- }
84
- geographicBoundingBox = (xmlLayer === null || xmlLayer === void 0 ? void 0 : xmlLayer.LatLonBoundingBox) && extractLatLonBoundingBox(xmlLayer === null || xmlLayer === void 0 ? void 0 : xmlLayer.LatLonBoundingBox);
85
- if (geographicBoundingBox) {
86
- layer.geographicBoundingBox = geographicBoundingBox;
87
- }
88
- const boundingBoxes = (xmlLayer === null || xmlLayer === void 0 ? void 0 : xmlLayer.BoundingBox) && extractWMSBoundingBoxes(xmlLayer === null || xmlLayer === void 0 ? void 0 : xmlLayer.BoundingBox);
89
- if (boundingBoxes && boundingBoxes.length > 0) {
90
- layer.boundingBoxes = boundingBoxes;
91
- }
92
- const xmlDimensions = getXMLArray(xmlLayer === null || xmlLayer === void 0 ? void 0 : xmlLayer.Dimension);
93
- const dimensions = xmlDimensions.map(xml => extractDimension(xml));
94
- if (dimensions.length) {
95
- layer.dimensions = dimensions;
96
- }
97
- if (xmlLayer !== null && xmlLayer !== void 0 && xmlLayer.opaque) {
98
- layer.opaque = getXMLBoolean(xmlLayer === null || xmlLayer === void 0 ? void 0 : xmlLayer.opaque);
99
- }
100
- if (xmlLayer !== null && xmlLayer !== void 0 && xmlLayer.cascaded) {
101
- layer.cascaded = getXMLBoolean(xmlLayer === null || xmlLayer === void 0 ? void 0 : xmlLayer.cascaded);
102
- }
103
- if (xmlLayer !== null && xmlLayer !== void 0 && xmlLayer.queryable) {
104
- layer.queryable = getXMLBoolean(xmlLayer === null || xmlLayer === void 0 ? void 0 : xmlLayer.queryable);
105
- }
106
- const xmlLayers = getXMLArray(xmlLayer === null || xmlLayer === void 0 ? void 0 : xmlLayer.Layer);
107
- const layers = [];
108
- for (const xmlSubLayer of xmlLayers) {
109
- layers.push(extractLayer(xmlSubLayer));
110
- }
111
- if (layers.length > 0) {
112
- layer.layers = layers;
113
- }
114
- for (const [key, value] of Object.entries(layer)) {
115
- if (value === undefined) {
116
- delete layer[key];
117
- }
118
- }
119
- return layer;
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
- const {
123
- westBoundLongitude: w,
124
- northBoundLatitude: n,
125
- eastBoundLongitude: e,
126
- southBoundLatitude: s
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
- const {
132
- minx,
133
- miny,
134
- maxx,
135
- maxy
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
- const xmlBoxes = getXMLArray(xmlBoundingBoxes);
141
- return xmlBoxes.map(xmlBox => extractWMSBoundingBox(xmlBox));
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
- const {
145
- CRS,
146
- SRS,
147
- minx,
148
- miny,
149
- maxx,
150
- maxy,
151
- resx,
152
- resy
153
- } = xmlBoundingBox;
154
- const boundingBox = {
155
- crs: CRS || SRS,
156
- boundingBox: [[getXMLFloat(minx), getXMLFloat(miny)], [getXMLFloat(maxx), getXMLFloat(maxy)]]
157
- };
158
- if (resx) {
159
- boundingBox.xResolution = resx;
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
- const {
168
- name,
169
- units,
170
- value: extent
171
- } = xmlDimension;
172
- const dimension = {
173
- name,
174
- units,
175
- extent
176
- };
177
- if (xmlDimension.unitSymbol) {
178
- dimension.unitSymbol = xmlDimension.unitSymbol;
179
- }
180
- if (xmlDimension.default) {
181
- dimension.defaultValue = xmlDimension.default;
182
- }
183
- if (xmlDimension.multipleValues) {
184
- dimension.multipleValues = getXMLBoolean(xmlDimension.multipleValues);
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
- if (parent !== null && parent !== void 0 && parent.geographicBoundingBox && !layer.geographicBoundingBox) {
196
- layer.geographicBoundingBox = [...parent.geographicBoundingBox];
197
- }
198
- if (parent !== null && parent !== void 0 && parent.crs && !layer.crs) {
199
- layer.crs = [...parent.crs];
200
- }
201
- if (parent !== null && parent !== void 0 && parent.boundingBoxes && !layer.boundingBoxes) {
202
- layer.boundingBoxes = [...parent.boundingBoxes];
203
- }
204
- if (parent !== null && parent !== void 0 && parent.dimensions && !layer.dimensions) {
205
- layer.dimensions = [...parent.dimensions];
206
- }
207
- for (const subLayer of layer.layers || []) {
208
- addInheritedLayerProps(subLayer, layer);
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
- var _XMLLoader$parseTextS, _parsedXML$ServiceExc, _parsedXML$ogcServic;
4
- const parsedXML = (_XMLLoader$parseTextS = XMLLoader.parseTextSync) === null || _XMLLoader$parseTextS === void 0 ? void 0 : _XMLLoader$parseTextS.call(XMLLoader, text, options);
5
- const serviceExceptionXML = (parsedXML === null || parsedXML === void 0 ? void 0 : (_parsedXML$ServiceExc = parsedXML.ServiceExceptionReport) === null || _parsedXML$ServiceExc === void 0 ? void 0 : _parsedXML$ServiceExc.ServiceException) || (parsedXML === null || parsedXML === void 0 ? void 0 : (_parsedXML$ogcServic = parsedXML['ogc:ServiceExceptionReport']) === null || _parsedXML$ogcServic === void 0 ? void 0 : _parsedXML$ogcServic['ogc:ServiceException']);
6
- const message = typeof serviceExceptionXML === 'string' ? serviceExceptionXML : serviceExceptionXML.value || serviceExceptionXML.code || 'Unknown error';
7
- return message;
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
- var _XMLLoader$parseTextS, _parsedXML$FeatureInf;
4
- const parsedXML = (_XMLLoader$parseTextS = XMLLoader.parseTextSync) === null || _XMLLoader$parseTextS === void 0 ? void 0 : _XMLLoader$parseTextS.call(XMLLoader, text, options);
5
- const xmlFeatureInfo = ((_parsedXML$FeatureInf = parsedXML.FeatureInfoResponse) === null || _parsedXML$FeatureInf === void 0 ? void 0 : _parsedXML$FeatureInf.FIELDS) || [];
6
- const xmlFeatures = Array.isArray(xmlFeatureInfo) ? xmlFeatureInfo : [xmlFeatureInfo];
7
- return {
8
- features: xmlFeatures.map(xmlFeature => extractFeature(xmlFeature))
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
- const xmlFields = xmlFeature || {};
13
- return {
14
- attributes: xmlFields,
15
- type: '',
16
- bounds: {
17
- bottom: 0,
18
- top: 0,
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
- var _XMLLoader$parseTextS;
4
- const parsedXML = (_XMLLoader$parseTextS = XMLLoader.parseTextSync) === null || _XMLLoader$parseTextS === void 0 ? void 0 : _XMLLoader$parseTextS.call(XMLLoader, text, options);
5
- return parsedXML;
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
- if (Array.isArray(xmlValue)) {
3
- return xmlValue;
4
- }
5
- if (xmlValue) {
6
- return [xmlValue];
7
- }
8
- return [];
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
- const xmlArray = getXMLArray(xmlValue);
12
- if (xmlArray.length > 0 && xmlArray.every(_ => typeof _ === 'string')) {
13
- return xmlArray;
14
- }
15
- return [];
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
- export function getXMLFloat(xmlValue) {
18
- let defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
19
- switch (typeof xmlValue) {
20
- case 'number':
21
- return xmlValue;
22
- case 'string':
23
- return parseFloat(xmlValue);
24
- default:
25
- return undefined;
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
- export function getXMLInteger(xmlValue) {
29
- let defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
30
- switch (typeof xmlValue) {
31
- case 'number':
32
- return xmlValue;
33
- case 'string':
34
- return parseInt(xmlValue, 10);
35
- default:
36
- return undefined;
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
- switch (xmlValue) {
41
- case 'true':
42
- return true;
43
- case 'false':
44
- return false;
45
- case '1':
46
- return true;
47
- case '0':
48
- return false;
49
- default:
50
- return false;
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 './image-service';
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,MAAM,iBAAiB,CAAC;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"}
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"}