@loaders.gl/wms 3.4.0-alpha.1 → 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 (428) hide show
  1. package/dist/csw-capabilities-loader.d.ts +29 -0
  2. package/dist/csw-capabilities-loader.d.ts.map +1 -0
  3. package/dist/csw-capabilities-loader.js +31 -0
  4. package/dist/csw-domain-loader.d.ts +28 -0
  5. package/dist/csw-domain-loader.d.ts.map +1 -0
  6. package/dist/csw-domain-loader.js +31 -0
  7. package/dist/csw-records-loader.d.ts +12 -0
  8. package/dist/csw-records-loader.d.ts.map +1 -0
  9. package/dist/csw-records-loader.js +30 -0
  10. package/dist/dist.min.js +3951 -3986
  11. package/dist/es5/csw-capabilities-loader.js +51 -0
  12. package/dist/es5/csw-capabilities-loader.js.map +1 -0
  13. package/dist/es5/csw-domain-loader.js +51 -0
  14. package/dist/es5/csw-domain-loader.js.map +1 -0
  15. package/dist/es5/csw-records-loader.js +49 -0
  16. package/dist/es5/csw-records-loader.js.map +1 -0
  17. package/dist/es5/{wip/gml-loader.js → gml-loader.js} +9 -12
  18. package/dist/es5/gml-loader.js.map +1 -0
  19. package/dist/es5/index.js +39 -11
  20. package/dist/es5/index.js.map +1 -1
  21. package/dist/es5/lerc-loader.js +17 -22
  22. package/dist/es5/lerc-loader.js.map +1 -1
  23. package/dist/es5/lib/{data-sources/create-image-source.js → create-image-source.js} +5 -6
  24. package/dist/es5/lib/create-image-source.js.map +1 -0
  25. package/dist/es5/lib/parsers/csw/parse-csw-capabilities.js +24 -0
  26. package/dist/es5/lib/parsers/csw/parse-csw-capabilities.js.map +1 -0
  27. package/dist/es5/lib/parsers/csw/parse-csw-domain.js +42 -0
  28. package/dist/es5/lib/parsers/csw/parse-csw-domain.js.map +1 -0
  29. package/dist/es5/lib/parsers/csw/parse-csw-records.js +75 -0
  30. package/dist/es5/lib/parsers/csw/parse-csw-records.js.map +1 -0
  31. package/dist/es5/lib/parsers/csw/parse-exception-report.js +16 -0
  32. package/dist/es5/lib/parsers/csw/parse-exception-report.js.map +1 -0
  33. package/dist/es5/lib/{gml → parsers/gml}/deep-strict-equal.js +0 -8
  34. package/dist/es5/lib/parsers/gml/deep-strict-equal.js.map +1 -0
  35. package/dist/es5/lib/{gml → parsers/gml}/parse-gml.js +1 -13
  36. package/dist/es5/lib/parsers/gml/parse-gml.js.map +1 -0
  37. package/dist/es5/lib/parsers/lerc/lerc-types.js.map +1 -0
  38. package/dist/es5/lib/parsers/wms/parse-wms-capabilities.js +237 -0
  39. package/dist/es5/lib/parsers/wms/parse-wms-capabilities.js.map +1 -0
  40. package/dist/es5/lib/parsers/wms/parse-wms-error.js +15 -0
  41. package/dist/es5/lib/parsers/wms/parse-wms-error.js.map +1 -0
  42. package/dist/es5/lib/parsers/wms/parse-wms-features.js +32 -0
  43. package/dist/es5/lib/parsers/wms/parse-wms-features.js.map +1 -0
  44. package/dist/es5/lib/parsers/wms/parse-wms-layer-description.js +12 -0
  45. package/dist/es5/lib/parsers/wms/parse-wms-layer-description.js.map +1 -0
  46. package/dist/es5/lib/parsers/xml/parse-xml-helpers.js +67 -0
  47. package/dist/es5/lib/parsers/xml/parse-xml-helpers.js.map +1 -0
  48. package/dist/es5/lib/{data-sources/image-services → services/arcgis}/arcgis-image-service.js +68 -80
  49. package/dist/es5/lib/services/arcgis/arcgis-image-service.js.map +1 -0
  50. package/dist/es5/lib/services/arcgis/arcgis-server.js +111 -0
  51. package/dist/es5/lib/services/arcgis/arcgis-server.js.map +1 -0
  52. package/dist/es5/lib/{data-sources/adhoc-image-service.js → services/generic/image-service.js} +44 -50
  53. package/dist/es5/lib/services/generic/image-service.js.map +1 -0
  54. package/dist/es5/lib/services/generic/tile-service.js +2 -0
  55. package/dist/es5/lib/services/generic/tile-service.js.map +1 -0
  56. package/dist/es5/lib/services/ogc/csw-service.js +359 -0
  57. package/dist/es5/lib/services/ogc/csw-service.js.map +1 -0
  58. package/dist/es5/lib/services/ogc/wms-service.js +486 -0
  59. package/dist/es5/lib/services/ogc/wms-service.js.map +1 -0
  60. package/dist/es5/lib/services/ogc/wmts-service.ts.disabled +348 -0
  61. package/dist/es5/lib/sources/data-source.js +39 -0
  62. package/dist/es5/lib/sources/data-source.js.map +1 -0
  63. package/dist/es5/lib/sources/image-source.js +26 -0
  64. package/dist/es5/lib/sources/image-source.js.map +1 -0
  65. package/dist/es5/lib/sources/tile-source.js +26 -0
  66. package/dist/es5/lib/sources/tile-source.js.map +1 -0
  67. package/dist/es5/lib/sources/utils/utils.js +36 -0
  68. package/dist/es5/lib/sources/utils/utils.js.map +1 -0
  69. package/dist/es5/wip/arcgis-feature-service.js +2 -7
  70. package/dist/es5/wip/arcgis-feature-service.js.map +1 -1
  71. package/dist/es5/wip/data-source.js +0 -2
  72. package/dist/es5/{lib/wfs/parse-wfs.js → wip/lib/wcs/parse-wcs-capabilities.js} +7 -29
  73. package/dist/es5/wip/lib/wcs/parse-wcs-capabilities.js.map +1 -0
  74. package/dist/es5/{lib/wcs/parse-wcs.js → wip/lib/wfs/parse-wfs-capabilities.js} +7 -28
  75. package/dist/es5/wip/lib/wfs/parse-wfs-capabilities.js.map +1 -0
  76. package/dist/es5/{lib/wmts/parse-wmts.js → wip/lib/wmts/parse-wmts-capabilities.js} +7 -28
  77. package/dist/es5/wip/lib/wmts/parse-wmts-capabilities.js.map +1 -0
  78. package/dist/es5/wip/wcs-capabilities-loader.js +9 -12
  79. package/dist/es5/wip/wcs-capabilities-loader.js.map +1 -1
  80. package/dist/es5/wip/wfs-capabilities-loader.js +9 -12
  81. package/dist/es5/wip/wfs-capabilities-loader.js.map +1 -1
  82. package/dist/es5/wip/wms-feature-info-loader.js +8 -10
  83. package/dist/es5/wip/wms-feature-info-loader.js.map +1 -1
  84. package/dist/es5/wip/wms-layer-description-loader.js +8 -10
  85. package/dist/es5/wip/wms-layer-description-loader.js.map +1 -1
  86. package/dist/es5/wip/wmts-capabilities-loader.js +9 -12
  87. package/dist/es5/wip/wmts-capabilities-loader.js.map +1 -1
  88. package/dist/es5/wms-capabilities-loader.js +9 -12
  89. package/dist/es5/wms-capabilities-loader.js.map +1 -1
  90. package/dist/es5/wms-error-loader.js +9 -11
  91. package/dist/es5/wms-error-loader.js.map +1 -1
  92. package/dist/esm/bundle.js +0 -2
  93. package/dist/esm/bundle.js.map +1 -1
  94. package/dist/esm/csw-capabilities-loader.js +22 -0
  95. package/dist/esm/csw-capabilities-loader.js.map +1 -0
  96. package/dist/esm/csw-domain-loader.js +22 -0
  97. package/dist/esm/csw-domain-loader.js.map +1 -0
  98. package/dist/esm/csw-records-loader.js +21 -0
  99. package/dist/esm/csw-records-loader.js.map +1 -0
  100. package/dist/esm/{wip/gml-loader.js → gml-loader.js} +3 -6
  101. package/dist/esm/gml-loader.js.map +1 -0
  102. package/dist/esm/index.js +11 -14
  103. package/dist/esm/index.js.map +1 -1
  104. package/dist/esm/lerc-loader.js +1 -4
  105. package/dist/esm/lerc-loader.js.map +1 -1
  106. package/dist/esm/lib/{data-sources/create-image-source.js → create-image-source.js} +4 -7
  107. package/dist/esm/lib/create-image-source.js.map +1 -0
  108. package/dist/esm/lib/parsers/csw/parse-csw-capabilities.js +16 -0
  109. package/dist/esm/lib/parsers/csw/parse-csw-capabilities.js.map +1 -0
  110. package/dist/esm/lib/parsers/csw/parse-csw-domain.js +22 -0
  111. package/dist/esm/lib/parsers/csw/parse-csw-domain.js.map +1 -0
  112. package/dist/esm/lib/parsers/csw/parse-csw-records.js +43 -0
  113. package/dist/esm/lib/parsers/csw/parse-csw-records.js.map +1 -0
  114. package/dist/esm/lib/parsers/csw/parse-exception-report.js +10 -0
  115. package/dist/esm/lib/parsers/csw/parse-exception-report.js.map +1 -0
  116. package/dist/esm/lib/{gml → parsers/gml}/deep-strict-equal.js +0 -9
  117. package/dist/esm/lib/parsers/gml/deep-strict-equal.js.map +1 -0
  118. package/dist/esm/lib/{gml → parsers/gml}/parse-gml.js +0 -14
  119. package/dist/esm/lib/parsers/gml/parse-gml.js.map +1 -0
  120. package/dist/esm/lib/parsers/lerc/lerc-types.js.map +1 -0
  121. package/dist/esm/lib/parsers/wms/parse-wms-capabilities.js +174 -0
  122. package/dist/esm/lib/parsers/wms/parse-wms-capabilities.js.map +1 -0
  123. package/dist/esm/lib/parsers/wms/parse-wms-error.js +9 -0
  124. package/dist/esm/lib/parsers/wms/parse-wms-error.js.map +1 -0
  125. package/dist/esm/lib/parsers/wms/parse-wms-features.js +24 -0
  126. package/dist/esm/lib/parsers/wms/parse-wms-features.js.map +1 -0
  127. package/dist/esm/lib/parsers/wms/parse-wms-layer-description.js +6 -0
  128. package/dist/esm/lib/parsers/wms/parse-wms-layer-description.js.map +1 -0
  129. package/dist/esm/lib/parsers/xml/parse-xml-helpers.js +53 -0
  130. package/dist/esm/lib/parsers/xml/parse-xml-helpers.js.map +1 -0
  131. package/dist/esm/lib/services/arcgis/arcgis-image-service.js +58 -0
  132. package/dist/esm/lib/services/arcgis/arcgis-image-service.js.map +1 -0
  133. package/dist/esm/lib/services/arcgis/arcgis-server.js +33 -0
  134. package/dist/esm/lib/services/arcgis/arcgis-server.js.map +1 -0
  135. package/dist/esm/lib/{data-sources/adhoc-image-service.js → services/generic/image-service.js} +11 -13
  136. package/dist/esm/lib/services/generic/image-service.js.map +1 -0
  137. package/dist/esm/lib/services/generic/tile-service.js +2 -0
  138. package/dist/esm/lib/services/generic/tile-service.js.map +1 -0
  139. package/dist/esm/lib/services/ogc/csw-service.js +151 -0
  140. package/dist/esm/lib/services/ogc/csw-service.js.map +1 -0
  141. package/dist/esm/lib/services/ogc/wms-service.js +205 -0
  142. package/dist/esm/lib/services/ogc/wms-service.js.map +1 -0
  143. package/dist/esm/lib/services/ogc/wmts-service.ts.disabled +348 -0
  144. package/dist/esm/lib/sources/data-source.js +23 -0
  145. package/dist/esm/lib/sources/data-source.js.map +1 -0
  146. package/dist/esm/lib/sources/image-source.js +3 -0
  147. package/dist/esm/lib/sources/image-source.js.map +1 -0
  148. package/dist/esm/lib/sources/tile-source.js +3 -0
  149. package/dist/esm/lib/sources/tile-source.js.map +1 -0
  150. package/dist/esm/lib/sources/utils/utils.js +21 -0
  151. package/dist/esm/lib/sources/utils/utils.js.map +1 -0
  152. package/dist/esm/wip/arcgis-feature-service.js +0 -3
  153. package/dist/esm/wip/arcgis-feature-service.js.map +1 -1
  154. package/dist/esm/wip/lib/wcs/parse-wcs-capabilities.js +13 -0
  155. package/dist/esm/wip/lib/wcs/parse-wcs-capabilities.js.map +1 -0
  156. package/dist/esm/wip/lib/wfs/parse-wfs-capabilities.js +14 -0
  157. package/dist/esm/wip/lib/wfs/parse-wfs-capabilities.js.map +1 -0
  158. package/dist/esm/wip/lib/wmts/parse-wmts-capabilities.js +14 -0
  159. package/dist/esm/wip/lib/wmts/parse-wmts-capabilities.js.map +1 -0
  160. package/dist/esm/wip/wcs-capabilities-loader.js +4 -7
  161. package/dist/esm/wip/wcs-capabilities-loader.js.map +1 -1
  162. package/dist/esm/wip/wfs-capabilities-loader.js +2 -5
  163. package/dist/esm/wip/wfs-capabilities-loader.js.map +1 -1
  164. package/dist/esm/wip/wms-feature-info-loader.js +1 -4
  165. package/dist/esm/wip/wms-feature-info-loader.js.map +1 -1
  166. package/dist/esm/wip/wms-layer-description-loader.js +1 -4
  167. package/dist/esm/wip/wms-layer-description-loader.js.map +1 -1
  168. package/dist/esm/wip/wmts-capabilities-loader.js +2 -5
  169. package/dist/esm/wip/wmts-capabilities-loader.js.map +1 -1
  170. package/dist/esm/wms-capabilities-loader.js +4 -7
  171. package/dist/esm/wms-capabilities-loader.js.map +1 -1
  172. package/dist/esm/wms-error-loader.js +2 -5
  173. package/dist/esm/wms-error-loader.js.map +1 -1
  174. package/dist/gml-loader.d.ts.map +1 -0
  175. package/dist/{wip/gml-loader.js → gml-loader.js} +2 -2
  176. package/dist/index.d.ts +24 -18
  177. package/dist/index.d.ts.map +1 -1
  178. package/dist/index.js +28 -18
  179. package/dist/lerc-loader.d.ts +1 -1
  180. package/dist/lerc-loader.d.ts.map +1 -1
  181. package/dist/lib/create-image-source.d.ts +17 -0
  182. package/dist/lib/create-image-source.d.ts.map +1 -0
  183. package/dist/lib/{data-sources/create-image-source.js → create-image-source.js} +5 -5
  184. package/dist/lib/{wmts/wmts-types.d.ts → parsers/csw/parse-csw-capabilities.d.ts} +9 -3
  185. package/dist/lib/parsers/csw/parse-csw-capabilities.d.ts.map +1 -0
  186. package/dist/lib/parsers/csw/parse-csw-capabilities.js +24 -0
  187. package/dist/lib/parsers/csw/parse-csw-domain.d.ts +17 -0
  188. package/dist/lib/parsers/csw/parse-csw-domain.d.ts.map +1 -0
  189. package/dist/lib/parsers/csw/parse-csw-domain.js +33 -0
  190. package/dist/lib/parsers/csw/parse-csw-records.d.ts +33 -0
  191. package/dist/lib/parsers/csw/parse-csw-records.d.ts.map +1 -0
  192. package/dist/lib/parsers/csw/parse-csw-records.js +58 -0
  193. package/dist/lib/parsers/csw/parse-exception-report.d.ts +6 -0
  194. package/dist/lib/parsers/csw/parse-exception-report.d.ts.map +1 -0
  195. package/dist/lib/parsers/csw/parse-exception-report.js +30 -0
  196. package/dist/lib/parsers/gml/deep-strict-equal.d.ts.map +1 -0
  197. package/dist/lib/parsers/gml/parse-gml.d.ts.map +1 -0
  198. package/dist/lib/parsers/lerc/lerc-types.d.ts.map +1 -0
  199. package/dist/lib/parsers/wms/parse-wms-capabilities.d.ts +103 -0
  200. package/dist/lib/parsers/wms/parse-wms-capabilities.d.ts.map +1 -0
  201. package/dist/lib/parsers/wms/parse-wms-capabilities.js +198 -0
  202. package/dist/lib/parsers/wms/parse-wms-error.d.ts +8 -0
  203. package/dist/lib/parsers/wms/parse-wms-error.d.ts.map +1 -0
  204. package/dist/lib/parsers/wms/parse-wms-error.js +22 -0
  205. package/dist/lib/parsers/wms/parse-wms-features.d.ts +20 -0
  206. package/dist/lib/parsers/wms/parse-wms-features.d.ts.map +1 -0
  207. package/dist/lib/parsers/wms/parse-wms-features.js +27 -0
  208. package/dist/lib/parsers/wms/parse-wms-layer-description.d.ts +10 -0
  209. package/dist/lib/parsers/wms/parse-wms-layer-description.d.ts.map +1 -0
  210. package/dist/lib/parsers/wms/parse-wms-layer-description.js +15 -0
  211. package/dist/lib/parsers/xml/parse-xml-helpers.d.ts +11 -0
  212. package/dist/lib/parsers/xml/parse-xml-helpers.d.ts.map +1 -0
  213. package/dist/lib/parsers/xml/parse-xml-helpers.js +68 -0
  214. package/dist/lib/{data-sources/image-services → services/arcgis}/arcgis-image-service.d.ts +25 -13
  215. package/dist/lib/services/arcgis/arcgis-image-service.d.ts.map +1 -0
  216. package/dist/lib/{data-sources → services/arcgis}/arcgis-image-service.js +33 -23
  217. package/dist/lib/services/arcgis/arcgis-server.d.ts +15 -0
  218. package/dist/lib/services/arcgis/arcgis-server.d.ts.map +1 -0
  219. package/dist/lib/services/arcgis/arcgis-server.js +42 -0
  220. package/dist/lib/{data-sources/image-services → services/generic}/image-service.d.ts +3 -13
  221. package/dist/lib/services/generic/image-service.d.ts.map +1 -0
  222. package/dist/lib/{data-sources/adhoc-image-service.js → services/generic/image-service.js} +12 -10
  223. package/dist/lib/services/generic/tile-service.d.ts +1 -0
  224. package/dist/lib/services/generic/tile-service.d.ts.map +1 -0
  225. package/dist/lib/services/generic/tile-service.js +1 -0
  226. package/dist/lib/services/ogc/csw-service.d.ts +115 -0
  227. package/dist/lib/services/ogc/csw-service.d.ts.map +1 -0
  228. package/dist/lib/services/ogc/csw-service.js +170 -0
  229. package/dist/lib/{data-sources/image-services → services/ogc}/wms-service.d.ts +88 -64
  230. package/dist/lib/services/ogc/wms-service.d.ts.map +1 -0
  231. package/dist/lib/services/ogc/wms-service.js +266 -0
  232. package/dist/lib/sources/data-source.d.ts +22 -0
  233. package/dist/lib/sources/data-source.d.ts.map +1 -0
  234. package/dist/lib/sources/data-source.js +34 -0
  235. package/dist/lib/{data-sources → sources}/image-source.d.ts +7 -10
  236. package/dist/lib/sources/image-source.d.ts.map +1 -0
  237. package/dist/lib/{data-sources → sources}/image-source.js +2 -1
  238. package/dist/lib/sources/tile-source.d.ts +54 -0
  239. package/dist/lib/sources/tile-source.d.ts.map +1 -0
  240. package/dist/lib/sources/tile-source.js +13 -0
  241. package/dist/lib/sources/utils/utils.d.ts +13 -0
  242. package/dist/lib/sources/utils/utils.d.ts.map +1 -0
  243. package/dist/lib/sources/utils/utils.js +38 -0
  244. package/dist/{lib/wfs/wfs-types.d.ts → wip/lib/wcs/parse-wcs-capabilities.d.ts} +8 -3
  245. package/dist/wip/lib/wcs/parse-wcs-capabilities.d.ts.map +1 -0
  246. package/dist/wip/lib/wcs/parse-wcs-capabilities.js +15 -0
  247. package/dist/{lib/wcs/wcs-types.d.ts → wip/lib/wfs/parse-wfs-capabilities.d.ts} +6 -1
  248. package/dist/wip/lib/wfs/parse-wfs-capabilities.d.ts.map +1 -0
  249. package/dist/wip/lib/wfs/parse-wfs-capabilities.js +19 -0
  250. package/dist/wip/lib/wmts/parse-wmts-capabilities.d.ts +87 -0
  251. package/dist/wip/lib/wmts/parse-wmts-capabilities.d.ts.map +1 -0
  252. package/dist/wip/lib/wmts/parse-wmts-capabilities.js +77 -0
  253. package/dist/wip/wcs-capabilities-loader.d.ts +4 -3
  254. package/dist/wip/wcs-capabilities-loader.d.ts.map +1 -1
  255. package/dist/wip/wcs-capabilities-loader.js +3 -3
  256. package/dist/wip/wfs-capabilities-loader.d.ts +4 -3
  257. package/dist/wip/wfs-capabilities-loader.d.ts.map +1 -1
  258. package/dist/wip/wfs-capabilities-loader.js +3 -3
  259. package/dist/wip/wms-feature-info-loader.d.ts +4 -2
  260. package/dist/wip/wms-feature-info-loader.d.ts.map +1 -1
  261. package/dist/wip/wms-feature-info-loader.js +3 -3
  262. package/dist/wip/wms-layer-description-loader.d.ts +5 -3
  263. package/dist/wip/wms-layer-description-loader.d.ts.map +1 -1
  264. package/dist/wip/wms-layer-description-loader.js +3 -3
  265. package/dist/wip/wmts-capabilities-loader.d.ts +2 -2
  266. package/dist/wip/wmts-capabilities-loader.d.ts.map +1 -1
  267. package/dist/wip/wmts-capabilities-loader.js +4 -3
  268. package/dist/wms-capabilities-loader.d.ts +10 -4
  269. package/dist/wms-capabilities-loader.d.ts.map +1 -1
  270. package/dist/wms-capabilities-loader.js +3 -3
  271. package/dist/wms-error-loader.js +2 -2
  272. package/package.json +7 -7
  273. package/src/csw-capabilities-loader.ts +46 -0
  274. package/src/csw-domain-loader.ts +44 -0
  275. package/src/csw-records-loader.ts +42 -0
  276. package/src/{wip/gml-loader.ts → gml-loader.ts} +2 -2
  277. package/src/index.ts +49 -30
  278. package/src/lerc-loader.ts +1 -1
  279. package/src/lib/{data-sources/create-image-source.ts → create-image-source.ts} +12 -10
  280. package/src/lib/parsers/csw/parse-csw-capabilities.ts +103 -0
  281. package/src/lib/parsers/csw/parse-csw-domain.ts +45 -0
  282. package/src/lib/parsers/csw/parse-csw-records.ts +90 -0
  283. package/src/lib/parsers/csw/parse-exception-report.ts +31 -0
  284. package/src/lib/parsers/wms/parse-wms-capabilities.ts +361 -0
  285. package/src/lib/parsers/wms/parse-wms-error.ts +22 -0
  286. package/src/lib/parsers/wms/parse-wms-features.ts +39 -0
  287. package/src/lib/parsers/wms/parse-wms-layer-description.ts +18 -0
  288. package/src/lib/parsers/xml/parse-xml-helpers.ts +65 -0
  289. package/src/lib/{data-sources/image-services → services/arcgis}/arcgis-image-service.ts +44 -26
  290. package/src/lib/services/arcgis/arcgis-server.ts +59 -0
  291. package/src/lib/{data-sources/adhoc-image-service.ts → services/generic/image-service.ts} +18 -12
  292. package/src/lib/services/generic/tile-service.ts +0 -0
  293. package/src/lib/services/ogc/csw-service.ts +251 -0
  294. package/src/lib/services/ogc/wms-service.ts +450 -0
  295. package/src/lib/services/ogc/wmts-service.ts.disabled +348 -0
  296. package/src/lib/sources/data-source.ts +46 -0
  297. package/src/lib/{data-sources → sources}/image-source.ts +8 -10
  298. package/src/lib/sources/tile-source.ts +59 -0
  299. package/src/lib/sources/utils/utils.ts +42 -0
  300. package/src/{lib/wmts/wmts-types.ts → wip/lib/wcs/parse-wcs-capabilities.ts} +15 -3
  301. package/src/{lib/wcs/wcs-types.ts → wip/lib/wfs/parse-wfs-capabilities.ts} +18 -1
  302. package/src/wip/lib/wmts/parse-wmts-capabilities.ts +170 -0
  303. package/src/wip/wcs-capabilities-loader.ts +6 -3
  304. package/src/wip/wfs-capabilities-loader.ts +4 -1
  305. package/src/wip/wms-feature-info-loader.ts +5 -1
  306. package/src/wip/wms-layer-description-loader.ts +7 -2
  307. package/src/wip/wmts-capabilities-loader.ts +4 -1
  308. package/src/wms-capabilities-loader.ts +14 -4
  309. package/src/wms-error-loader.ts +1 -1
  310. package/dist/es5/lib/data-sources/adhoc-image-service.js.map +0 -1
  311. package/dist/es5/lib/data-sources/arcgis-image-service.js +0 -180
  312. package/dist/es5/lib/data-sources/arcgis-image-service.js.map +0 -1
  313. package/dist/es5/lib/data-sources/create-image-source.js.map +0 -1
  314. package/dist/es5/lib/data-sources/image-services/arcgis-image-service.js.map +0 -1
  315. package/dist/es5/lib/data-sources/image-services/image-service.js +0 -163
  316. package/dist/es5/lib/data-sources/image-services/image-service.js.map +0 -1
  317. package/dist/es5/lib/data-sources/image-services/wms-service.js +0 -400
  318. package/dist/es5/lib/data-sources/image-services/wms-service.js.map +0 -1
  319. package/dist/es5/lib/data-sources/image-source.js +0 -14
  320. package/dist/es5/lib/data-sources/image-source.js.map +0 -1
  321. package/dist/es5/lib/gml/deep-strict-equal.js.map +0 -1
  322. package/dist/es5/lib/gml/parse-gml.js.map +0 -1
  323. package/dist/es5/lib/lerc/lerc-types.js.map +0 -1
  324. package/dist/es5/lib/wcs/parse-wcs.js.map +0 -1
  325. package/dist/es5/lib/wcs/wcs-types.js +0 -2
  326. package/dist/es5/lib/wcs/wcs-types.js.map +0 -1
  327. package/dist/es5/lib/wfs/parse-wfs.js.map +0 -1
  328. package/dist/es5/lib/wfs/wfs-types.js +0 -2
  329. package/dist/es5/lib/wfs/wfs-types.js.map +0 -1
  330. package/dist/es5/lib/wms/parse-wms.js +0 -135
  331. package/dist/es5/lib/wms/parse-wms.js.map +0 -1
  332. package/dist/es5/lib/wms/wms-types.js +0 -2
  333. package/dist/es5/lib/wms/wms-types.js.map +0 -1
  334. package/dist/es5/lib/wmts/parse-wmts.js.map +0 -1
  335. package/dist/es5/lib/wmts/wmts-types.js +0 -2
  336. package/dist/es5/lib/wmts/wmts-types.js.map +0 -1
  337. package/dist/es5/wip/gml-loader.js.map +0 -1
  338. package/dist/esm/lib/data-sources/adhoc-image-service.js.map +0 -1
  339. package/dist/esm/lib/data-sources/arcgis-image-service.js +0 -62
  340. package/dist/esm/lib/data-sources/arcgis-image-service.js.map +0 -1
  341. package/dist/esm/lib/data-sources/create-image-source.js.map +0 -1
  342. package/dist/esm/lib/data-sources/image-services/arcgis-image-service.js +0 -61
  343. package/dist/esm/lib/data-sources/image-services/arcgis-image-service.js.map +0 -1
  344. package/dist/esm/lib/data-sources/image-services/image-service.js +0 -72
  345. package/dist/esm/lib/data-sources/image-services/image-service.js.map +0 -1
  346. package/dist/esm/lib/data-sources/image-services/wms-service.js +0 -190
  347. package/dist/esm/lib/data-sources/image-services/wms-service.js.map +0 -1
  348. package/dist/esm/lib/data-sources/image-source.js +0 -4
  349. package/dist/esm/lib/data-sources/image-source.js.map +0 -1
  350. package/dist/esm/lib/gml/deep-strict-equal.js.map +0 -1
  351. package/dist/esm/lib/gml/parse-gml.js.map +0 -1
  352. package/dist/esm/lib/lerc/lerc-types.js.map +0 -1
  353. package/dist/esm/lib/wcs/parse-wcs.js +0 -32
  354. package/dist/esm/lib/wcs/parse-wcs.js.map +0 -1
  355. package/dist/esm/lib/wcs/wcs-types.js +0 -2
  356. package/dist/esm/lib/wcs/wcs-types.js.map +0 -1
  357. package/dist/esm/lib/wfs/parse-wfs.js +0 -32
  358. package/dist/esm/lib/wfs/parse-wfs.js.map +0 -1
  359. package/dist/esm/lib/wfs/wfs-types.js +0 -2
  360. package/dist/esm/lib/wfs/wfs-types.js.map +0 -1
  361. package/dist/esm/lib/wms/parse-wms.js +0 -101
  362. package/dist/esm/lib/wms/parse-wms.js.map +0 -1
  363. package/dist/esm/lib/wms/wms-types.js +0 -2
  364. package/dist/esm/lib/wms/wms-types.js.map +0 -1
  365. package/dist/esm/lib/wmts/parse-wmts.js +0 -32
  366. package/dist/esm/lib/wmts/parse-wmts.js.map +0 -1
  367. package/dist/esm/lib/wmts/wmts-types.js +0 -2
  368. package/dist/esm/lib/wmts/wmts-types.js.map +0 -1
  369. package/dist/esm/wip/gml-loader.js.map +0 -1
  370. package/dist/lib/data-sources/adhoc-image-service.d.ts +0 -24
  371. package/dist/lib/data-sources/adhoc-image-service.d.ts.map +0 -1
  372. package/dist/lib/data-sources/arcgis-image-service.d.ts +0 -79
  373. package/dist/lib/data-sources/arcgis-image-service.d.ts.map +0 -1
  374. package/dist/lib/data-sources/create-image-source.d.ts +0 -16
  375. package/dist/lib/data-sources/create-image-source.d.ts.map +0 -1
  376. package/dist/lib/data-sources/image-services/arcgis-image-service.d.ts.map +0 -1
  377. package/dist/lib/data-sources/image-services/arcgis-image-service.js +0 -85
  378. package/dist/lib/data-sources/image-services/image-service.d.ts.map +0 -1
  379. package/dist/lib/data-sources/image-services/image-service.js +0 -82
  380. package/dist/lib/data-sources/image-services/wms-service.d.ts.map +0 -1
  381. package/dist/lib/data-sources/image-services/wms-service.js +0 -218
  382. package/dist/lib/data-sources/image-source.d.ts.map +0 -1
  383. package/dist/lib/gml/deep-strict-equal.d.ts.map +0 -1
  384. package/dist/lib/gml/parse-gml.d.ts.map +0 -1
  385. package/dist/lib/lerc/lerc-types.d.ts.map +0 -1
  386. package/dist/lib/wcs/parse-wcs.d.ts +0 -7
  387. package/dist/lib/wcs/parse-wcs.d.ts.map +0 -1
  388. package/dist/lib/wcs/parse-wcs.js +0 -36
  389. package/dist/lib/wcs/wcs-types.d.ts.map +0 -1
  390. package/dist/lib/wcs/wcs-types.js +0 -3
  391. package/dist/lib/wfs/parse-wfs.d.ts +0 -7
  392. package/dist/lib/wfs/parse-wfs.d.ts.map +0 -1
  393. package/dist/lib/wfs/parse-wfs.js +0 -36
  394. package/dist/lib/wfs/wfs-types.d.ts.map +0 -1
  395. package/dist/lib/wfs/wfs-types.js +0 -3
  396. package/dist/lib/wms/parse-wms.d.ts +0 -24
  397. package/dist/lib/wms/parse-wms.d.ts.map +0 -1
  398. package/dist/lib/wms/parse-wms.js +0 -115
  399. package/dist/lib/wms/wms-types.d.ts +0 -100
  400. package/dist/lib/wms/wms-types.d.ts.map +0 -1
  401. package/dist/lib/wms/wms-types.js +0 -1908
  402. package/dist/lib/wmts/parse-wmts.d.ts +0 -7
  403. package/dist/lib/wmts/parse-wmts.d.ts.map +0 -1
  404. package/dist/lib/wmts/parse-wmts.js +0 -36
  405. package/dist/lib/wmts/wmts-types.d.ts.map +0 -1
  406. package/dist/lib/wmts/wmts-types.js +0 -3
  407. package/dist/wip/gml-loader.d.ts.map +0 -1
  408. package/src/lib/data-sources/arcgis-image-service.ts +0 -146
  409. package/src/lib/data-sources/image-services/image-service.ts +0 -105
  410. package/src/lib/data-sources/image-services/wms-service.ts +0 -351
  411. package/src/lib/wcs/parse-wcs.ts +0 -39
  412. package/src/lib/wfs/parse-wfs.ts +0 -39
  413. package/src/lib/wfs/wfs-types.ts +0 -78
  414. package/src/lib/wms/parse-wms.ts +0 -142
  415. package/src/lib/wms/wms-types.ts +0 -2053
  416. package/src/lib/wmts/parse-wmts.ts +0 -39
  417. /package/dist/es5/lib/{lerc → parsers/lerc}/lerc-types.js +0 -0
  418. /package/dist/esm/lib/{lerc → parsers/lerc}/lerc-types.js +0 -0
  419. /package/dist/{wip/gml-loader.d.ts → gml-loader.d.ts} +0 -0
  420. /package/dist/lib/{gml → parsers/gml}/deep-strict-equal.d.ts +0 -0
  421. /package/dist/lib/{gml → parsers/gml}/deep-strict-equal.js +0 -0
  422. /package/dist/lib/{gml → parsers/gml}/parse-gml.d.ts +0 -0
  423. /package/dist/lib/{gml → parsers/gml}/parse-gml.js +0 -0
  424. /package/dist/lib/{lerc → parsers/lerc}/lerc-types.d.ts +0 -0
  425. /package/dist/lib/{lerc → parsers/lerc}/lerc-types.js +0 -0
  426. /package/src/lib/{gml → parsers/gml}/deep-strict-equal.ts +0 -0
  427. /package/src/lib/{gml → parsers/gml}/parse-gml.ts +0 -0
  428. /package/src/lib/{lerc → parsers/lerc}/lerc-types.ts +0 -0
@@ -0,0 +1,361 @@
1
+ // loaders.gl, MIT license
2
+
3
+ import {XMLLoader} from '@loaders.gl/xml';
4
+ import {
5
+ getXMLArray,
6
+ getXMLStringArray,
7
+ getXMLInteger,
8
+ getXMLFloat,
9
+ getXMLBoolean
10
+ } from '../xml/parse-xml-helpers';
11
+
12
+ /** All capabilities of a WMS service - response to a WMS `GetCapabilities` data structure extracted from XML */
13
+ export type WMSCapabilities = {
14
+ /** Version of the WMS service */
15
+ version?: string; // '1.3.0' | '1.1.1' | '1.1.0' | '1.0.0'
16
+ /** A short name for the service */
17
+ name: string;
18
+ /** A human readable name for the service */
19
+ title?: string;
20
+ /** A more extensive description of the service */
21
+ abstract?: string;
22
+ /** A set of keywords e.g. for searching services */
23
+ keywords: string[];
24
+ /** A field of unspecified format, if present describes any access constraints required to use the service. */
25
+ accessConstraints?: string;
26
+ /** A field of unspecified format, if present describes any fees associated with the use of the service */
27
+ fees?: string;
28
+ /** If present, the max number of layers that can be rendered by the service */
29
+ layerLimit?: number;
30
+ /** If present, the widest image that can be rendered by the service */
31
+ maxWidth?: number;
32
+ /** If present, the tallest image that can be rendered by the service */
33
+ maxHeight?: number;
34
+ /** Hierarchical list of layers. */
35
+ layers: WMSLayer[];
36
+ /** A map with information about supported WMS requests. If a record is present, the request is supported by the service */
37
+ requests: Record<string, WMSRequest>;
38
+ /** Information about any exceptions that the service will report (HTTP status != 2xx) */
39
+ exceptions?: WMSExceptions;
40
+ /** Only if `options.raw`: raw untyped JSON parsed from XML. Can include information not extracted in the typed response. */
41
+ raw?: Record<string, unknown>;
42
+ /** Only if `options.xml`, the unparsed XML string can be requested */
43
+ xml?: string;
44
+ };
45
+
46
+ /**
47
+ * Metadata about a layer
48
+ * Layers inherit many properties from their parent layers, see description of individual props for details.
49
+ * @see https://www.ogc.org/standard/wms/ 7.2.4.6
50
+ */
51
+ export type WMSLayer = {
52
+ /** The title is a human readable name. It is mandatory on each layer. Not inherited. */
53
+ title: string;
54
+ /** A layer is renderable if it has a name. A named parent layer will render all its sublayers. Not inherited. */
55
+ name?: string;
56
+ /** A narrative description of the map layer. */
57
+ abstract?: string;
58
+ /** A set of keywords e.g. for searching layers */
59
+ keywords: string[];
60
+ /** layer limits in unspecified CRS:84-like lng/lat, for quick access w/o CRS calculations. Defined or inherited. */
61
+ geographicBoundingBox?: [min: [x: number, y: number], max: [x: number, y: number]];
62
+ /** Supported CRS. Either defined or inherited. */
63
+ crs?: string[];
64
+ /** Bounding boxes in specific CRS:es */
65
+ boundingBoxes?: WMSBoundingBox[];
66
+
67
+ // minScale: number;
68
+ // maxScale: number;
69
+ // dimensions: ?? 7.2.4.6.10
70
+ // MetadataURL
71
+ // Attribution
72
+ // Identifier and AuthorityURL
73
+ // FeatureListURL
74
+ // DataURL
75
+
76
+ /** Whether queries can be performed on the layer */
77
+ queryable?: boolean;
78
+ /** `false` if layer has significant no-data areas that the client can display as transparent. */
79
+ opaque?: boolean;
80
+ /** WMS cascading allows server to expose layers coming from other WMS servers as if they were local layers */
81
+ cascaded?: boolean;
82
+ // noSubsets: boolean
83
+ // fixedWith: number
84
+ // fixedHeight: number
85
+
86
+ /** A list of styles. @note not yet supported by WMSCapabilitiesLoader */
87
+ styles?: unknown[];
88
+
89
+ /** Sublayers - these inherit crs and boundingBox) if not overridden) */
90
+ layers?: WMSLayer[];
91
+ };
92
+
93
+ /**
94
+ * A bounding box specifies the coordinate range for data in the layer.
95
+ * No data is available outside the bounding box.
96
+ */
97
+ export type WMSBoundingBox = {
98
+ /** CRS indicates the Layer CRS that applies to this bounding box. */
99
+ crs: string;
100
+ /** `[[w, s], [e, n]]`, indicates the limits of the bounding box using the axis units and order of the specified CRS. */
101
+ boundingBox: [min: [x: number, y: number], max: [x: number, y: number]];
102
+ /** Spatial horizontal resolution of data in same units as bounding box */
103
+ xResolution?: number;
104
+ /** Spatial vertical resolution of data in same units as bounding box */
105
+ yResolution?: number;
106
+ };
107
+
108
+ /** Metadata about a supported WMS request */
109
+ export type WMSRequest = {
110
+ /** MIMEtypes that can be returned by this request. */
111
+ mimeTypes: string[];
112
+ };
113
+
114
+ export type WMSExceptions = {
115
+ /** MIME types for exception response payloads. */
116
+ mimeTypes: string[];
117
+ };
118
+
119
+ export type parseWMSCapabilitiesOptions = {
120
+ /** Add inherited layer information to sub layers */
121
+ inheritedLayerProps?: boolean;
122
+ /** Include the "raw" JSON (parsed but untyped, unprocessed XML). May contain additional fields */
123
+ includeRawData?: boolean;
124
+ /** Include the original XML document text. May contain additional information. */
125
+ includeXMLText?: boolean;
126
+ /** @deprecated Use includeRawData` */
127
+ raw?: boolean;
128
+
129
+ // xml options are passed through to xml loader
130
+ };
131
+
132
+ /**
133
+ * Parses a typed data structure from raw XML for `GetCapabilities` response
134
+ * @note Error handlings is fairly weak
135
+ */
136
+ export function parseWMSCapabilities(
137
+ xmlText: string,
138
+ options?: parseWMSCapabilitiesOptions
139
+ ): WMSCapabilities {
140
+ const parsedXML = XMLLoader.parseTextSync(xmlText, options);
141
+ const xmlCapabilities: any =
142
+ parsedXML.WMT_MS_Capabilities || parsedXML.WMS_Capabilities || parsedXML;
143
+ const capabilities = extractCapabilities(xmlCapabilities);
144
+ // In case the processed, normalized capabilities do not contain everything,
145
+ // the user can get the parsed XML structure.
146
+ if (options?.inheritedLayerProps) {
147
+ // Traverse layers and inject missing props from parents
148
+ for (const layer of capabilities.layers) {
149
+ addInheritedLayerProps(layer, null);
150
+ }
151
+ // Not yet implemented
152
+ }
153
+
154
+ if (options?.includeRawData || options?.raw) {
155
+ capabilities.raw = xmlCapabilities;
156
+ }
157
+
158
+ if (options?.includeXMLText) {
159
+ capabilities.xml = xmlText;
160
+ }
161
+
162
+ return capabilities;
163
+ }
164
+
165
+ /** Extract typed capability data from XML */
166
+ function extractCapabilities(xml: any): WMSCapabilities {
167
+ const capabilities: WMSCapabilities = {
168
+ version: String(xml.version || ''),
169
+ name: String(xml.Service?.Name || 'unnamed'),
170
+ title: xml.Service?.Title ? String(xml.Service?.Title) : undefined,
171
+ abstract: xml.Service?.Abstract ? String(xml.Service?.Abstract) : undefined,
172
+ keywords: getXMLStringArray(xml.Service?.KeywordList?.Keyword),
173
+ fees: xml.Service?.Fees ? JSON.stringify(xml.Service?.Fees) : undefined,
174
+ accessConstraints: xml.Service?.AccessConstraints
175
+ ? JSON.stringify(xml.Service?.AccessConstraints)
176
+ : undefined,
177
+ layerLimit: getXMLInteger(xml.Service?.LayerLimit),
178
+ maxWidth: getXMLInteger(xml.Service?.maxWidth),
179
+ maxHeight: getXMLInteger(xml.Service?.maxHeight),
180
+ layers: [],
181
+ requests: extractRequests(xml.Capability?.Request),
182
+ exceptions: extractExceptions(xml.Exception)
183
+ // contact field is a mess of largely irrelevant information, put it last
184
+ // contact: xml.Service?.Contact ? JSON.stringify(xml.Service?.Contact) : undefined,
185
+ };
186
+
187
+ // LAYERS
188
+ const xmlLayers = getXMLArray(xml.Capability?.Layer);
189
+ for (const xmlSubLayer of xmlLayers) {
190
+ capabilities.layers.push(extractLayer(xmlSubLayer));
191
+ }
192
+
193
+ // Clean up object
194
+ for (const [key, value] of Object.entries(capabilities)) {
195
+ if (value === undefined) {
196
+ delete capabilities[key];
197
+ }
198
+ }
199
+
200
+ return capabilities;
201
+ }
202
+
203
+ /** Extract typed request metadata from XML requests field */
204
+ function extractRequests(xmlRequests: any): Record<string, WMSRequest> {
205
+ const requests: Record<string, WMSRequest> = {};
206
+ for (const [name, xmlRequest] of Object.entries(xmlRequests || {}) as any) {
207
+ const mimeTypes = getXMLStringArray(xmlRequest?.Format);
208
+ requests[name] = {mimeTypes};
209
+ }
210
+ return requests;
211
+ }
212
+
213
+ function extractExceptions(xmlException: any): WMSExceptions | undefined {
214
+ const xmlExceptionFormats = getXMLArray(xmlException?.Format);
215
+ if (xmlExceptionFormats.length > 0) {
216
+ return {
217
+ mimeTypes: getXMLStringArray(xmlException)
218
+ };
219
+ }
220
+ return undefined;
221
+ }
222
+
223
+ /** Extract request data */
224
+ // eslint-disable-next-line complexity, max-statements
225
+ function extractLayer(xmlLayer: any): WMSLayer {
226
+ const layer: WMSLayer = {
227
+ // All layers must have a title
228
+ title: String(xmlLayer?.Title || ''),
229
+ // Name is required only if renderable
230
+ name: String(xmlLayer?.Name),
231
+ abstract: String(xmlLayer?.Abstract),
232
+ keywords: getXMLStringArray(xmlLayer.KeywordList?.Keyword)
233
+ };
234
+
235
+ // WMS 1.3.0 changes SRS to CRS
236
+ const crs = xmlLayer?.CRS || xmlLayer?.SRS;
237
+ if (crs && Array.isArray(crs) && crs.every((_) => typeof _ === 'string')) {
238
+ layer.crs = crs;
239
+ }
240
+
241
+ // v1.3.0 extract simple geographic bounding box
242
+ let geographicBoundingBox =
243
+ xmlLayer?.EX_GeographicBoundingBox && extractEXBoundingBox(xmlLayer?.EX_GeographicBoundingBox);
244
+ if (geographicBoundingBox) {
245
+ layer.geographicBoundingBox = geographicBoundingBox;
246
+ }
247
+
248
+ // v1.1.1 extract simple geographic bounding box
249
+ geographicBoundingBox =
250
+ xmlLayer?.LatLonBoundingBox && extractLatLonBoundingBox(xmlLayer?.LatLonBoundingBox);
251
+ if (geographicBoundingBox) {
252
+ layer.geographicBoundingBox = geographicBoundingBox;
253
+ }
254
+
255
+ // Extract per-CRS bounding boxes
256
+ const boundingBoxes = xmlLayer?.BoundingBox && extractWMSBoundingBoxes(xmlLayer?.BoundingBox);
257
+ if (boundingBoxes && boundingBoxes.length > 0) {
258
+ layer.boundingBoxes = boundingBoxes;
259
+ }
260
+
261
+ if (xmlLayer?.opaque) {
262
+ layer.opaque = getXMLBoolean(xmlLayer?.opaque);
263
+ }
264
+ if (xmlLayer?.cascaded) {
265
+ layer.cascaded = getXMLBoolean(xmlLayer?.cascaded);
266
+ }
267
+ if (xmlLayer?.queryable) {
268
+ layer.queryable = getXMLBoolean(xmlLayer?.queryable);
269
+ }
270
+
271
+ // Single layer is not represented as array in XML
272
+ const xmlLayers = getXMLArray(xmlLayer?.Layer);
273
+ const layers: WMSLayer[] = [];
274
+
275
+ for (const xmlSubLayer of xmlLayers) {
276
+ layers.push(extractLayer(xmlSubLayer));
277
+ }
278
+
279
+ if (layers.length > 0) {
280
+ layer.layers = layers;
281
+ }
282
+
283
+ // Clean up object
284
+ for (const [key, value] of Object.entries(layer)) {
285
+ if (value === undefined) {
286
+ delete layer[key];
287
+ }
288
+ }
289
+
290
+ return layer;
291
+ }
292
+
293
+ /** WMS 1.3.0 Loosely defined geospatial bounding box in unspecified CRS for quick content searches */
294
+ function extractEXBoundingBox(xmlBoundingBox: any): [[number, number], [number, number]] {
295
+ const {
296
+ westBoundLongitude: w,
297
+ northBoundLatitude: n,
298
+ eastBoundLongitude: e,
299
+ southBoundLatitude: s
300
+ } = xmlBoundingBox;
301
+ return [
302
+ [w, s],
303
+ [e, n]
304
+ ];
305
+ }
306
+
307
+ /** WMS 1.1.1 Loosely defined geospatial bounding box in unspecified CRS for quick content searches */
308
+ function extractLatLonBoundingBox(xmlBoundingBox: any): [[number, number], [number, number]] {
309
+ const {minx, miny, maxx, maxy} = xmlBoundingBox;
310
+ return [
311
+ [minx, miny],
312
+ [maxx, maxy]
313
+ ];
314
+ }
315
+
316
+ /** Loosely defined geospatial bounding box in unspecified CRS for quick content searches */
317
+ function extractWMSBoundingBoxes(xmlBoundingBoxes: any): WMSBoundingBox[] {
318
+ const xmlBoxes = getXMLArray(xmlBoundingBoxes);
319
+ return xmlBoxes.map((xmlBox) => extractWMSBoundingBox(xmlBox));
320
+ }
321
+
322
+ /** Loosely defined geospatial bounding box in unspecified CRS for quick content searches */
323
+ function extractWMSBoundingBox(xmlBoundingBox: any): WMSBoundingBox {
324
+ const {CRS, SRS, minx, miny, maxx, maxy, resx, resy} = xmlBoundingBox;
325
+ const boundingBox: WMSBoundingBox = {
326
+ // CRS in 1.3.0, SRS in 1.1.1
327
+ crs: CRS || SRS,
328
+ boundingBox: [
329
+ [getXMLFloat(minx) as number, getXMLFloat(miny) as number],
330
+ [getXMLFloat(maxx) as number, getXMLFloat(maxy) as number]
331
+ ]
332
+ };
333
+ if (resx) {
334
+ boundingBox.xResolution = resx;
335
+ }
336
+ if (resy) {
337
+ boundingBox.yResolution = resy;
338
+ }
339
+ return boundingBox;
340
+ }
341
+
342
+ /** Traverse layers and inject missing props from parents */
343
+ function addInheritedLayerProps(layer: WMSLayer, parent: WMSLayer | null): void {
344
+ if (parent && parent.geographicBoundingBox && !layer.geographicBoundingBox) {
345
+ layer.geographicBoundingBox = [...parent.geographicBoundingBox];
346
+ }
347
+
348
+ if (parent && parent.crs && !layer.crs) {
349
+ layer.crs = [...parent.crs];
350
+ }
351
+
352
+ if (parent && parent.boundingBoxes && !layer.boundingBoxes) {
353
+ layer.boundingBoxes = [...parent.boundingBoxes];
354
+ }
355
+
356
+ // TODO inherit other elements
357
+
358
+ for (const subLayer of layer.layers || []) {
359
+ addInheritedLayerProps(subLayer, layer);
360
+ }
361
+ }
@@ -0,0 +1,22 @@
1
+ // loaders.gl, MIT license
2
+
3
+ import {XMLLoader} from '@loaders.gl/xml';
4
+
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
+ */
11
+ export function parseWMSError(text: string, options): string {
12
+ const parsedXML = XMLLoader.parseTextSync?.(text, options);
13
+ const serviceExceptionXML =
14
+ parsedXML?.ServiceExceptionReport?.ServiceException ||
15
+ parsedXML?.['ogc:ServiceExceptionReport']?.['ogc:ServiceException'];
16
+ // Sigh, can be either a string or an object
17
+ const message =
18
+ typeof serviceExceptionXML === 'string'
19
+ ? serviceExceptionXML
20
+ : serviceExceptionXML.value || serviceExceptionXML.code || 'Unknown error';
21
+ return message;
22
+ }
@@ -0,0 +1,39 @@
1
+ // loaders.gl, MIT license
2
+
3
+ import {XMLLoader} from '@loaders.gl/xml';
4
+
5
+ /** WMS Feature info - response to a WMS `GetFeatureInfo` request */
6
+ export type WMSFeatureInfo = {
7
+ features: WMSFeature[];
8
+ };
9
+
10
+ export type WMSFeature = {
11
+ attributes: Record<string, number | string>;
12
+ type: string;
13
+ bounds: {top: number; bottom: number; left: number; right: number};
14
+ };
15
+
16
+ /**
17
+ * Parses a typed data structure from raw XML for `GetFeatureInfo` response
18
+ * @note Error handlings is fairly weak
19
+ */
20
+ export function parseWMSFeatureInfo(text: string, options): WMSFeatureInfo {
21
+ const parsedXML = XMLLoader.parseTextSync(text, options);
22
+ const xmlFeatureInfo: any = parsedXML.FeatureInfoResponse?.FIELDS || [];
23
+
24
+ const xmlFeatures = Array.isArray(xmlFeatureInfo) ? xmlFeatureInfo : [xmlFeatureInfo];
25
+
26
+ return {
27
+ features: xmlFeatures.map((xmlFeature) => extractFeature(xmlFeature))
28
+ };
29
+ }
30
+
31
+ function extractFeature(xmlFeature: any) {
32
+ const xmlFields = xmlFeature || {};
33
+ // TODO - not correct
34
+ return {
35
+ attributes: xmlFields,
36
+ type: '',
37
+ bounds: {bottom: 0, top: 0, left: 0, right: 0}
38
+ };
39
+ }
@@ -0,0 +1,18 @@
1
+ // loaders.gl, MIT license
2
+
3
+ import {XMLLoader} from '@loaders.gl/xml';
4
+
5
+ /** Layer description - response to a WMS `DescribeLayer` request */
6
+ export type WMSLayerDescription = {
7
+ layers: {}[];
8
+ };
9
+
10
+ /**
11
+ * Parses a typed data structure from raw XML for `GetFeatureInfo` response
12
+ * @note Error handlings is fairly weak
13
+ */
14
+ export function parseWMSLayerDescription(text: string, options): WMSLayerDescription {
15
+ const parsedXML = XMLLoader.parseTextSync(text, options);
16
+ // TODO - implement parser
17
+ return parsedXML as unknown as WMSLayerDescription;
18
+ }
@@ -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
+ }
@@ -1,27 +1,34 @@
1
1
  // loaders.gl, MIT license
2
2
 
3
3
  import {ImageType} from '@loaders.gl/images';
4
- import type {ImageSourceMetadata, GetImageParameters} from '../image-source';
5
- import {ImageSource} from '../image-source';
6
- import {ImageServiceProps, mergeImageServiceProps, getFetchFunction} from './image-service';
7
-
8
- export class ArcGISImageService extends ImageSource {
4
+ import type {ImageSourceMetadata, GetImageParameters} from '../../sources/image-source';
5
+ import type {ImageSourceProps} from '../../sources/image-source';
6
+ import {ImageSource} from '../../sources/image-source';
7
+
8
+ export type ArcGISImageServerProps = ImageSourceProps & {
9
+ url: string;
10
+ };
11
+
12
+ /**
13
+ * ArcGIS ImageServer
14
+ * Note - exports a big API, that could be exposed here if there is a use case
15
+ * @see https://developers.arcgis.com/rest/services-reference/enterprise/image-service.htm
16
+ */
17
+ export class ArcGISImageServer extends ImageSource {
9
18
  static type: 'arcgis-image-server' = 'arcgis-image-server';
10
19
  static testURL = (url: string): boolean => url.toLowerCase().includes('ImageServer');
11
20
 
12
- props: Required<ImageServiceProps>;
13
- fetch: (url: string, options?: RequestInit) => Promise<Response>;
21
+ props: ArcGISImageServerProps;
14
22
 
15
- constructor(props: ImageServiceProps) {
16
- super();
17
- this.props = mergeImageServiceProps(props);
18
- this.fetch = getFetchFunction(this.props);
23
+ constructor(props: ArcGISImageServerProps) {
24
+ super(props);
25
+ this.props = props;
19
26
  }
20
27
 
21
28
  // ImageSource (normalized endpoints)
22
29
 
23
30
  async getMetadata(): Promise<ImageSourceMetadata> {
24
- return (await this.info()) as ImageSourceMetadata;
31
+ return (await this.metadata()) as ImageSourceMetadata;
25
32
  // TODO - normalize metadata
26
33
  }
27
34
 
@@ -33,7 +40,7 @@ export class ArcGISImageService extends ImageSource {
33
40
 
34
41
  // ImageServer endpoints
35
42
 
36
- async info(): Promise<unknown> {
43
+ async metadata(): Promise<unknown> {
37
44
  // We just need a JSON parsing...
38
45
  // return this.getUrl({path: '', ...options});
39
46
  throw new Error('not implemented');
@@ -68,18 +75,22 @@ export class ArcGISImageService extends ImageSource {
68
75
 
69
76
  // URL creators
70
77
 
71
- infoURL(options: {parameters?: Record<string, unknown>}): string {
72
- return this.props.url;
73
- // return this.getUrl({path: '', ...options});
78
+ metadataURL(options: {parameters?: Record<string, unknown>}): string {
79
+ return `${this.props.url}?f=pjson`;
74
80
  }
75
81
 
76
82
  /**
77
83
  * Form a URL to an ESRI ImageServer
78
- // https://sampleserver6.arcgisonline.com/arcgis/rest/services/NLCDLandCover2001/ImageServer/exportImage?bbox=${bounds[0]},${bounds[1]},${bounds[2]},${bounds[3]}&bboxSR=4326&size=${width},${height}&imageSR=102100&time=&format=jpgpng&pixelType=U8&noData=&noDataInterpretation=esriNoDataMatchAny&interpolation=+RSP_NearestNeighbor&compression=&compressionQuality=&bandIds=&mosaicRule=&renderingRule=&f=image`,
84
+ // https://sampleserver6.arcgisonline.com/arcgis/rest/services/NLCDLandCover2001/ImageServer/exportImage?
85
+ // bbox=${bounds[0]},${bounds[1]},${bounds[2]},${bounds[3]}&bboxSR=4326&
86
+ // size=${width},${height}&imageSR=102100&time=&format=jpgpng&pixelType=U8&
87
+ // noData=&noDataInterpretation=esriNoDataMatchAny&interpolation=+RSP_NearestNeighbor&compression=&
88
+ // compressionQuality=&bandIds=&mosaicRule=&renderingRule=&
89
+ // f=image
79
90
  */
80
91
  exportImageURL(options: {
81
- boundingBox: [number, number, number, number];
82
- boundingBoxSR?: string;
92
+ bbox: [number, number, number, number];
93
+ boxSR?: string;
83
94
  width: number;
84
95
  height: number;
85
96
  imageSR?: string;
@@ -96,11 +107,14 @@ export class ArcGISImageService extends ImageSource {
96
107
  renderingRule?: never;
97
108
  f?: 'image';
98
109
  }): string {
99
- // const {boundingBox} = options;
100
- // const bbox = `bbox=${boundingBox[0]},${boundingBox[1]},${boundingBox[2]},${boundingBox[3]}`;
101
- // const size = `size=${width},${height}`;
102
- // return this.getUrl({path: 'exportImage'});
103
- return this.props.url;
110
+ const bbox = `bbox=${options.bbox[0]},${options.bbox[1]},${options.bbox[2]},${options.bbox[3]}`;
111
+ const size = `size=${options.width},${options.height}`;
112
+ const arcgisOptions = {...options, bbox, size};
113
+ // @ts-expect-error
114
+ delete arcgisOptions.width;
115
+ // @ts-expect-error
116
+ delete arcgisOptions.height;
117
+ return this.getUrl('exportImage', arcgisOptions);
104
118
  }
105
119
 
106
120
  // INTERNAL METHODS
@@ -109,8 +123,12 @@ export class ArcGISImageService extends ImageSource {
109
123
  * @note protected, since perhaps getWMSUrl may need to be overridden to handle certain backends?
110
124
  * @note if override is common, maybe add a callback prop?
111
125
  * */
112
- protected getUrl(options: Record<string, unknown>, extra?: Record<string, unknown>): string {
113
- let url = `${this.props.url}`;
126
+ protected getUrl(
127
+ path: string,
128
+ options: Record<string, unknown>,
129
+ extra?: Record<string, unknown>
130
+ ): string {
131
+ let url = `${this.props.url}/${path}`;
114
132
  let first = true;
115
133
  for (const [key, value] of Object.entries(options)) {
116
134
  url += first ? '?' : '&';
@@ -0,0 +1,59 @@
1
+ // loaders.gl, MIT license
2
+
3
+ export type Service = {name: string; type: string; url: string};
4
+
5
+ type FetchLike = typeof fetch;
6
+
7
+ /**
8
+ * (Recursively) load the service directory from an ArcGIS Server URL
9
+ * @param url
10
+ * @param fetchFile= Optional fetch function override
11
+ * @returns
12
+ */
13
+ export async function getArcGISServices(
14
+ url: string,
15
+ fetchFile: FetchLike = fetch
16
+ ): Promise<Service[] | null> {
17
+ if (url.includes('rest/services')) {
18
+ const serverUrl = url.replace(/rest\/services.*$/i, 'rest/services');
19
+ return loadServiceDirectory(serverUrl, fetchFile, []);
20
+ }
21
+ return null;
22
+ }
23
+
24
+ async function loadServiceDirectory(
25
+ serverUrl: string,
26
+ fetch: FetchLike,
27
+ path: string[]
28
+ ): Promise<Service[]> {
29
+ const serviceUrl = `${serverUrl}/${path.join('/')}`;
30
+
31
+ const response = await fetch(`${serviceUrl}?f=pjson`);
32
+ const directory = await response.json();
33
+
34
+ const services = extractServices(directory, serviceUrl);
35
+
36
+ const folders = (directory.folders || []) as string[];
37
+ const promises = folders.map((folder) =>
38
+ loadServiceDirectory(`${serverUrl}`, fetch, [...path, folder])
39
+ );
40
+
41
+ for (const folderServices of await Promise.all(promises)) {
42
+ services.push(...folderServices);
43
+ }
44
+
45
+ return services;
46
+ }
47
+
48
+ function extractServices(directory: unknown, url: string): Service[] {
49
+ const arcgisServices = ((directory as any).services || []) as {name: string; type: string}[];
50
+ const services: Service[] = [];
51
+ for (const service of arcgisServices) {
52
+ services.push({
53
+ name: service.name,
54
+ type: `arcgis-${service.type.toLocaleLowerCase().replace('server', '-server')}`,
55
+ url: `${url}${service.name}/${service.type}`
56
+ });
57
+ }
58
+ return services;
59
+ }