@loaders.gl/wms 3.4.0-alpha.2 → 3.4.0-alpha.3

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 (184) hide show
  1. package/dist/dist.min.js +359 -174
  2. package/dist/es5/csw-capabilities-loader.js +7 -11
  3. package/dist/es5/csw-capabilities-loader.js.map +1 -1
  4. package/dist/es5/csw-domain-loader.js +7 -10
  5. package/dist/es5/csw-domain-loader.js.map +1 -1
  6. package/dist/es5/csw-records-loader.js +7 -10
  7. package/dist/es5/csw-records-loader.js.map +1 -1
  8. package/dist/es5/gml-loader.js +7 -10
  9. package/dist/es5/gml-loader.js.map +1 -1
  10. package/dist/es5/index.js +0 -7
  11. package/dist/es5/index.js.map +1 -1
  12. package/dist/es5/lerc-loader.js +17 -22
  13. package/dist/es5/lerc-loader.js.map +1 -1
  14. package/dist/es5/lib/create-image-source.js +1 -2
  15. package/dist/es5/lib/create-image-source.js.map +1 -1
  16. package/dist/es5/lib/parsers/csw/parse-csw-capabilities.js.map +1 -1
  17. package/dist/es5/lib/parsers/csw/parse-csw-domain.js +1 -1
  18. package/dist/es5/lib/parsers/csw/parse-csw-domain.js.map +1 -1
  19. package/dist/es5/lib/parsers/csw/parse-csw-records.js +1 -2
  20. package/dist/es5/lib/parsers/csw/parse-csw-records.js.map +1 -1
  21. package/dist/es5/lib/parsers/csw/parse-exception-report.js +0 -2
  22. package/dist/es5/lib/parsers/csw/parse-exception-report.js.map +1 -1
  23. package/dist/es5/lib/parsers/gml/deep-strict-equal.js +0 -8
  24. package/dist/es5/lib/parsers/gml/deep-strict-equal.js.map +1 -1
  25. package/dist/es5/lib/parsers/gml/parse-gml.js +1 -13
  26. package/dist/es5/lib/parsers/gml/parse-gml.js.map +1 -1
  27. package/dist/es5/lib/parsers/wms/parse-wms-capabilities.js +197 -54
  28. package/dist/es5/lib/parsers/wms/parse-wms-capabilities.js.map +1 -1
  29. package/dist/es5/lib/parsers/wms/parse-wms-error.js +0 -1
  30. package/dist/es5/lib/parsers/wms/parse-wms-error.js.map +1 -1
  31. package/dist/es5/lib/parsers/wms/parse-wms-features.js +0 -1
  32. package/dist/es5/lib/parsers/wms/parse-wms-features.js.map +1 -1
  33. package/dist/es5/lib/parsers/wms/parse-wms-layer-description.js +0 -1
  34. package/dist/es5/lib/parsers/wms/parse-wms-layer-description.js.map +1 -1
  35. package/dist/es5/lib/parsers/xml/parse-xml-helpers.js +67 -0
  36. package/dist/es5/lib/parsers/xml/parse-xml-helpers.js.map +1 -0
  37. package/dist/es5/lib/services/arcgis/arcgis-image-service.js +35 -54
  38. package/dist/es5/lib/services/arcgis/arcgis-image-service.js.map +1 -1
  39. package/dist/es5/lib/services/arcgis/arcgis-server.js +50 -54
  40. package/dist/es5/lib/services/arcgis/arcgis-server.js.map +1 -1
  41. package/dist/es5/lib/services/generic/image-service.js +27 -36
  42. package/dist/es5/lib/services/generic/image-service.js.map +1 -1
  43. package/dist/es5/lib/services/ogc/csw-service.js +161 -186
  44. package/dist/es5/lib/services/ogc/csw-service.js.map +1 -1
  45. package/dist/es5/lib/services/ogc/wms-service.js +283 -245
  46. package/dist/es5/lib/services/ogc/wms-service.js.map +1 -1
  47. package/dist/es5/lib/sources/data-source.js +1 -6
  48. package/dist/es5/lib/sources/data-source.js.map +1 -1
  49. package/dist/es5/lib/sources/image-source.js.map +1 -1
  50. package/dist/es5/lib/sources/tile-source.js.map +1 -1
  51. package/dist/es5/lib/sources/utils/utils.js +0 -4
  52. package/dist/es5/lib/sources/utils/utils.js.map +1 -1
  53. package/dist/es5/wip/arcgis-feature-service.js +2 -7
  54. package/dist/es5/wip/arcgis-feature-service.js.map +1 -1
  55. package/dist/es5/wip/data-source.js +0 -2
  56. package/dist/es5/wip/lib/wcs/parse-wcs-capabilities.js.map +1 -1
  57. package/dist/es5/wip/lib/wfs/parse-wfs-capabilities.js.map +1 -1
  58. package/dist/es5/wip/lib/wmts/parse-wmts-capabilities.js.map +1 -1
  59. package/dist/es5/wip/wcs-capabilities-loader.js +7 -10
  60. package/dist/es5/wip/wcs-capabilities-loader.js.map +1 -1
  61. package/dist/es5/wip/wfs-capabilities-loader.js +7 -10
  62. package/dist/es5/wip/wfs-capabilities-loader.js.map +1 -1
  63. package/dist/es5/wip/wms-feature-info-loader.js +6 -8
  64. package/dist/es5/wip/wms-feature-info-loader.js.map +1 -1
  65. package/dist/es5/wip/wms-layer-description-loader.js +6 -8
  66. package/dist/es5/wip/wms-layer-description-loader.js.map +1 -1
  67. package/dist/es5/wip/wmts-capabilities-loader.js +7 -16
  68. package/dist/es5/wip/wmts-capabilities-loader.js.map +1 -1
  69. package/dist/es5/wms-capabilities-loader.js +8 -12
  70. package/dist/es5/wms-capabilities-loader.js.map +1 -1
  71. package/dist/es5/wms-error-loader.js +7 -9
  72. package/dist/es5/wms-error-loader.js.map +1 -1
  73. package/dist/esm/bundle.js +0 -2
  74. package/dist/esm/bundle.js.map +1 -1
  75. package/dist/esm/csw-capabilities-loader.js +1 -5
  76. package/dist/esm/csw-capabilities-loader.js.map +1 -1
  77. package/dist/esm/csw-domain-loader.js +1 -4
  78. package/dist/esm/csw-domain-loader.js.map +1 -1
  79. package/dist/esm/csw-records-loader.js +1 -4
  80. package/dist/esm/csw-records-loader.js.map +1 -1
  81. package/dist/esm/gml-loader.js +1 -4
  82. package/dist/esm/gml-loader.js.map +1 -1
  83. package/dist/esm/index.js +0 -11
  84. package/dist/esm/index.js.map +1 -1
  85. package/dist/esm/lerc-loader.js +1 -4
  86. package/dist/esm/lerc-loader.js.map +1 -1
  87. package/dist/esm/lib/create-image-source.js +0 -3
  88. package/dist/esm/lib/create-image-source.js.map +1 -1
  89. package/dist/esm/lib/parsers/csw/parse-csw-capabilities.js +0 -3
  90. package/dist/esm/lib/parsers/csw/parse-csw-capabilities.js.map +1 -1
  91. package/dist/esm/lib/parsers/csw/parse-csw-domain.js +0 -3
  92. package/dist/esm/lib/parsers/csw/parse-csw-domain.js.map +1 -1
  93. package/dist/esm/lib/parsers/csw/parse-csw-records.js +0 -3
  94. package/dist/esm/lib/parsers/csw/parse-csw-records.js.map +1 -1
  95. package/dist/esm/lib/parsers/csw/parse-exception-report.js +0 -3
  96. package/dist/esm/lib/parsers/csw/parse-exception-report.js.map +1 -1
  97. package/dist/esm/lib/parsers/gml/deep-strict-equal.js +0 -9
  98. package/dist/esm/lib/parsers/gml/deep-strict-equal.js.map +1 -1
  99. package/dist/esm/lib/parsers/gml/parse-gml.js +0 -14
  100. package/dist/esm/lib/parsers/gml/parse-gml.js.map +1 -1
  101. package/dist/esm/lib/parsers/wms/parse-wms-capabilities.js +151 -42
  102. package/dist/esm/lib/parsers/wms/parse-wms-capabilities.js.map +1 -1
  103. package/dist/esm/lib/parsers/wms/parse-wms-error.js +0 -3
  104. package/dist/esm/lib/parsers/wms/parse-wms-error.js.map +1 -1
  105. package/dist/esm/lib/parsers/wms/parse-wms-features.js +0 -3
  106. package/dist/esm/lib/parsers/wms/parse-wms-features.js.map +1 -1
  107. package/dist/esm/lib/parsers/wms/parse-wms-layer-description.js +0 -3
  108. package/dist/esm/lib/parsers/wms/parse-wms-layer-description.js.map +1 -1
  109. package/dist/esm/lib/parsers/xml/parse-xml-helpers.js +53 -0
  110. package/dist/esm/lib/parsers/xml/parse-xml-helpers.js.map +1 -0
  111. package/dist/esm/lib/services/arcgis/arcgis-image-service.js +0 -9
  112. package/dist/esm/lib/services/arcgis/arcgis-image-service.js.map +1 -1
  113. package/dist/esm/lib/services/arcgis/arcgis-server.js +0 -2
  114. package/dist/esm/lib/services/arcgis/arcgis-server.js.map +1 -1
  115. package/dist/esm/lib/services/generic/image-service.js +0 -5
  116. package/dist/esm/lib/services/generic/image-service.js.map +1 -1
  117. package/dist/esm/lib/services/ogc/csw-service.js +0 -11
  118. package/dist/esm/lib/services/ogc/csw-service.js.map +1 -1
  119. package/dist/esm/lib/services/ogc/wms-service.js +96 -87
  120. package/dist/esm/lib/services/ogc/wms-service.js.map +1 -1
  121. package/dist/esm/lib/sources/data-source.js +0 -6
  122. package/dist/esm/lib/sources/data-source.js.map +1 -1
  123. package/dist/esm/lib/sources/image-source.js +0 -3
  124. package/dist/esm/lib/sources/image-source.js.map +1 -1
  125. package/dist/esm/lib/sources/tile-source.js +0 -3
  126. package/dist/esm/lib/sources/tile-source.js.map +1 -1
  127. package/dist/esm/lib/sources/utils/utils.js +0 -5
  128. package/dist/esm/lib/sources/utils/utils.js.map +1 -1
  129. package/dist/esm/wip/arcgis-feature-service.js +0 -3
  130. package/dist/esm/wip/arcgis-feature-service.js.map +1 -1
  131. package/dist/esm/wip/lib/wcs/parse-wcs-capabilities.js +0 -3
  132. package/dist/esm/wip/lib/wcs/parse-wcs-capabilities.js.map +1 -1
  133. package/dist/esm/wip/lib/wfs/parse-wfs-capabilities.js +0 -3
  134. package/dist/esm/wip/lib/wfs/parse-wfs-capabilities.js.map +1 -1
  135. package/dist/esm/wip/lib/wmts/parse-wmts-capabilities.js +0 -3
  136. package/dist/esm/wip/lib/wmts/parse-wmts-capabilities.js.map +1 -1
  137. package/dist/esm/wip/wcs-capabilities-loader.js +1 -4
  138. package/dist/esm/wip/wcs-capabilities-loader.js.map +1 -1
  139. package/dist/esm/wip/wfs-capabilities-loader.js +1 -4
  140. package/dist/esm/wip/wfs-capabilities-loader.js.map +1 -1
  141. package/dist/esm/wip/wms-feature-info-loader.js +0 -2
  142. package/dist/esm/wip/wms-feature-info-loader.js.map +1 -1
  143. package/dist/esm/wip/wms-layer-description-loader.js +0 -2
  144. package/dist/esm/wip/wms-layer-description-loader.js.map +1 -1
  145. package/dist/esm/wip/wmts-capabilities-loader.js +1 -6
  146. package/dist/esm/wip/wmts-capabilities-loader.js.map +1 -1
  147. package/dist/esm/wms-capabilities-loader.js +3 -7
  148. package/dist/esm/wms-capabilities-loader.js.map +1 -1
  149. package/dist/esm/wms-error-loader.js +1 -4
  150. package/dist/esm/wms-error-loader.js.map +1 -1
  151. package/dist/index.d.ts +0 -3
  152. package/dist/index.d.ts.map +1 -1
  153. package/dist/index.js +3 -5
  154. package/dist/lib/parsers/wms/parse-wms-capabilities.d.ts +78 -62
  155. package/dist/lib/parsers/wms/parse-wms-capabilities.d.ts.map +1 -1
  156. package/dist/lib/parsers/wms/parse-wms-capabilities.js +165 -1935
  157. package/dist/lib/parsers/xml/parse-xml-helpers.d.ts +11 -0
  158. package/dist/lib/parsers/xml/parse-xml-helpers.d.ts.map +1 -0
  159. package/dist/lib/parsers/xml/parse-xml-helpers.js +68 -0
  160. package/dist/lib/services/arcgis/arcgis-image-service.js +1 -1
  161. package/dist/lib/services/generic/image-service.js +1 -1
  162. package/dist/lib/services/ogc/csw-service.d.ts +1 -1
  163. package/dist/lib/services/ogc/csw-service.d.ts.map +1 -1
  164. package/dist/lib/services/ogc/csw-service.js +1 -1
  165. package/dist/lib/services/ogc/wms-service.d.ts +63 -58
  166. package/dist/lib/services/ogc/wms-service.d.ts.map +1 -1
  167. package/dist/lib/services/ogc/wms-service.js +106 -71
  168. package/dist/lib/sources/image-source.d.ts +3 -9
  169. package/dist/lib/sources/image-source.d.ts.map +1 -1
  170. package/dist/wip/wmts-capabilities-loader.d.ts +3 -4
  171. package/dist/wip/wmts-capabilities-loader.d.ts.map +1 -1
  172. package/dist/wip/wmts-capabilities-loader.js +1 -0
  173. package/dist/wms-capabilities-loader.d.ts +6 -1
  174. package/dist/wms-capabilities-loader.d.ts.map +1 -1
  175. package/dist/wms-capabilities-loader.js +2 -2
  176. package/package.json +6 -6
  177. package/src/index.ts +3 -4
  178. package/src/lib/parsers/wms/parse-wms-capabilities.ts +293 -2004
  179. package/src/lib/parsers/xml/parse-xml-helpers.ts +65 -0
  180. package/src/lib/services/ogc/csw-service.ts +1 -1
  181. package/src/lib/services/ogc/wms-service.ts +169 -109
  182. package/src/lib/sources/image-source.ts +3 -9
  183. package/src/wip/wmts-capabilities-loader.ts +2 -2
  184. package/src/wms-capabilities-loader.ts +9 -3
@@ -0,0 +1,65 @@
1
+ // loaders.gl, MIT license
2
+
3
+ /** A single element of an array is not represented as an array in XML */
4
+ export function getXMLArray(xmlValue: any): any[] {
5
+ // Already an array, return as is
6
+ if (Array.isArray(xmlValue)) {
7
+ return xmlValue;
8
+ }
9
+ // Single value, wrap in array
10
+ if (xmlValue) {
11
+ return [xmlValue];
12
+ }
13
+ // nullish, return empty array
14
+ return [];
15
+ }
16
+
17
+ /** Get a list of strings from XML */
18
+ export function getXMLStringArray(xmlValue: any): string[] {
19
+ const xmlArray = getXMLArray(xmlValue);
20
+ if (xmlArray.length > 0 && xmlArray.every((_) => typeof _ === 'string')) {
21
+ return xmlArray as string[];
22
+ }
23
+ // TODO - error handling?
24
+ return [];
25
+ }
26
+
27
+ /** Get XML float */
28
+ export function getXMLFloat(xmlValue: any, defaultValue = undefined): number | undefined {
29
+ switch (typeof xmlValue) {
30
+ case 'number':
31
+ return xmlValue;
32
+ case 'string':
33
+ return parseFloat(xmlValue);
34
+ default:
35
+ return undefined;
36
+ }
37
+ }
38
+
39
+ /** Get XML integer */
40
+ export function getXMLInteger(xmlValue: any, defaultValue = undefined): number | undefined {
41
+ switch (typeof xmlValue) {
42
+ case 'number':
43
+ return xmlValue;
44
+ case 'string':
45
+ return parseInt(xmlValue, 10);
46
+ default:
47
+ return undefined;
48
+ }
49
+ }
50
+
51
+ /** Somewhat arbitrary boolean parsing */
52
+ export function getXMLBoolean(xmlValue: any): boolean {
53
+ switch (xmlValue) {
54
+ case 'true':
55
+ return true;
56
+ case 'false':
57
+ return false;
58
+ case '1':
59
+ return true;
60
+ case '0':
61
+ return false;
62
+ default:
63
+ return false;
64
+ }
65
+ }
@@ -79,7 +79,7 @@ export class CSWService extends DataSource {
79
79
  return capabilities;
80
80
  }
81
81
 
82
- async getServiceDirectory(options: {includeUnknown?: boolean}): Promise<Service[]> {
82
+ async getServiceDirectory(options?: {includeUnknown?: boolean}): Promise<Service[]> {
83
83
  const services: Service[] = [];
84
84
  const unknownServices: Service[] = [];
85
85
 
@@ -21,42 +21,57 @@ import {WMSLayerDescriptionLoader} from '../../../wip/wms-layer-description-load
21
21
  import type {WMSLoaderOptions} from '../../../wms-error-loader';
22
22
  import {WMSErrorLoader} from '../../../wms-error-loader';
23
23
 
24
+ /** Static WMS parameters (not viewport or selected pixel dependent) that can be provided as defaults */
25
+ export type WMSParameters = {
26
+ /** WMS version */
27
+ version?: '1.3.0' | '1.1.1';
28
+ /** Layers to render */
29
+ layers?: string[];
30
+ /** Coordinate Reference System (CRS) for the image (not the bounding box) */
31
+ crs?: string;
32
+ /** Requested format for the return image */
33
+ format?: 'image/png';
34
+ /** Requested MIME type of returned feature info */
35
+ info_format?: 'text/plain' | 'application/geojson' | 'application/vnd.ogc.gml';
36
+ /** Styling - Not yet supported */
37
+ styles?: unknown;
38
+ /** Any additional parameters specific to this WMSService */
39
+ transparent?: boolean;
40
+ };
41
+
24
42
  type WMSCommonParameters = {
25
- /** In case the endpoint supports multiple services */
26
- service?: 'WMS';
27
43
  /** In case the endpoint supports multiple WMS versions */
28
- version?: '1.1.1' | '1.3.0';
44
+ version?: '1.3.0' | '1.1.1';
29
45
  };
30
46
 
31
- export type WMSGetCapabilitiesParameters = WMSCommonParameters & {
32
- /** Request type */
33
- request?: 'GetCapabilities';
34
- };
47
+ /** Parameters for GetCapabilities */
48
+ export type WMSGetCapabilitiesParameters = WMSCommonParameters;
35
49
 
50
+ /** Parameters for GetMap */
36
51
  export type WMSGetMapParameters = WMSCommonParameters & {
37
- /** Request type */
38
- request?: 'GetMap';
39
52
  /** Layers to render */
40
53
  layers: string | string[];
41
- /** Styling */
42
- styles?: unknown;
43
54
  /** bounding box of the requested map image */
44
55
  bbox: [number, number, number, number];
45
56
  /** pixel width of returned image */
46
57
  width: number;
47
58
  /** pixels */
48
59
  height: number;
49
- /** srs for the image (not the bounding box) */
50
- srs?: string;
60
+ /** Coordinate Reference System for the image (not the bounding box). */
61
+ crs?: string;
62
+ /** Styling */
63
+ styles?: unknown;
64
+ /** Don't render background when no data */
65
+ transparent?: boolean;
51
66
  /** requested format for the return image */
52
67
  format?: 'image/png';
53
68
  };
54
69
 
55
- // https://imagery.pasda.psu.edu/arcgis/services/pasda/UrbanTreeCanopy_Landcover/MapServer/WmsServer?SERVICE=WMS&
70
+ /**
71
+ * Parameters for GetFeatureInfo
72
+ * @see https://imagery.pasda.psu.edu/arcgis/services/pasda/UrbanTreeCanopy_Landcover/MapServer/WmsServer?SERVICE=WMS&
73
+ */
56
74
  export type WMSGetFeatureInfoParameters = WMSCommonParameters & {
57
- /** Request type */
58
- request?: 'GetFeatureInfo';
59
-
60
75
  /** x coordinate for the feature info request */
61
76
  x: number;
62
77
  /** y coordinate for the feature info request */
@@ -64,7 +79,7 @@ export type WMSGetFeatureInfoParameters = WMSCommonParameters & {
64
79
  /** list of layers to query (could be different from rendered layers) */
65
80
  query_layers: string[];
66
81
  /** Requested MIME type of returned feature info */
67
- info_format?: 'text/plain' | 'application/vnd.ogc.gml';
82
+ info_format?: 'text/plain' | 'application/geojson' | 'application/vnd.ogc.gml';
68
83
 
69
84
  /** Layers to render */
70
85
  layers: string[];
@@ -82,32 +97,22 @@ export type WMSGetFeatureInfoParameters = WMSCommonParameters & {
82
97
  format?: 'image/png';
83
98
  };
84
99
 
85
- export type WMSDescribeLayerParameters = WMSCommonParameters & {
86
- /** Request type */
87
- request?: 'DescribeLayer';
88
- };
100
+ /** Parameters for DescribeLayer */
101
+ export type WMSDescribeLayerParameters = WMSCommonParameters;
89
102
 
90
- export type WMSGetLegendGraphicParameters = WMSCommonParameters & {
91
- /** Request type */
92
- request?: 'GetLegendGraphic';
93
- };
103
+ /** Parameters for GetLegendGraphic */
104
+ export type WMSGetLegendGraphicParameters = WMSCommonParameters;
105
+
106
+ //
94
107
 
95
- /** Properties for initializing a WMS service */
108
+ /** Properties for creating a enw WMS service */
96
109
  export type WMSServiceProps = ImageSourceProps & {
97
110
  /** Base URL to the service */
98
111
  url: string;
99
- /** WMS version */
100
- version?: '1.1.1' | '1.3.0';
101
- /** Layers to render */
102
- layers?: string[];
103
- /** SRS for the image (not the bounding box) */
104
- srs?: string;
105
- /** Requested format for the return image */
106
- format?: 'image/png';
107
- /** Requested MIME type of returned feature info */
108
- info_format?: 'text/plain' | 'application/vnd.ogc.gml';
109
- /** Styling */
110
- styles?: unknown;
112
+ /** Default WMS parameters. If not provided here, must be provided in the various request */
113
+ wmsParameters?: WMSParameters;
114
+ /** Any additional service specific parameters */
115
+ vendorParameters?: Record<string, unknown>;
111
116
  };
112
117
 
113
118
  /**
@@ -121,7 +126,12 @@ export class WMSService extends ImageSource {
121
126
  static type: 'wms' = 'wms';
122
127
  static testURL = (url: string): boolean => url.toLowerCase().includes('wms');
123
128
 
124
- props: Required<WMSServiceProps>;
129
+ readonly url: string;
130
+ /** Default static WMS parameters */
131
+ wmsParameters: Required<WMSParameters>;
132
+ /** Default static vendor parameters */
133
+ vendorParameters?: Record<string, unknown>;
134
+
125
135
  capabilities: WMSCapabilities | null = null;
126
136
 
127
137
  /** A list of loaders used by the WMSService methods */
@@ -139,17 +149,22 @@ export class WMSService extends ImageSource {
139
149
 
140
150
  // TODO - defaults such as version, layers etc could be extracted from a base URL with parameters
141
151
  // This would make pasting in any WMS URL more likely to make this class just work.
152
+ // const {baseUrl, parameters} = this._parseWMSUrl(props.url);
153
+
154
+ this.url = props.url;
142
155
 
143
- this.props = {
144
- loadOptions: undefined!,
156
+ this.wmsParameters = {
145
157
  layers: undefined!,
146
158
  styles: undefined,
147
- version: '1.1.1',
148
- srs: 'EPSG:4326',
159
+ version: '1.3.0',
160
+ crs: 'EPSG:4326',
149
161
  format: 'image/png',
150
162
  info_format: 'text/plain',
151
- ...props
163
+ transparent: undefined!,
164
+ ...props.wmsParameters
152
165
  };
166
+
167
+ this.vendorParameters = props.vendorParameters || {};
153
168
  }
154
169
 
155
170
  // ImageSource implementation
@@ -159,7 +174,10 @@ export class WMSService extends ImageSource {
159
174
  }
160
175
 
161
176
  async getImage(parameters: GetImageParameters): Promise<ImageType> {
162
- return await this.getMap(parameters);
177
+ // WMS 1.3.0 renamed SRS to CRS (sigh...)
178
+ const wmsParameters = {...parameters, crs: parameters.srs};
179
+ delete wmsParameters.srs;
180
+ return await this.getMap(wmsParameters);
163
181
  }
164
182
 
165
183
  normalizeMetadata(capabilities: WMSCapabilities): ImageSourceMetadata {
@@ -177,22 +195,22 @@ export class WMSService extends ImageSource {
177
195
  const response = await this.fetch(url);
178
196
  const arrayBuffer = await response.arrayBuffer();
179
197
  this._checkResponse(response, arrayBuffer);
180
- const capabilities = await WMSCapabilitiesLoader.parse(arrayBuffer, this.props.loadOptions);
198
+ const capabilities = await WMSCapabilitiesLoader.parse(arrayBuffer, this.loadOptions);
181
199
  this.capabilities = capabilities;
182
200
  return capabilities;
183
201
  }
184
202
 
185
203
  /** Get a map image */
186
204
  async getMap(
187
- options: WMSGetMapParameters,
205
+ wmsParameters: WMSGetMapParameters,
188
206
  vendorParameters?: Record<string, unknown>
189
207
  ): Promise<ImageType> {
190
- const url = this.getMapURL(options, vendorParameters);
208
+ const url = this.getMapURL(wmsParameters, vendorParameters);
191
209
  const response = await this.fetch(url);
192
210
  const arrayBuffer = await response.arrayBuffer();
193
211
  this._checkResponse(response, arrayBuffer);
194
212
  try {
195
- return await ImageLoader.parse(arrayBuffer, this.props.loadOptions);
213
+ return await ImageLoader.parse(arrayBuffer, this.loadOptions);
196
214
  } catch {
197
215
  throw this._parseError(arrayBuffer);
198
216
  }
@@ -200,22 +218,22 @@ export class WMSService extends ImageSource {
200
218
 
201
219
  /** Get Feature Info for a coordinate */
202
220
  async getFeatureInfo(
203
- options: WMSGetFeatureInfoParameters,
221
+ wmsParameters: WMSGetFeatureInfoParameters,
204
222
  vendorParameters?: Record<string, unknown>
205
223
  ): Promise<WMSFeatureInfo> {
206
- const url = this.getFeatureInfoURL(options, vendorParameters);
224
+ const url = this.getFeatureInfoURL(wmsParameters, vendorParameters);
207
225
  const response = await this.fetch(url);
208
226
  const arrayBuffer = await response.arrayBuffer();
209
227
  this._checkResponse(response, arrayBuffer);
210
- return await WMSFeatureInfoLoader.parse(arrayBuffer, this.props.loadOptions);
228
+ return await WMSFeatureInfoLoader.parse(arrayBuffer, this.loadOptions);
211
229
  }
212
230
 
213
231
  /** Get Feature Info for a coordinate */
214
232
  async getFeatureInfoText(
215
- options: WMSGetFeatureInfoParameters,
233
+ wmsParameters: WMSGetFeatureInfoParameters,
216
234
  vendorParameters?: Record<string, unknown>
217
235
  ): Promise<string> {
218
- const url = this.getFeatureInfoURL(options, vendorParameters);
236
+ const url = this.getFeatureInfoURL(wmsParameters, vendorParameters);
219
237
  const response = await this.fetch(url);
220
238
  const arrayBuffer = await response.arrayBuffer();
221
239
  this._checkResponse(response, arrayBuffer);
@@ -224,27 +242,27 @@ export class WMSService extends ImageSource {
224
242
 
225
243
  /** Get more information about a layer */
226
244
  async describeLayer(
227
- options: WMSDescribeLayerParameters,
245
+ wmsParameters: WMSDescribeLayerParameters,
228
246
  vendorParameters?: Record<string, unknown>
229
247
  ): Promise<WMSLayerDescription> {
230
- const url = this.describeLayerURL(options, vendorParameters);
248
+ const url = this.describeLayerURL(wmsParameters, vendorParameters);
231
249
  const response = await this.fetch(url);
232
250
  const arrayBuffer = await response.arrayBuffer();
233
251
  this._checkResponse(response, arrayBuffer);
234
- return await WMSLayerDescriptionLoader.parse(arrayBuffer, this.props.loadOptions);
252
+ return await WMSLayerDescriptionLoader.parse(arrayBuffer, this.loadOptions);
235
253
  }
236
254
 
237
255
  /** Get an image with a semantic legend */
238
256
  async getLegendGraphic(
239
- options: WMSGetLegendGraphicParameters,
257
+ wmsParameters: WMSGetLegendGraphicParameters,
240
258
  vendorParameters?: Record<string, unknown>
241
259
  ): Promise<ImageType> {
242
- const url = this.getLegendGraphicURL(options, vendorParameters);
260
+ const url = this.getLegendGraphicURL(wmsParameters, vendorParameters);
243
261
  const response = await this.fetch(url);
244
262
  const arrayBuffer = await response.arrayBuffer();
245
263
  this._checkResponse(response, arrayBuffer);
246
264
  try {
247
- return await ImageLoader.parse(arrayBuffer, this.props.loadOptions);
265
+ return await ImageLoader.parse(arrayBuffer, this.loadOptions);
248
266
  } catch {
249
267
  throw this._parseError(arrayBuffer);
250
268
  }
@@ -259,13 +277,10 @@ export class WMSService extends ImageSource {
259
277
  vendorParameters?: Record<string, unknown>
260
278
  ): string {
261
279
  const options: Required<WMSGetCapabilitiesParameters> = {
262
- service: 'WMS',
263
- version: this.props.version,
264
- request: 'GetCapabilities',
265
- ...wmsParameters,
266
- ...vendorParameters
280
+ version: this.wmsParameters.version,
281
+ ...wmsParameters
267
282
  };
268
- return this._getWMSUrl(options, vendorParameters);
283
+ return this._getWMSUrl('GetCapabilities', options, vendorParameters);
269
284
  }
270
285
 
271
286
  /** Generate a URL for the GetMap request */
@@ -274,20 +289,18 @@ export class WMSService extends ImageSource {
274
289
  vendorParameters?: Record<string, unknown>
275
290
  ): string {
276
291
  const options: Required<WMSGetMapParameters> = {
277
- service: 'WMS',
278
- version: this.props.version,
279
- request: 'GetMap',
292
+ version: this.wmsParameters.version,
280
293
  // layers: [],
281
294
  // bbox: [-77.87304, 40.78975, -77.85828, 40.80228],
282
295
  // width: 1200,
283
296
  // height: 900,
284
- styles: this.props.styles,
285
- srs: this.props.srs,
286
- format: this.props.format,
287
- ...wmsParameters,
288
- ...vendorParameters
297
+ styles: this.wmsParameters.styles,
298
+ crs: this.wmsParameters.crs,
299
+ format: this.wmsParameters.format,
300
+ transparent: this.wmsParameters.transparent,
301
+ ...wmsParameters
289
302
  };
290
- return this._getWMSUrl(options, vendorParameters);
303
+ return this._getWMSUrl('GetMap', options, vendorParameters);
291
304
  }
292
305
 
293
306
  /** Generate a URL for the GetFeatureInfo request */
@@ -296,9 +309,7 @@ export class WMSService extends ImageSource {
296
309
  vendorParameters?: Record<string, unknown>
297
310
  ): string {
298
311
  const options: Required<WMSGetFeatureInfoParameters> = {
299
- service: 'WMS',
300
- version: this.props.version,
301
- request: 'GetFeatureInfo',
312
+ version: this.wmsParameters.version,
302
313
  // layers: this.props.layers,
303
314
  // bbox: [-77.87304, 40.78975, -77.85828, 40.80228],
304
315
  // width: 1200,
@@ -306,14 +317,13 @@ export class WMSService extends ImageSource {
306
317
  // x: undefined!,
307
318
  // y: undefined!,
308
319
  // query_layers: [],
309
- srs: this.props.srs,
310
- format: this.props.format,
311
- info_format: this.props.info_format,
312
- styles: this.props.styles,
313
- ...wmsParameters,
314
- ...vendorParameters
320
+ srs: this.wmsParameters.crs,
321
+ format: this.wmsParameters.format,
322
+ info_format: this.wmsParameters.info_format,
323
+ styles: this.wmsParameters.styles,
324
+ ...wmsParameters
315
325
  };
316
- return this._getWMSUrl(options, vendorParameters);
326
+ return this._getWMSUrl('GetFeatureInfo', options, vendorParameters);
317
327
  }
318
328
 
319
329
  /** Generate a URL for the GetFeatureInfo request */
@@ -322,13 +332,10 @@ export class WMSService extends ImageSource {
322
332
  vendorParameters?: Record<string, unknown>
323
333
  ): string {
324
334
  const options: Required<WMSDescribeLayerParameters> = {
325
- service: 'WMS',
326
- version: this.props.version,
327
- request: 'DescribeLayer',
328
- ...wmsParameters,
329
- ...vendorParameters
335
+ version: this.wmsParameters.version,
336
+ ...wmsParameters
330
337
  };
331
- return this._getWMSUrl(options, vendorParameters);
338
+ return this._getWMSUrl('DescribeLayer', options, vendorParameters);
332
339
  }
333
340
 
334
341
  getLegendGraphicURL(
@@ -336,45 +343,98 @@ export class WMSService extends ImageSource {
336
343
  vendorParameters?: Record<string, unknown>
337
344
  ): string {
338
345
  const options: Required<WMSGetLegendGraphicParameters> = {
339
- service: 'WMS',
340
- version: this.props.version,
341
- request: 'GetLegendGraphic',
346
+ version: this.wmsParameters.version,
342
347
  // format?
343
- ...wmsParameters,
344
- ...vendorParameters
348
+ ...wmsParameters
345
349
  };
346
- return this._getWMSUrl(options, vendorParameters);
350
+ return this._getWMSUrl('GetLegendGraphic', options, vendorParameters);
347
351
  }
348
352
 
349
353
  // INTERNAL METHODS
350
354
 
355
+ _parseWMSUrl(url: string): {url: string; parameters: Record<string, unknown>} {
356
+ const [baseUrl, search] = url.split('?');
357
+ const searchParams = search.split('&');
358
+
359
+ const parameters: Record<string, unknown> = {};
360
+ for (const parameter of searchParams) {
361
+ const [key, value] = parameter.split('=');
362
+ parameters[key] = value;
363
+ }
364
+
365
+ return {url: baseUrl, parameters};
366
+ }
367
+
351
368
  /**
369
+ * Generate a URL with parameters
352
370
  * @note case _getWMSUrl may need to be overridden to handle certain backends?
371
+ * @note at the moment, only URLs with parameters are supported (no XML payloads)
353
372
  * */
354
373
  protected _getWMSUrl(
355
- options: Record<string, unknown>,
374
+ request: string,
375
+ wmsParameters: WMSCommonParameters & {[key: string]: unknown},
356
376
  vendorParameters?: Record<string, unknown>
357
377
  ): string {
358
- let url = this.props.url;
378
+ let url = this.url;
359
379
  let first = true;
360
- for (const [key, value] of Object.entries(options)) {
361
- url += first ? '?' : '&';
362
- first = false;
363
- if (Array.isArray(value)) {
364
- url += `${key.toUpperCase()}=${value.join(',')}`;
365
- } else {
366
- url += `${key.toUpperCase()}=${value ? String(value) : ''}`;
380
+
381
+ // Add any vendor searchParams
382
+ const allParameters = {
383
+ service: 'WMS',
384
+ version: wmsParameters.version,
385
+ request,
386
+ ...wmsParameters,
387
+ ...this.vendorParameters,
388
+ ...vendorParameters
389
+ };
390
+
391
+ // Encode the keys
392
+ for (const [key, value] of Object.entries(allParameters)) {
393
+ // hack to preserve test cases. Not super clear if keys should be included when values are undefined
394
+ if (key !== 'transparent' || value) {
395
+ url += first ? '?' : '&';
396
+ first = false;
397
+ url += this._getParameterValue(wmsParameters.version!, key, value);
367
398
  }
368
399
  }
400
+
369
401
  return encodeURI(url);
370
402
  }
371
403
 
404
+ _getParameterValue(version: string, key: string, value: unknown): string {
405
+ // SRS parameter changed to CRS in 1.3.0, in non-backwards compatible way (sigh...)
406
+ if (key === 'crs' && version !== '1.3.0') {
407
+ key = 'srs';
408
+ }
409
+
410
+ key = key.toUpperCase();
411
+
412
+ // TODO - in v1.3.0 only, the order of parameters for BBOX depends on whether the CRS definition has flipped axes
413
+ // You will see this in the GetCapabilities request at 1.3.0 - the response should show the flipped axes.
414
+ // BBOX=xmin,ymin,xmax,ymax NON-FLIPPED
415
+ // BBOX=ymin,xmin,ymax,xmax FLIPPED
416
+ // / EPSG:4326 needs to have flipped axes. 4326 1 WGS 84 Latitude North Longitude East
417
+ // In WMS 1.1.1 EPSG:4326 is wrongly defined as having long/lat coordinate axes. In WMS 1.3.0 the correct axes lat/long are used. CRS:84 is defined by OGC as having the same datum as EPSG:4326 (that is the World Geodetic System 1984 datum ~ EPSG::6326) but axis order of long/lat.
418
+ // CRS:84 was introduced with the publication of the WMS 1.3.0 specification, to overcome this issue.
419
+
420
+ return Array.isArray(value)
421
+ ? `${key}=${value.join(',')}`
422
+ : `${key}=${value ? String(value) : ''}`;
423
+ }
424
+
425
+ protected async _fetchArrayBuffer(url: string): Promise<ArrayBuffer> {
426
+ const response = await this.fetch(url);
427
+ const arrayBuffer = await response.arrayBuffer();
428
+ this._checkResponse(response, arrayBuffer);
429
+ return arrayBuffer;
430
+ }
431
+
372
432
  /** Checks for and parses a WMS XML formatted ServiceError and throws an exception */
373
433
  protected _checkResponse(response: Response, arrayBuffer: ArrayBuffer): void {
374
434
  const contentType = response.headers['content-type'];
375
435
  if (!response.ok || WMSErrorLoader.mimeTypes.includes(contentType)) {
376
436
  // We want error responses to throw exceptions, the WMSErrorLoader can do this
377
- const loadOptions = mergeLoaderOptions<WMSLoaderOptions>(this.props.loadOptions, {
437
+ const loadOptions = mergeLoaderOptions<WMSLoaderOptions>(this.loadOptions, {
378
438
  wms: {throwOnError: true}
379
439
  });
380
440
  const error = WMSErrorLoader.parseSync(arrayBuffer, loadOptions);
@@ -384,7 +444,7 @@ export class WMSService extends ImageSource {
384
444
 
385
445
  /** Error situation detected */
386
446
  protected _parseError(arrayBuffer: ArrayBuffer): Error {
387
- const error = WMSErrorLoader.parseSync(arrayBuffer, this.props.loadOptions);
447
+ const error = WMSErrorLoader.parseSync(arrayBuffer, this.loadOptions);
388
448
  return new Error(error);
389
449
  }
390
450
  }
@@ -15,21 +15,15 @@ export type ImageSourceMetadata = {
15
15
  title?: string;
16
16
  abstract?: string;
17
17
  keywords: string[];
18
- layer: {
19
- name: string;
20
- title?: string;
21
- srs?: string[];
22
- boundingBox?: [number, number, number, number];
23
- layers: ImageSourceLayer[];
24
- };
18
+ layers: ImageSourceLayer[];
25
19
  };
26
20
 
27
21
  export type ImageSourceLayer = {
28
- name: string;
22
+ name?: string;
29
23
  title?: string;
30
24
  srs?: string[];
31
25
  boundingBox?: [number, number, number, number];
32
- layers: ImageSourceLayer[];
26
+ layers?: ImageSourceLayer[];
33
27
  };
34
28
 
35
29
  export type GetImageParameters = {
@@ -1,14 +1,14 @@
1
1
  // loaders.gl, MIT license
2
2
 
3
3
  import type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';
4
- import {WMTSCapabilities} from './lib/wmts/parse-wmts-capabilities';
4
+ // import type {WMTSCapabilities} from './lib/wmts/parse-wmts-capabilities';
5
5
  import {parseWMTSCapabilities} from './lib/wmts/parse-wmts-capabilities';
6
6
 
7
7
  // __VERSION__ is injected by babel-plugin-version-inline
8
8
  // @ts-ignore TS2304: Cannot find name '__VERSION__'.
9
9
  const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';
10
10
 
11
- export {WMTSCapabilities};
11
+ // export type {WMTSCapabilities};
12
12
 
13
13
  export type WMTSLoaderOptions = LoaderOptions & {
14
14
  wmts?: {};
@@ -12,7 +12,12 @@ const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';
12
12
  export type {WMSCapabilities};
13
13
 
14
14
  export type WMSLoaderOptions = LoaderOptions & {
15
- wms?: {};
15
+ wms?: {
16
+ /** Add inherited layer information to sub layers */
17
+ inheritedLayerProps?: boolean;
18
+ /** Whether to include "raw" XML-derived JSON */
19
+ raw?: boolean;
20
+ };
16
21
  };
17
22
 
18
23
  /**
@@ -32,8 +37,9 @@ export const WMSCapabilitiesLoader = {
32
37
  wms: {}
33
38
  },
34
39
  parse: async (arrayBuffer: ArrayBuffer, options?: WMSLoaderOptions) =>
35
- parseWMSCapabilities(new TextDecoder().decode(arrayBuffer), options),
36
- parseTextSync: (text: string, options?: WMSLoaderOptions) => parseWMSCapabilities(text, options)
40
+ parseWMSCapabilities(new TextDecoder().decode(arrayBuffer), options?.wms),
41
+ parseTextSync: (text: string, options?: WMSLoaderOptions) =>
42
+ parseWMSCapabilities(text, options?.wms)
37
43
  };
38
44
 
39
45
  function testXMLFile(text: string): boolean {