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

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 (208) hide show
  1. package/dist/dist.min.js +412 -176
  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 +36 -60
  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 +28 -42
  42. package/dist/es5/lib/services/generic/image-service.js.map +1 -1
  43. package/dist/es5/lib/services/ogc/csw-service.js +161 -188
  44. package/dist/es5/lib/services/ogc/csw-service.js.map +1 -1
  45. package/dist/es5/lib/services/ogc/wms-service.js +325 -245
  46. package/dist/es5/lib/services/ogc/wms-service.js.map +1 -1
  47. package/dist/es5/lib/sources/data-source.js +36 -13
  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 -11
  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 -7
  116. package/dist/esm/lib/services/generic/image-service.js.map +1 -1
  117. package/dist/esm/lib/services/ogc/csw-service.js +0 -13
  118. package/dist/esm/lib/services/ogc/csw-service.js.map +1 -1
  119. package/dist/esm/lib/services/ogc/wms-service.js +135 -86
  120. package/dist/esm/lib/services/ogc/wms-service.js.map +1 -1
  121. package/dist/esm/lib/sources/data-source.js +20 -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/create-image-source.d.ts +1 -1
  155. package/dist/lib/create-image-source.d.ts.map +1 -1
  156. package/dist/lib/parsers/wms/parse-wms-capabilities.d.ts +78 -62
  157. package/dist/lib/parsers/wms/parse-wms-capabilities.d.ts.map +1 -1
  158. package/dist/lib/parsers/wms/parse-wms-capabilities.js +166 -1935
  159. package/dist/lib/parsers/xml/parse-xml-helpers.d.ts +11 -0
  160. package/dist/lib/parsers/xml/parse-xml-helpers.d.ts.map +1 -0
  161. package/dist/lib/parsers/xml/parse-xml-helpers.js +68 -0
  162. package/dist/lib/services/arcgis/arcgis-image-service.d.ts +1 -2
  163. package/dist/lib/services/arcgis/arcgis-image-service.d.ts.map +1 -1
  164. package/dist/lib/services/arcgis/arcgis-image-service.js +1 -2
  165. package/dist/lib/services/generic/image-service.d.ts +2 -3
  166. package/dist/lib/services/generic/image-service.d.ts.map +1 -1
  167. package/dist/lib/services/generic/image-service.js +1 -2
  168. package/dist/lib/services/ogc/csw-service.d.ts +2 -3
  169. package/dist/lib/services/ogc/csw-service.d.ts.map +1 -1
  170. package/dist/lib/services/ogc/csw-service.js +1 -2
  171. package/dist/lib/services/ogc/wms-service.d.ts +128 -72
  172. package/dist/lib/services/ogc/wms-service.d.ts.map +1 -1
  173. package/dist/lib/services/ogc/wms-service.js +154 -73
  174. package/dist/lib/sources/data-source.d.ts +12 -2
  175. package/dist/lib/sources/data-source.d.ts.map +1 -1
  176. package/dist/lib/sources/data-source.js +22 -0
  177. package/dist/lib/sources/image-source.d.ts +9 -15
  178. package/dist/lib/sources/image-source.d.ts.map +1 -1
  179. package/dist/lib/sources/tile-source.d.ts +4 -2
  180. package/dist/lib/sources/tile-source.d.ts.map +1 -1
  181. package/dist/wip/wmts-capabilities-loader.d.ts +3 -4
  182. package/dist/wip/wmts-capabilities-loader.d.ts.map +1 -1
  183. package/dist/wip/wmts-capabilities-loader.js +1 -0
  184. package/dist/wms-capabilities-loader.d.ts +6 -1
  185. package/dist/wms-capabilities-loader.d.ts.map +1 -1
  186. package/dist/wms-capabilities-loader.js +2 -2
  187. package/package.json +6 -6
  188. package/src/index.ts +3 -4
  189. package/src/lib/create-image-source.ts +1 -1
  190. package/src/lib/parsers/wms/parse-wms-capabilities.ts +294 -2004
  191. package/src/lib/parsers/xml/parse-xml-helpers.ts +65 -0
  192. package/src/lib/services/arcgis/arcgis-image-service.ts +1 -4
  193. package/src/lib/services/generic/image-service.ts +2 -5
  194. package/src/lib/services/ogc/csw-service.ts +2 -4
  195. package/src/lib/services/ogc/wms-service.ts +290 -125
  196. package/src/lib/sources/data-source.ts +29 -2
  197. package/src/lib/sources/image-source.ts +9 -15
  198. package/src/lib/sources/tile-source.ts +4 -2
  199. package/src/wip/wmts-capabilities-loader.ts +2 -2
  200. package/src/wms-capabilities-loader.ts +9 -3
  201. package/dist/es5/lib/services/generic/tile-service.js +0 -2
  202. package/dist/es5/lib/services/generic/tile-service.js.map +0 -1
  203. package/dist/esm/lib/services/generic/tile-service.js +0 -2
  204. package/dist/esm/lib/services/generic/tile-service.js.map +0 -1
  205. package/dist/lib/services/generic/tile-service.d.ts +0 -1
  206. package/dist/lib/services/generic/tile-service.d.ts.map +0 -1
  207. package/dist/lib/services/generic/tile-service.js +0 -1
  208. package/src/lib/services/generic/tile-service.ts +0 -0
@@ -1,7 +1,6 @@
1
1
  // loaders.gl, MIT license
2
2
 
3
3
  /* eslint-disable camelcase */
4
-
5
4
  import type {ImageType} from '@loaders.gl/images';
6
5
  import {ImageLoader} from '@loaders.gl/images';
7
6
  import {mergeLoaderOptions} from '@loaders.gl/loader-utils';
@@ -21,53 +20,87 @@ import {WMSLayerDescriptionLoader} from '../../../wip/wms-layer-description-load
21
20
  import type {WMSLoaderOptions} from '../../../wms-error-loader';
22
21
  import {WMSErrorLoader} from '../../../wms-error-loader';
23
22
 
24
- type WMSCommonParameters = {
25
- /** In case the endpoint supports multiple services */
26
- service?: 'WMS';
27
- /** In case the endpoint supports multiple WMS versions */
28
- version?: '1.1.1' | '1.3.0';
23
+ /**
24
+ * "Static" WMS parameters (not viewport or selected pixel dependent)
25
+ * These can be provided as defaults in the WMSService constructor
26
+ */
27
+ export type WMSParameters = {
28
+ /** WMS version (all requests) */
29
+ version?: '1.3.0' | '1.1.1';
30
+ /** Layers to render (GetMap, GetFeatureInfo) */
31
+ layers?: string[];
32
+ /** list of layers to query.. (GetFeatureInfo) */
33
+ query_layers?: string[];
34
+
35
+ /** Coordinate Reference System (CRS) for the image (not the bounding box) */
36
+ crs?: string;
37
+ /** Requested format for the return image (GetMap, GetLegendGraphic) */
38
+ format?: 'image/png';
39
+ /** Requested MIME type of returned feature info (GetFeatureInfo) */
40
+ info_format?: 'text/plain' | 'application/geojson' | 'application/vnd.ogc.gml';
41
+ /** Styling - Not yet supported */
42
+ styles?: unknown;
43
+ /** Any additional parameters specific to this WMSService (GetMap) */
44
+ transparent?: boolean;
29
45
  };
30
46
 
31
- export type WMSGetCapabilitiesParameters = WMSCommonParameters & {
32
- /** Request type */
33
- request?: 'GetCapabilities';
47
+ /** Parameters for GetCapabilities */
48
+ export type WMSGetCapabilitiesParameters = {
49
+ /** In case the endpoint supports multiple WMS versions */
50
+ version?: '1.3.0' | '1.1.1';
34
51
  };
35
52
 
36
- export type WMSGetMapParameters = WMSCommonParameters & {
37
- /** Request type */
38
- request?: 'GetMap';
39
- /** Layers to render */
40
- layers: string | string[];
41
- /** Styling */
42
- styles?: unknown;
53
+ /** Parameters for GetMap */
54
+ export type WMSGetMapParameters = {
55
+ /** In case the endpoint supports multiple WMS versions */
56
+ version?: '1.3.0' | '1.1.1';
43
57
  /** bounding box of the requested map image */
44
58
  bbox: [number, number, number, number];
45
59
  /** pixel width of returned image */
46
60
  width: number;
47
61
  /** pixels */
48
62
  height: number;
49
- /** srs for the image (not the bounding box) */
50
- srs?: string;
51
- /** requested format for the return image */
63
+ /** Layers to render - can be provided in service constructor */
64
+ layers?: string | string[];
65
+ /** Coordinate Reference System for the image (not bounding box). can be provided in service constructor. */
66
+ crs?: string;
67
+ /** Styling. can be provided in service constructor */
68
+ styles?: unknown;
69
+ /** Don't render background when no data. can be provided in service constructor */
70
+ transparent?: boolean;
71
+ /** requested format for the return image. can be provided in service constructor */
52
72
  format?: 'image/png';
53
73
  };
54
74
 
55
- // https://imagery.pasda.psu.edu/arcgis/services/pasda/UrbanTreeCanopy_Landcover/MapServer/WmsServer?SERVICE=WMS&
56
- export type WMSGetFeatureInfoParameters = WMSCommonParameters & {
57
- /** Request type */
58
- request?: 'GetFeatureInfo';
75
+ /** GetMap parameters that are specific to the current view */
76
+ export type WMSGetMapViewParameters = {
77
+ /** pixel width of returned image */
78
+ width: number;
79
+ /** pixels */
80
+ height: number;
81
+ /** bounding box of the requested map image */
82
+ bbox: [number, number, number, number];
83
+ /** Coordinate Reference System for the image (not bounding box). can be provided in service constructor. */
84
+ crs?: string;
85
+ };
59
86
 
87
+ /**
88
+ * Parameters for GetFeatureInfo
89
+ * @see https://imagery.pasda.psu.edu/arcgis/services/pasda/UrbanTreeCanopy_Landcover/MapServer/WmsServer?SERVICE=WMS&
90
+ */
91
+ export type WMSGetFeatureInfoParameters = {
92
+ /** In case the endpoint supports multiple WMS versions */
93
+ version?: '1.3.0' | '1.1.1';
60
94
  /** x coordinate for the feature info request */
61
95
  x: number;
62
96
  /** y coordinate for the feature info request */
63
97
  y: number;
64
- /** list of layers to query (could be different from rendered layers) */
65
- query_layers: string[];
66
- /** Requested MIME type of returned feature info */
67
- info_format?: 'text/plain' | 'application/vnd.ogc.gml';
68
-
69
- /** Layers to render */
70
- layers: string[];
98
+ /** MIME type of returned feature info. Can be specified in service constructor */
99
+ info_format?: 'text/plain' | 'application/geojson' | 'application/vnd.ogc.gml';
100
+ /** list of layers to query. Required but can be specified in service constructor. */
101
+ query_layers?: string[];
102
+ /** Layers to render. Required, but can be specified in service constructor */
103
+ layers?: string[];
71
104
  /** Styling */
72
105
  styles?: unknown;
73
106
  /** bounding box of the requested map image */
@@ -77,37 +110,50 @@ export type WMSGetFeatureInfoParameters = WMSCommonParameters & {
77
110
  /** pixels */
78
111
  height: number;
79
112
  /** srs for the image (not the bounding box) */
80
- srs?: string;
81
- /** requested format for the return image */
82
- format?: 'image/png';
113
+ crs?: string;
83
114
  };
84
115
 
85
- export type WMSDescribeLayerParameters = WMSCommonParameters & {
86
- /** Request type */
87
- request?: 'DescribeLayer';
116
+ /** GetMap parameters that are specific to the current view */
117
+ export type WMSGetFeatureInfoViewParameters = {
118
+ /** x coordinate for the feature info request */
119
+ x: number;
120
+ /** y coordinate for the feature info request */
121
+ y: number;
122
+ /** pixel width of returned image */
123
+ width: number;
124
+ /** pixels */
125
+ height: number;
126
+ /** bounding box of the requested map image */
127
+ bbox: [number, number, number, number];
128
+ /** srs for the image (not the bounding box) */
129
+ crs?: string;
88
130
  };
89
131
 
90
- export type WMSGetLegendGraphicParameters = WMSCommonParameters & {
91
- /** Request type */
92
- request?: 'GetLegendGraphic';
132
+ /** Parameters for DescribeLayer */
133
+ export type WMSDescribeLayerParameters = {
134
+ /** In case the endpoint supports multiple WMS versions */
135
+ version?: '1.3.0' | '1.1.1';
93
136
  };
94
137
 
95
- /** Properties for initializing a WMS service */
138
+ /** Parameters for GetLegendGraphic */
139
+ export type WMSGetLegendGraphicParameters = {
140
+ /** In case the endpoint supports multiple WMS versions */
141
+ version?: '1.3.0' | '1.1.1';
142
+ };
143
+
144
+ //
145
+
146
+ /** Properties for creating a enw WMS service */
96
147
  export type WMSServiceProps = ImageSourceProps & {
97
148
  /** Base URL to the service */
98
149
  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;
150
+ /** In 1.3.0, replaces references to EPSG:4326 with CRS:84 */
151
+ substituteCRS84?: boolean;
152
+
153
+ /** Default WMS parameters. If not provided here, must be provided in the various request */
154
+ wmsParameters?: WMSParameters;
155
+ /** Any additional service specific parameters */
156
+ vendorParameters?: Record<string, unknown>;
111
157
  };
112
158
 
113
159
  /**
@@ -117,11 +163,23 @@ export type WMSServiceProps = ImageSourceProps & {
117
163
  * - implements the ImageService interface
118
164
  * @note Only the URL parameter conversion is supported. XML posts are not supported.
119
165
  */
120
- export class WMSService extends ImageSource {
166
+ export class WMSService extends ImageSource<WMSServiceProps> {
121
167
  static type: 'wms' = 'wms';
122
168
  static testURL = (url: string): boolean => url.toLowerCase().includes('wms');
123
169
 
124
- props: Required<WMSServiceProps>;
170
+ /** Base URL to the service */
171
+ readonly url: string;
172
+
173
+ /** In WMS 1.3.0, replaces references to EPSG:4326 with CRS:84. But not always supported. Default: false */
174
+ substituteCRS84: boolean;
175
+ /** In WMS 1.3.0, flips x,y (lng, lat) coordinates for the supplied coordinate systems. Default: ['ESPG:4326'] */
176
+ flipCRS: string[];
177
+
178
+ /** Default static WMS parameters */
179
+ wmsParameters: Required<WMSParameters>;
180
+ /** Default static vendor parameters */
181
+ vendorParameters?: Record<string, unknown>;
182
+
125
183
  capabilities: WMSCapabilities | null = null;
126
184
 
127
185
  /** A list of loaders used by the WMSService methods */
@@ -139,17 +197,26 @@ export class WMSService extends ImageSource {
139
197
 
140
198
  // TODO - defaults such as version, layers etc could be extracted from a base URL with parameters
141
199
  // This would make pasting in any WMS URL more likely to make this class just work.
200
+ // const {baseUrl, parameters} = this._parseWMSUrl(props.url);
201
+
202
+ this.url = props.url;
203
+
204
+ this.substituteCRS84 = props.substituteCRS84 ?? false;
205
+ this.flipCRS = ['EPSG:4326'];
142
206
 
143
- this.props = {
144
- loadOptions: undefined!,
207
+ this.wmsParameters = {
145
208
  layers: undefined!,
209
+ query_layers: undefined!,
146
210
  styles: undefined,
147
- version: '1.1.1',
148
- srs: 'EPSG:4326',
211
+ version: '1.3.0',
212
+ crs: 'EPSG:4326',
149
213
  format: 'image/png',
150
214
  info_format: 'text/plain',
151
- ...props
215
+ transparent: undefined!,
216
+ ...props.wmsParameters
152
217
  };
218
+
219
+ this.vendorParameters = props.vendorParameters || {};
153
220
  }
154
221
 
155
222
  // ImageSource implementation
@@ -177,22 +244,22 @@ export class WMSService extends ImageSource {
177
244
  const response = await this.fetch(url);
178
245
  const arrayBuffer = await response.arrayBuffer();
179
246
  this._checkResponse(response, arrayBuffer);
180
- const capabilities = await WMSCapabilitiesLoader.parse(arrayBuffer, this.props.loadOptions);
247
+ const capabilities = await WMSCapabilitiesLoader.parse(arrayBuffer, this.loadOptions);
181
248
  this.capabilities = capabilities;
182
249
  return capabilities;
183
250
  }
184
251
 
185
252
  /** Get a map image */
186
253
  async getMap(
187
- options: WMSGetMapParameters,
254
+ wmsParameters: WMSGetMapParameters,
188
255
  vendorParameters?: Record<string, unknown>
189
256
  ): Promise<ImageType> {
190
- const url = this.getMapURL(options, vendorParameters);
257
+ const url = this.getMapURL(wmsParameters, vendorParameters);
191
258
  const response = await this.fetch(url);
192
259
  const arrayBuffer = await response.arrayBuffer();
193
260
  this._checkResponse(response, arrayBuffer);
194
261
  try {
195
- return await ImageLoader.parse(arrayBuffer, this.props.loadOptions);
262
+ return await ImageLoader.parse(arrayBuffer, this.loadOptions);
196
263
  } catch {
197
264
  throw this._parseError(arrayBuffer);
198
265
  }
@@ -200,22 +267,22 @@ export class WMSService extends ImageSource {
200
267
 
201
268
  /** Get Feature Info for a coordinate */
202
269
  async getFeatureInfo(
203
- options: WMSGetFeatureInfoParameters,
270
+ wmsParameters: WMSGetFeatureInfoParameters,
204
271
  vendorParameters?: Record<string, unknown>
205
272
  ): Promise<WMSFeatureInfo> {
206
- const url = this.getFeatureInfoURL(options, vendorParameters);
273
+ const url = this.getFeatureInfoURL(wmsParameters, vendorParameters);
207
274
  const response = await this.fetch(url);
208
275
  const arrayBuffer = await response.arrayBuffer();
209
276
  this._checkResponse(response, arrayBuffer);
210
- return await WMSFeatureInfoLoader.parse(arrayBuffer, this.props.loadOptions);
277
+ return await WMSFeatureInfoLoader.parse(arrayBuffer, this.loadOptions);
211
278
  }
212
279
 
213
280
  /** Get Feature Info for a coordinate */
214
281
  async getFeatureInfoText(
215
- options: WMSGetFeatureInfoParameters,
282
+ wmsParameters: WMSGetFeatureInfoParameters,
216
283
  vendorParameters?: Record<string, unknown>
217
284
  ): Promise<string> {
218
- const url = this.getFeatureInfoURL(options, vendorParameters);
285
+ const url = this.getFeatureInfoURL(wmsParameters, vendorParameters);
219
286
  const response = await this.fetch(url);
220
287
  const arrayBuffer = await response.arrayBuffer();
221
288
  this._checkResponse(response, arrayBuffer);
@@ -224,27 +291,27 @@ export class WMSService extends ImageSource {
224
291
 
225
292
  /** Get more information about a layer */
226
293
  async describeLayer(
227
- options: WMSDescribeLayerParameters,
294
+ wmsParameters: WMSDescribeLayerParameters,
228
295
  vendorParameters?: Record<string, unknown>
229
296
  ): Promise<WMSLayerDescription> {
230
- const url = this.describeLayerURL(options, vendorParameters);
297
+ const url = this.describeLayerURL(wmsParameters, vendorParameters);
231
298
  const response = await this.fetch(url);
232
299
  const arrayBuffer = await response.arrayBuffer();
233
300
  this._checkResponse(response, arrayBuffer);
234
- return await WMSLayerDescriptionLoader.parse(arrayBuffer, this.props.loadOptions);
301
+ return await WMSLayerDescriptionLoader.parse(arrayBuffer, this.loadOptions);
235
302
  }
236
303
 
237
304
  /** Get an image with a semantic legend */
238
305
  async getLegendGraphic(
239
- options: WMSGetLegendGraphicParameters,
306
+ wmsParameters: WMSGetLegendGraphicParameters,
240
307
  vendorParameters?: Record<string, unknown>
241
308
  ): Promise<ImageType> {
242
- const url = this.getLegendGraphicURL(options, vendorParameters);
309
+ const url = this.getLegendGraphicURL(wmsParameters, vendorParameters);
243
310
  const response = await this.fetch(url);
244
311
  const arrayBuffer = await response.arrayBuffer();
245
312
  this._checkResponse(response, arrayBuffer);
246
313
  try {
247
- return await ImageLoader.parse(arrayBuffer, this.props.loadOptions);
314
+ return await ImageLoader.parse(arrayBuffer, this.loadOptions);
248
315
  } catch {
249
316
  throw this._parseError(arrayBuffer);
250
317
  }
@@ -259,13 +326,10 @@ export class WMSService extends ImageSource {
259
326
  vendorParameters?: Record<string, unknown>
260
327
  ): string {
261
328
  const options: Required<WMSGetCapabilitiesParameters> = {
262
- service: 'WMS',
263
- version: this.props.version,
264
- request: 'GetCapabilities',
265
- ...wmsParameters,
266
- ...vendorParameters
329
+ version: this.wmsParameters.version,
330
+ ...wmsParameters
267
331
  };
268
- return this._getWMSUrl(options, vendorParameters);
332
+ return this._getWMSUrl('GetCapabilities', options, vendorParameters);
269
333
  }
270
334
 
271
335
  /** Generate a URL for the GetMap request */
@@ -273,21 +337,20 @@ export class WMSService extends ImageSource {
273
337
  wmsParameters: WMSGetMapParameters,
274
338
  vendorParameters?: Record<string, unknown>
275
339
  ): string {
340
+ wmsParameters = this._getWMS130Parameters(wmsParameters);
276
341
  const options: Required<WMSGetMapParameters> = {
277
- service: 'WMS',
278
- version: this.props.version,
279
- request: 'GetMap',
280
- // layers: [],
342
+ version: this.wmsParameters.version,
343
+ format: this.wmsParameters.format,
344
+ transparent: this.wmsParameters.transparent,
345
+ layers: this.wmsParameters.layers,
346
+ styles: this.wmsParameters.styles,
347
+ crs: this.wmsParameters.crs,
281
348
  // bbox: [-77.87304, 40.78975, -77.85828, 40.80228],
282
349
  // width: 1200,
283
350
  // height: 900,
284
- styles: this.props.styles,
285
- srs: this.props.srs,
286
- format: this.props.format,
287
- ...wmsParameters,
288
- ...vendorParameters
351
+ ...wmsParameters
289
352
  };
290
- return this._getWMSUrl(options, vendorParameters);
353
+ return this._getWMSUrl('GetMap', options, vendorParameters);
291
354
  }
292
355
 
293
356
  /** Generate a URL for the GetFeatureInfo request */
@@ -296,24 +359,22 @@ export class WMSService extends ImageSource {
296
359
  vendorParameters?: Record<string, unknown>
297
360
  ): string {
298
361
  const options: Required<WMSGetFeatureInfoParameters> = {
299
- service: 'WMS',
300
- version: this.props.version,
301
- request: 'GetFeatureInfo',
302
- // layers: this.props.layers,
362
+ version: this.wmsParameters.version,
363
+ // query_layers: [],
364
+ // format: this.wmsParameters.format,
365
+ info_format: this.wmsParameters.info_format,
366
+ layers: this.wmsParameters.layers,
367
+ query_layers: this.wmsParameters.query_layers,
368
+ styles: this.wmsParameters.styles,
369
+ crs: this.wmsParameters.crs,
303
370
  // bbox: [-77.87304, 40.78975, -77.85828, 40.80228],
304
371
  // width: 1200,
305
372
  // height: 900,
306
373
  // x: undefined!,
307
374
  // y: undefined!,
308
- // 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
375
+ ...wmsParameters
315
376
  };
316
- return this._getWMSUrl(options, vendorParameters);
377
+ return this._getWMSUrl('GetFeatureInfo', options, vendorParameters);
317
378
  }
318
379
 
319
380
  /** Generate a URL for the GetFeatureInfo request */
@@ -322,13 +383,10 @@ export class WMSService extends ImageSource {
322
383
  vendorParameters?: Record<string, unknown>
323
384
  ): string {
324
385
  const options: Required<WMSDescribeLayerParameters> = {
325
- service: 'WMS',
326
- version: this.props.version,
327
- request: 'DescribeLayer',
328
- ...wmsParameters,
329
- ...vendorParameters
386
+ version: this.wmsParameters.version,
387
+ ...wmsParameters
330
388
  };
331
- return this._getWMSUrl(options, vendorParameters);
389
+ return this._getWMSUrl('DescribeLayer', options, vendorParameters);
332
390
  }
333
391
 
334
392
  getLegendGraphicURL(
@@ -336,45 +394,152 @@ export class WMSService extends ImageSource {
336
394
  vendorParameters?: Record<string, unknown>
337
395
  ): string {
338
396
  const options: Required<WMSGetLegendGraphicParameters> = {
339
- service: 'WMS',
340
- version: this.props.version,
341
- request: 'GetLegendGraphic',
397
+ version: this.wmsParameters.version,
342
398
  // format?
343
- ...wmsParameters,
344
- ...vendorParameters
399
+ ...wmsParameters
345
400
  };
346
- return this._getWMSUrl(options, vendorParameters);
401
+ return this._getWMSUrl('GetLegendGraphic', options, vendorParameters);
347
402
  }
348
403
 
349
404
  // INTERNAL METHODS
350
405
 
406
+ _parseWMSUrl(url: string): {url: string; parameters: Record<string, unknown>} {
407
+ const [baseUrl, search] = url.split('?');
408
+ const searchParams = search.split('&');
409
+
410
+ const parameters: Record<string, unknown> = {};
411
+ for (const parameter of searchParams) {
412
+ const [key, value] = parameter.split('=');
413
+ parameters[key] = value;
414
+ }
415
+
416
+ return {url: baseUrl, parameters};
417
+ }
418
+
351
419
  /**
420
+ * Generate a URL with parameters
352
421
  * @note case _getWMSUrl may need to be overridden to handle certain backends?
422
+ * @note at the moment, only URLs with parameters are supported (no XML payloads)
353
423
  * */
354
424
  protected _getWMSUrl(
355
- options: Record<string, unknown>,
425
+ request: string,
426
+ wmsParameters: {version?: '1.3.0' | '1.1.1'; [key: string]: unknown},
356
427
  vendorParameters?: Record<string, unknown>
357
428
  ): string {
358
- let url = this.props.url;
429
+ let url = this.url;
359
430
  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) : ''}`;
431
+
432
+ // Add any vendor searchParams
433
+ const allParameters = {
434
+ service: 'WMS',
435
+ version: wmsParameters.version,
436
+ request,
437
+ ...wmsParameters,
438
+ ...this.vendorParameters,
439
+ ...vendorParameters
440
+ };
441
+
442
+ // Encode the keys
443
+ for (const [key, value] of Object.entries(allParameters)) {
444
+ // hack to preserve test cases. Not super clear if keys should be included when values are undefined
445
+ if (key !== 'transparent' || value) {
446
+ url += first ? '?' : '&';
447
+ first = false;
448
+ url += this._getURLParameter(key, value, wmsParameters);
367
449
  }
368
450
  }
451
+
369
452
  return encodeURI(url);
370
453
  }
371
454
 
455
+ _getWMS130Parameters<ParametersT extends {crs?: string; srs?: string}>(
456
+ wmsParameters: ParametersT
457
+ ): ParametersT {
458
+ const newParameters = {...wmsParameters};
459
+ if (newParameters.srs) {
460
+ newParameters.crs = newParameters.crs || newParameters.srs;
461
+ delete newParameters.srs;
462
+ }
463
+ return newParameters;
464
+ }
465
+
466
+ // eslint-disable-complexity
467
+ _getURLParameter(key: string, value: unknown, wmsParameters: WMSParameters): string {
468
+ // Substitute by key
469
+ switch (key) {
470
+ case 'crs':
471
+ // CRS was called SRS before WMS 1.3.0
472
+ if (wmsParameters.version !== '1.3.0') {
473
+ key = 'srs';
474
+ } else if (this.substituteCRS84 && value === 'EPSG:4326') {
475
+ /** In 1.3.0, replaces references to 'EPSG:4326' with the new backwards compatible CRS:84 */
476
+ // Substitute by value
477
+ value = 'CRS:84';
478
+ }
479
+ break;
480
+
481
+ case 'srs':
482
+ // CRS was called SRS before WMS 1.3.0
483
+ if (wmsParameters.version === '1.3.0') {
484
+ key = 'crs';
485
+ }
486
+ break;
487
+
488
+ case 'bbox':
489
+ // Coordinate order is flipped for certain CRS in WMS 1.3.0
490
+ const bbox = this._flipBoundingBox(value, wmsParameters);
491
+ if (bbox) {
492
+ value = bbox;
493
+ }
494
+ break;
495
+
496
+ default:
497
+ // do nothing
498
+ }
499
+
500
+ key = key.toUpperCase();
501
+
502
+ return Array.isArray(value)
503
+ ? `${key}=${value.join(',')}`
504
+ : `${key}=${value ? String(value) : ''}`;
505
+ }
506
+
507
+ /** Coordinate order is flipped for certain CRS in WMS 1.3.0 */
508
+ _flipBoundingBox(
509
+ bboxValue: unknown,
510
+ wmsParameters: WMSParameters
511
+ ): [number, number, number, number] | null {
512
+ // Sanity checks
513
+ if (!Array.isArray(bboxValue) || bboxValue.length !== 4) {
514
+ return null;
515
+ }
516
+
517
+ const flipCoordinates =
518
+ // Only affects WMS 1.3.0
519
+ wmsParameters.version === '1.3.0' &&
520
+ // Flip if we are dealing with a CRS that was flipped in 1.3.0
521
+ this.flipCRS.includes(wmsParameters.crs || '') &&
522
+ // Don't flip if we are subsituting EPSG:4326 with CRS:84
523
+ !(this.substituteCRS84 && wmsParameters.crs === 'EPSG:4326');
524
+
525
+ const bbox = bboxValue as [number, number, number, number];
526
+ return flipCoordinates ? [bbox[1], bbox[0], bbox[3], bbox[2]] : bbox;
527
+ }
528
+
529
+ /** Fetches an array buffer and checks the response (boilerplate reduction) */
530
+ protected async _fetchArrayBuffer(url: string): Promise<ArrayBuffer> {
531
+ const response = await this.fetch(url);
532
+ const arrayBuffer = await response.arrayBuffer();
533
+ this._checkResponse(response, arrayBuffer);
534
+ return arrayBuffer;
535
+ }
536
+
372
537
  /** Checks for and parses a WMS XML formatted ServiceError and throws an exception */
373
538
  protected _checkResponse(response: Response, arrayBuffer: ArrayBuffer): void {
374
539
  const contentType = response.headers['content-type'];
375
540
  if (!response.ok || WMSErrorLoader.mimeTypes.includes(contentType)) {
376
541
  // We want error responses to throw exceptions, the WMSErrorLoader can do this
377
- const loadOptions = mergeLoaderOptions<WMSLoaderOptions>(this.props.loadOptions, {
542
+ const loadOptions = mergeLoaderOptions<WMSLoaderOptions>(this.loadOptions, {
378
543
  wms: {throwOnError: true}
379
544
  });
380
545
  const error = WMSErrorLoader.parseSync(arrayBuffer, loadOptions);
@@ -384,7 +549,7 @@ export class WMSService extends ImageSource {
384
549
 
385
550
  /** Error situation detected */
386
551
  protected _parseError(arrayBuffer: ArrayBuffer): Error {
387
- const error = WMSErrorLoader.parseSync(arrayBuffer, this.props.loadOptions);
552
+ const error = WMSErrorLoader.parseSync(arrayBuffer, this.loadOptions);
388
553
  return new Error(error);
389
554
  }
390
555
  }
@@ -8,16 +8,43 @@ export type DataSourceProps = {
8
8
  };
9
9
 
10
10
  /** base class of all data sources */
11
- export abstract class DataSource {
11
+ export abstract class DataSource<PropsT extends DataSourceProps> {
12
12
  /** A resolved fetch function extracted from loadOptions prop */
13
13
  fetch: (url: string, options?: RequestInit) => Promise<Response>;
14
14
  /** The actual load options, if calling a loaders.gl loader */
15
15
  loadOptions: LoaderOptions;
16
+ _needsRefresh: boolean = true;
16
17
 
17
- constructor(props: DataSourceProps) {
18
+ props: PropsT;
19
+
20
+ constructor(props: PropsT) {
21
+ this.props = {...props};
18
22
  this.loadOptions = {...props.loadOptions};
19
23
  this.fetch = getFetchFunction(this.loadOptions);
20
24
  }
25
+
26
+ setProps(props: PropsT) {
27
+ this.props = Object.assign(this.props, props);
28
+ // TODO - add a shallow compare to avoid setting refresh if no change?
29
+ this.setNeedsRefresh();
30
+ }
31
+
32
+ /** Mark this data source as needing a refresh (redraw) */
33
+ setNeedsRefresh(): void {
34
+ this._needsRefresh = true;
35
+ }
36
+
37
+ /**
38
+ * Does this data source need refreshing?
39
+ * @note The specifics of the refresh mechanism depends on type of data source
40
+ */
41
+ getNeedsRefresh(clear: boolean = true) {
42
+ const needsRefresh = this._needsRefresh;
43
+ if (clear) {
44
+ this._needsRefresh = false;
45
+ }
46
+ return needsRefresh;
47
+ }
21
48
  }
22
49
 
23
50
  /**