@deck.gl/geo-layers 8.9.9 → 8.9.10

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 (42) hide show
  1. package/dist/dist.dev.js +10 -0
  2. package/dist/es5/wms-layer/wms-layer.js +34 -14
  3. package/dist/es5/wms-layer/wms-layer.js.map +1 -1
  4. package/dist/esm/wms-layer/wms-layer.js +11 -0
  5. package/dist/esm/wms-layer/wms-layer.js.map +1 -1
  6. package/dist.min.js +56 -56
  7. package/package.json +2 -2
  8. package/src/wms-layer/wms-layer.ts +15 -1
  9. package/typed/geo-cell-layer/GeoCellLayer.js +49 -0
  10. package/typed/great-circle-layer/great-circle-layer.js +29 -0
  11. package/typed/h3-layers/h3-cluster-layer.js +33 -0
  12. package/typed/h3-layers/h3-hexagon-layer.js +251 -0
  13. package/typed/imagery-layer/imagery-layer.d.ts +53 -0
  14. package/typed/imagery-layer/imagery-layer.d.ts.map +1 -0
  15. package/typed/index.js +33 -0
  16. package/typed/mesh-layer/mesh-layer-fragment.glsl.js +55 -0
  17. package/typed/mesh-layer/mesh-layer-vertex.glsl.js +80 -0
  18. package/typed/mesh-layer/mesh-layer.js +110 -0
  19. package/typed/mvt-layer/coordinate-transform.js +41 -0
  20. package/typed/mvt-layer/find-index-binary.js +96 -0
  21. package/typed/mvt-layer/mvt-layer.js +297 -0
  22. package/typed/quadkey-layer/quadkey-layer.js +18 -0
  23. package/typed/quadkey-layer/quadkey-utils.js +26 -0
  24. package/typed/s2-layer/s2-geometry.js +123 -0
  25. package/typed/s2-layer/s2-layer.js +37 -0
  26. package/typed/s2-layer/s2-utils.js +88 -0
  27. package/typed/terrain-layer/terrain-layer.js +226 -0
  28. package/typed/tile-3d-layer/tile-3d-layer.js +294 -0
  29. package/typed/tile-layer/tile-2d-header.js +113 -0
  30. package/typed/tile-layer/tile-2d-traversal.js +181 -0
  31. package/typed/tile-layer/tile-layer.js +192 -0
  32. package/typed/tile-layer/tileset-2d.d.ts.map +1 -1
  33. package/typed/tile-layer/tileset-2d.js +399 -0
  34. package/typed/tile-layer/types.js +1 -0
  35. package/typed/tile-layer/utils.d.ts +1 -1
  36. package/typed/tile-layer/utils.d.ts.map +1 -1
  37. package/typed/tile-layer/utils.js +197 -0
  38. package/typed/trips-layer/trips-layer.js +92 -0
  39. package/typed/wms-layer/wms-layer.d.ts +4 -0
  40. package/typed/wms-layer/wms-layer.d.ts.map +1 -1
  41. package/typed/tile-3d-layer/utils.d.ts +0 -3
  42. package/typed/tile-3d-layer/utils.d.ts.map +0 -1
package/dist/dist.dev.js CHANGED
@@ -5445,12 +5445,16 @@ var __exports__ = (() => {
5445
5445
  }
5446
5446
  };
5447
5447
  var WMSLayer = class extends import_core.CompositeLayer {
5448
+ get isLoaded() {
5449
+ return Boolean(this.state) && this.state.loadCounter === 0 && super.isLoaded;
5450
+ }
5448
5451
  shouldUpdateState() {
5449
5452
  return true;
5450
5453
  }
5451
5454
  initializeState() {
5452
5455
  this.state._nextRequestId = 0;
5453
5456
  this.state.lastRequestId = -1;
5457
+ this.state.loadCounter = 0;
5454
5458
  }
5455
5459
  updateState({
5456
5460
  changeFlags,
@@ -5521,12 +5525,15 @@ var __exports__ = (() => {
5521
5525
  imageSource
5522
5526
  } = this.state;
5523
5527
  try {
5528
+ this.state.loadCounter++;
5524
5529
  const metadata = await imageSource.getMetadata();
5525
5530
  if (this.state.imageSource === imageSource) {
5526
5531
  this.getCurrentLayer()?.props.onMetadataLoad(metadata);
5527
5532
  }
5528
5533
  } catch (error2) {
5529
5534
  this.getCurrentLayer()?.props.onMetadataLoadError(error2);
5535
+ } finally {
5536
+ this.state.loadCounter--;
5530
5537
  }
5531
5538
  }
5532
5539
  async loadImage(viewport, reason) {
@@ -5562,6 +5569,7 @@ var __exports__ = (() => {
5562
5569
  requestParams.bbox = [minX, minY, maxX, maxY];
5563
5570
  }
5564
5571
  try {
5572
+ this.state.loadCounter++;
5565
5573
  this.props.onImageLoadStart(requestId);
5566
5574
  const image = await this.state.imageSource.getImage(requestParams);
5567
5575
  if (this.state.lastRequestId < requestId) {
@@ -5576,6 +5584,8 @@ var __exports__ = (() => {
5576
5584
  } catch (error2) {
5577
5585
  this.raiseError(error2, "Load image");
5578
5586
  this.getCurrentLayer()?.props.onImageLoadError(requestId, error2);
5587
+ } finally {
5588
+ this.state.loadCounter--;
5579
5589
  }
5580
5590
  }
5581
5591
  getRequestId() {
@@ -19,6 +19,8 @@ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/creat
19
19
 
20
20
  var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
21
21
 
22
+ var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
23
+
22
24
  var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
23
25
 
24
26
  var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
@@ -98,6 +100,11 @@ var WMSLayer = function (_CompositeLayer) {
98
100
  }
99
101
 
100
102
  (0, _createClass2.default)(WMSLayer, [{
103
+ key: "isLoaded",
104
+ get: function get() {
105
+ return Boolean(this.state) && this.state.loadCounter === 0 && (0, _get2.default)((0, _getPrototypeOf2.default)(WMSLayer.prototype), "isLoaded", this);
106
+ }
107
+ }, {
101
108
  key: "shouldUpdateState",
102
109
  value: function shouldUpdateState() {
103
110
  return true;
@@ -107,6 +114,7 @@ var WMSLayer = function (_CompositeLayer) {
107
114
  value: function initializeState() {
108
115
  this.state._nextRequestId = 0;
109
116
  this.state.lastRequestId = -1;
117
+ this.state.loadCounter = 0;
110
118
  }
111
119
  }, {
112
120
  key: "updateState",
@@ -229,30 +237,36 @@ var WMSLayer = function (_CompositeLayer) {
229
237
  case 0:
230
238
  imageSource = this.state.imageSource;
231
239
  _context2.prev = 1;
232
- _context2.next = 4;
240
+ this.state.loadCounter++;
241
+ _context2.next = 5;
233
242
  return imageSource.getMetadata();
234
243
 
235
- case 4:
244
+ case 5:
236
245
  _metadata = _context2.sent;
237
246
 
238
247
  if (this.state.imageSource === imageSource) {
239
248
  (_this$getCurrentLayer = this.getCurrentLayer()) === null || _this$getCurrentLayer === void 0 ? void 0 : _this$getCurrentLayer.props.onMetadataLoad(_metadata);
240
249
  }
241
250
 
242
- _context2.next = 11;
251
+ _context2.next = 12;
243
252
  break;
244
253
 
245
- case 8:
246
- _context2.prev = 8;
254
+ case 9:
255
+ _context2.prev = 9;
247
256
  _context2.t0 = _context2["catch"](1);
248
257
  (_this$getCurrentLayer2 = this.getCurrentLayer()) === null || _this$getCurrentLayer2 === void 0 ? void 0 : _this$getCurrentLayer2.props.onMetadataLoadError(_context2.t0);
249
258
 
250
- case 11:
259
+ case 12:
260
+ _context2.prev = 12;
261
+ this.state.loadCounter--;
262
+ return _context2.finish(12);
263
+
264
+ case 15:
251
265
  case "end":
252
266
  return _context2.stop();
253
267
  }
254
268
  }
255
- }, _callee2, this, [[1, 8]]);
269
+ }, _callee2, this, [[1, 9, 12, 15]]);
256
270
  }));
257
271
 
258
272
  function _loadMetadata() {
@@ -305,11 +319,12 @@ var WMSLayer = function (_CompositeLayer) {
305
319
  }
306
320
 
307
321
  _context3.prev = 10;
322
+ this.state.loadCounter++;
308
323
  this.props.onImageLoadStart(requestId);
309
- _context3.next = 14;
324
+ _context3.next = 15;
310
325
  return this.state.imageSource.getImage(requestParams);
311
326
 
312
- case 14:
327
+ case 15:
313
328
  image = _context3.sent;
314
329
 
315
330
  if (this.state.lastRequestId < requestId) {
@@ -322,21 +337,26 @@ var WMSLayer = function (_CompositeLayer) {
322
337
  });
323
338
  }
324
339
 
325
- _context3.next = 22;
340
+ _context3.next = 23;
326
341
  break;
327
342
 
328
- case 18:
329
- _context3.prev = 18;
343
+ case 19:
344
+ _context3.prev = 19;
330
345
  _context3.t0 = _context3["catch"](10);
331
346
  this.raiseError(_context3.t0, 'Load image');
332
347
  (_this$getCurrentLayer4 = this.getCurrentLayer()) === null || _this$getCurrentLayer4 === void 0 ? void 0 : _this$getCurrentLayer4.props.onImageLoadError(requestId, _context3.t0);
333
348
 
334
- case 22:
349
+ case 23:
350
+ _context3.prev = 23;
351
+ this.state.loadCounter--;
352
+ return _context3.finish(23);
353
+
354
+ case 26:
335
355
  case "end":
336
356
  return _context3.stop();
337
357
  }
338
358
  }
339
- }, _callee3, this, [[10, 18]]);
359
+ }, _callee3, this, [[10, 19, 23, 26]]);
340
360
  }));
341
361
 
342
362
  function loadImage(_x3, _x4) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/wms-layer/wms-layer.ts"],"names":["defaultProps","id","data","serviceType","srs","layers","type","compare","value","onMetadataLoad","onMetadataLoadError","console","error","onImageLoadStart","onImageLoad","onImageLoadError","requestId","WMSLayer","state","_nextRequestId","lastRequestId","changeFlags","props","oldProps","viewport","context","dataChanged","imageSource","_createImageSource","_loadMetadata","debounce","loadImage","viewportChanged","bounds","image","lastRequestParameters","BitmapLayer","getSubLayerProps","_imageCoordinateSystem","COORDINATE_SYSTEM","LNGLAT","CARTESIAN","x","y","getFeatureInfoText","query_layers","info_format","featureInfo","ImageSource","url","loadOptions","Error","getMetadata","metadata","getCurrentLayer","reason","length","getBounds","width","height","getRequestId","resolution","requestParams","bbox","minX","minY","maxX","maxY","getImage","setState","raiseError","fn","ms","clearTimeout","_timeoutId","setTimeout","CompositeLayer"],"mappings":"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","sourcesContent":["// deck.gl, MIT license\n// Attributions:\n// Copyright 2022 Foursquare Labs, Inc.\n\n/* eslint-disable camelcase */ // Some WMS parameters are not in camel case\n/* global setTimeout, clearTimeout */\n\nimport {\n Layer,\n CompositeLayer,\n CompositeLayerProps,\n UpdateParameters,\n DefaultProps,\n Viewport,\n COORDINATE_SYSTEM,\n _deepEqual as deepEqual\n} from '@deck.gl/core';\nimport {BitmapLayer} from '@deck.gl/layers';\nimport type {ImageSourceMetadata, ImageType, ImageServiceType} from '@loaders.gl/wms';\nimport {ImageSource, createImageSource} from '@loaders.gl/wms';\nimport {WGS84ToPseudoMercator} from './utils';\n\n/** All props supported by the TileLayer */\nexport type WMSLayerProps = CompositeLayerProps & _WMSLayerProps;\n\n/** Props added by the TileLayer */\ntype _WMSLayerProps = {\n data: string | ImageSource;\n serviceType?: ImageServiceType | 'auto';\n layers?: string[];\n srs?: 'EPSG:4326' | 'EPSG:3857' | 'auto';\n onMetadataLoad?: (metadata: ImageSourceMetadata) => void;\n onMetadataLoadError?: (error: Error) => void;\n onImageLoadStart?: (requestId: unknown) => void;\n onImageLoad?: (requestId: unknown) => void;\n onImageLoadError?: (requestId: unknown, error: Error) => void;\n};\n\nconst defaultProps: DefaultProps<WMSLayerProps> = {\n id: 'imagery-layer',\n data: '',\n serviceType: 'auto',\n srs: 'auto',\n layers: {type: 'array', compare: true, value: []},\n onMetadataLoad: {type: 'function', value: () => {}},\n // eslint-disable-next-line\n onMetadataLoadError: {type: 'function', value: console.error},\n onImageLoadStart: {type: 'function', value: () => {}},\n onImageLoad: {type: 'function', value: () => {}},\n onImageLoadError: {\n type: 'function',\n compare: false,\n // eslint-disable-next-line\n value: (requestId: unknown, error: Error) => console.error(error, requestId)\n }\n};\n\n/**\n * The layer is used in Hex Tile layer in order to properly discard invisible elements during animation\n */\nexport class WMSLayer<ExtraPropsT extends {} = {}> extends CompositeLayer<\n ExtraPropsT & Required<_WMSLayerProps>\n> {\n static layerName = 'WMSLayer';\n static defaultProps: DefaultProps = defaultProps;\n\n state!: {\n imageSource: ImageSource;\n image: ImageType;\n bounds: [number, number, number, number];\n lastRequestParameters: {\n bbox: [number, number, number, number];\n layers: string[];\n srs: 'EPSG:4326' | 'EPSG:3857';\n width: number;\n height: number;\n };\n lastRequestId: number;\n\n _nextRequestId: number;\n _timeoutId: any;\n };\n\n /** Lets deck.gl know that we want viewport change events */\n override shouldUpdateState(): boolean {\n return true;\n }\n\n override initializeState(): void {\n // intentionally empty, initialization is done in updateState\n this.state._nextRequestId = 0;\n this.state.lastRequestId = -1;\n }\n\n override updateState({changeFlags, props, oldProps}: UpdateParameters<this>): void {\n const {viewport} = this.context;\n\n // Check if data source has changed\n if (changeFlags.dataChanged || props.serviceType !== oldProps.serviceType) {\n this.state.imageSource = this._createImageSource(props);\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._loadMetadata();\n this.debounce(() => this.loadImage(viewport, 'image source changed'), 0);\n } else if (!deepEqual(props.layers, oldProps.layers, 1)) {\n this.debounce(() => this.loadImage(viewport, 'layers changed'), 0);\n } else if (changeFlags.viewportChanged) {\n this.debounce(() => this.loadImage(viewport, 'viewport changed'));\n }\n }\n\n override finalizeState(): void {\n // TODO - we could cancel outstanding requests\n }\n\n override renderLayers(): Layer {\n // TODO - which bitmap layer is rendered should depend on the current viewport\n // Currently Studio only uses one viewport\n const {bounds, image, lastRequestParameters} = this.state;\n\n return (\n image &&\n new BitmapLayer({\n ...this.getSubLayerProps({id: 'bitmap'}),\n _imageCoordinateSystem:\n lastRequestParameters.srs === 'EPSG:4326'\n ? COORDINATE_SYSTEM.LNGLAT\n : COORDINATE_SYSTEM.CARTESIAN,\n bounds,\n image\n })\n );\n }\n\n async getFeatureInfoText(x: number, y: number): Promise<string | null> {\n const {lastRequestParameters} = this.state;\n if (lastRequestParameters) {\n // @ts-expect-error Undocumented method\n const featureInfo = await this.state.imageSource.getFeatureInfoText?.({\n ...lastRequestParameters,\n query_layers: lastRequestParameters.layers,\n x,\n y,\n info_format: 'application/vnd.ogc.gml'\n });\n return featureInfo;\n }\n return '';\n }\n\n _createImageSource(props: WMSLayerProps): ImageSource {\n if (props.data instanceof ImageSource) {\n return props.data;\n }\n\n if (typeof props.data === 'string') {\n return createImageSource({\n url: props.data,\n loadOptions: props.loadOptions,\n type: props.serviceType\n });\n }\n\n throw new Error('invalid image source in props.data');\n }\n\n /** Run a getMetadata on the image service */\n async _loadMetadata(): Promise<void> {\n const {imageSource} = this.state;\n try {\n const metadata = await imageSource.getMetadata();\n\n // If a request takes a long time, it may no longer be expected\n if (this.state.imageSource === imageSource) {\n this.getCurrentLayer()?.props.onMetadataLoad(metadata);\n }\n } catch (error) {\n this.getCurrentLayer()?.props.onMetadataLoadError(error as Error);\n }\n }\n\n /** Load an image */\n async loadImage(viewport: Viewport, reason: string): Promise<void> {\n const {layers, serviceType} = this.props;\n\n // TODO - move to ImageSource?\n if (serviceType === 'wms' && layers.length === 0) {\n return;\n }\n\n const bounds = viewport.getBounds();\n const {width, height} = viewport;\n const requestId = this.getRequestId();\n let {srs} = this.props;\n if (srs === 'auto') {\n // BitmapLayer only supports LNGLAT or CARTESIAN (Web-Mercator)\n srs = viewport.resolution ? 'EPSG:4326' : 'EPSG:3857';\n }\n const requestParams = {\n width,\n height,\n bbox: bounds,\n layers,\n srs\n };\n if (srs === 'EPSG:3857') {\n const [minX, minY] = WGS84ToPseudoMercator([bounds[0], bounds[1]]);\n const [maxX, maxY] = WGS84ToPseudoMercator([bounds[2], bounds[3]]);\n requestParams.bbox = [minX, minY, maxX, maxY];\n }\n\n try {\n this.props.onImageLoadStart(requestId);\n\n const image = await this.state.imageSource.getImage(requestParams);\n\n // If a request takes a long time, later requests may have already loaded.\n if (this.state.lastRequestId < requestId) {\n this.getCurrentLayer()?.props.onImageLoad(requestId);\n // Not type safe...\n this.setState({\n image,\n bounds,\n lastRequestParameters: requestParams,\n lastRequestId: requestId\n });\n }\n } catch (error) {\n this.raiseError(error as Error, 'Load image');\n this.getCurrentLayer()?.props.onImageLoadError(requestId, error as Error);\n }\n }\n\n // HELPERS\n\n /** Global counter for issuing unique request ids */\n private getRequestId(): number {\n return this.state._nextRequestId++;\n }\n\n /** Runs an action in the future, cancels it if the new action is issued before it executes */\n private debounce(fn: Function, ms = 500): void {\n clearTimeout(this.state._timeoutId);\n this.state._timeoutId = setTimeout(() => fn(), ms);\n }\n}\n"],"file":"wms-layer.js"}
1
+ {"version":3,"sources":["../../../src/wms-layer/wms-layer.ts"],"names":["defaultProps","id","data","serviceType","srs","layers","type","compare","value","onMetadataLoad","onMetadataLoadError","console","error","onImageLoadStart","onImageLoad","onImageLoadError","requestId","WMSLayer","Boolean","state","loadCounter","_nextRequestId","lastRequestId","changeFlags","props","oldProps","viewport","context","dataChanged","imageSource","_createImageSource","_loadMetadata","debounce","loadImage","viewportChanged","bounds","image","lastRequestParameters","BitmapLayer","getSubLayerProps","_imageCoordinateSystem","COORDINATE_SYSTEM","LNGLAT","CARTESIAN","x","y","getFeatureInfoText","query_layers","info_format","featureInfo","ImageSource","url","loadOptions","Error","getMetadata","metadata","getCurrentLayer","reason","length","getBounds","width","height","getRequestId","resolution","requestParams","bbox","minX","minY","maxX","maxY","getImage","setState","raiseError","fn","ms","clearTimeout","_timeoutId","setTimeout","CompositeLayer"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA;;AAUA;;AAEA;;AACA;;;;;;;;;;AAkBA,IAAMA,YAAyC,GAAG;AAChDC,EAAAA,EAAE,EAAE,eAD4C;AAEhDC,EAAAA,IAAI,EAAE,EAF0C;AAGhDC,EAAAA,WAAW,EAAE,MAHmC;AAIhDC,EAAAA,GAAG,EAAE,MAJ2C;AAKhDC,EAAAA,MAAM,EAAE;AAACC,IAAAA,IAAI,EAAE,OAAP;AAAgBC,IAAAA,OAAO,EAAE,IAAzB;AAA+BC,IAAAA,KAAK,EAAE;AAAtC,GALwC;AAMhDC,EAAAA,cAAc,EAAE;AAACH,IAAAA,IAAI,EAAE,UAAP;AAAmBE,IAAAA,KAAK,EAAE,iBAAM,CAAE;AAAlC,GANgC;AAQhDE,EAAAA,mBAAmB,EAAE;AAACJ,IAAAA,IAAI,EAAE,UAAP;AAAmBE,IAAAA,KAAK,EAAEG,OAAO,CAACC;AAAlC,GAR2B;AAShDC,EAAAA,gBAAgB,EAAE;AAACP,IAAAA,IAAI,EAAE,UAAP;AAAmBE,IAAAA,KAAK,EAAE,iBAAM,CAAE;AAAlC,GAT8B;AAUhDM,EAAAA,WAAW,EAAE;AAACR,IAAAA,IAAI,EAAE,UAAP;AAAmBE,IAAAA,KAAK,EAAE,iBAAM,CAAE;AAAlC,GAVmC;AAWhDO,EAAAA,gBAAgB,EAAE;AAChBT,IAAAA,IAAI,EAAE,UADU;AAEhBC,IAAAA,OAAO,EAAE,KAFO;AAIhBC,IAAAA,KAAK,EAAE,eAACQ,SAAD,EAAqBJ,KAArB;AAAA,aAAsCD,OAAO,CAACC,KAAR,CAAcA,KAAd,EAAqBI,SAArB,CAAtC;AAAA;AAJS;AAX8B,CAAlD;;IAsBaC,Q;;;;;;;;;;;;;;;;;;;;;SAyBX,eAAwB;AAEtB,aAAOC,OAAO,CAAC,KAAKC,KAAN,CAAP,IAAuB,KAAKA,KAAL,CAAWC,WAAX,KAA2B,CAAlD,2FAAP;AACD;;;WAGD,6BAAsC;AACpC,aAAO,IAAP;AACD;;;WAED,2BAAiC;AAE/B,WAAKD,KAAL,CAAWE,cAAX,GAA4B,CAA5B;AACA,WAAKF,KAAL,CAAWG,aAAX,GAA2B,CAAC,CAA5B;AACA,WAAKH,KAAL,CAAWC,WAAX,GAAyB,CAAzB;AACD;;;WAED,2BAAmF;AAAA;;AAAA,UAA7DG,WAA6D,QAA7DA,WAA6D;AAAA,UAAhDC,KAAgD,QAAhDA,KAAgD;AAAA,UAAzCC,QAAyC,QAAzCA,QAAyC;AACjF,UAAOC,QAAP,GAAmB,KAAKC,OAAxB,CAAOD,QAAP;;AAGA,UAAIH,WAAW,CAACK,WAAZ,IAA2BJ,KAAK,CAACrB,WAAN,KAAsBsB,QAAQ,CAACtB,WAA9D,EAA2E;AACzE,aAAKgB,KAAL,CAAWU,WAAX,GAAyB,KAAKC,kBAAL,CAAwBN,KAAxB,CAAzB;;AAEA,aAAKO,aAAL;;AACA,aAAKC,QAAL,CAAc;AAAA,iBAAM,MAAI,CAACC,SAAL,CAAeP,QAAf,EAAyB,sBAAzB,CAAN;AAAA,SAAd,EAAsE,CAAtE;AACD,OALD,MAKO,IAAI,CAAC,sBAAUF,KAAK,CAACnB,MAAhB,EAAwBoB,QAAQ,CAACpB,MAAjC,EAAyC,CAAzC,CAAL,EAAkD;AACvD,aAAK2B,QAAL,CAAc;AAAA,iBAAM,MAAI,CAACC,SAAL,CAAeP,QAAf,EAAyB,gBAAzB,CAAN;AAAA,SAAd,EAAgE,CAAhE;AACD,OAFM,MAEA,IAAIH,WAAW,CAACW,eAAhB,EAAiC;AACtC,aAAKF,QAAL,CAAc;AAAA,iBAAM,MAAI,CAACC,SAAL,CAAeP,QAAf,EAAyB,kBAAzB,CAAN;AAAA,SAAd;AACD;AACF;;;WAED,yBAA+B,CAE9B;;;WAED,wBAA+B;AAG7B,wBAA+C,KAAKP,KAApD;AAAA,UAAOgB,MAAP,eAAOA,MAAP;AAAA,UAAeC,KAAf,eAAeA,KAAf;AAAA,UAAsBC,qBAAtB,eAAsBA,qBAAtB;AAEA,aACED,KAAK,IACL,IAAIE,mBAAJ,iCACK,KAAKC,gBAAL,CAAsB;AAACtC,QAAAA,EAAE,EAAE;AAAL,OAAtB,CADL;AAEEuC,QAAAA,sBAAsB,EACpBH,qBAAqB,CAACjC,GAAtB,KAA8B,WAA9B,GACIqC,wBAAkBC,MADtB,GAEID,wBAAkBE,SAL1B;AAMER,QAAAA,MAAM,EAANA,MANF;AAOEC,QAAAA,KAAK,EAALA;AAPF,SAFF;AAYD;;;;0FAED,iBAAyBQ,CAAzB,EAAoCC,CAApC;AAAA;;AAAA;AAAA;AAAA;AAAA;AACSR,gBAAAA,qBADT,GACkC,KAAKlB,KADvC,CACSkB,qBADT;;AAAA,qBAEMA,qBAFN;AAAA;AAAA;AAAA;;AAAA;AAAA,gDAI8B,+BAAKlB,KAAL,CAAWU,WAAX,EAAuBiB,kBAJrD,0DAI8B,mFACrBT,qBADqB;AAExBU,kBAAAA,YAAY,EAAEV,qBAAqB,CAAChC,MAFZ;AAGxBuC,kBAAAA,CAAC,EAADA,CAHwB;AAIxBC,kBAAAA,CAAC,EAADA,CAJwB;AAKxBG,kBAAAA,WAAW,EAAE;AALW,mBAJ9B;;AAAA;AAIUC,gBAAAA,WAJV;AAAA,iDAWWA,WAXX;;AAAA;AAAA,iDAaS,EAbT;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,O;;;;;;;;;;WAgBA,4BAAmBzB,KAAnB,EAAsD;AACpD,UAAIA,KAAK,CAACtB,IAAN,YAAsBgD,gBAA1B,EAAuC;AACrC,eAAO1B,KAAK,CAACtB,IAAb;AACD;;AAED,UAAI,OAAOsB,KAAK,CAACtB,IAAb,KAAsB,QAA1B,EAAoC;AAClC,eAAO,4BAAkB;AACvBiD,UAAAA,GAAG,EAAE3B,KAAK,CAACtB,IADY;AAEvBkD,UAAAA,WAAW,EAAE5B,KAAK,CAAC4B,WAFI;AAGvB9C,UAAAA,IAAI,EAAEkB,KAAK,CAACrB;AAHW,SAAlB,CAAP;AAKD;;AAED,YAAM,IAAIkD,KAAJ,CAAU,oCAAV,CAAN;AACD;;;;qFAGD;AAAA;;AAAA;AAAA;AAAA;AAAA;AACSxB,gBAAAA,WADT,GACwB,KAAKV,KAD7B,CACSU,WADT;AAAA;AAGI,qBAAKV,KAAL,CAAWC,WAAX;AAHJ;AAAA,uBAI2BS,WAAW,CAACyB,WAAZ,EAJ3B;;AAAA;AAIUC,gBAAAA,SAJV;;AAOI,oBAAI,KAAKpC,KAAL,CAAWU,WAAX,KAA2BA,WAA/B,EAA4C;AAC1C,gDAAK2B,eAAL,kFAAwBhC,KAAxB,CAA8Bf,cAA9B,CAA6C8C,SAA7C;AACD;;AATL;AAAA;;AAAA;AAAA;AAAA;AAWI,+CAAKC,eAAL,oFAAwBhC,KAAxB,CAA8Bd,mBAA9B;;AAXJ;AAAA;AAaI,qBAAKS,KAAL,CAAWC,WAAX;AAbJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,O;;;;;;;;;;;iFAkBA,kBAAgBM,QAAhB,EAAoC+B,MAApC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,8BACgC,KAAKjC,KADrC,EACSnB,MADT,eACSA,MADT,EACiBF,WADjB,eACiBA,WADjB;;AAAA,sBAIMA,WAAW,KAAK,KAAhB,IAAyBE,MAAM,CAACqD,MAAP,KAAkB,CAJjD;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAQQvB,gBAAAA,MARR,GAQiBT,QAAQ,CAACiC,SAAT,EARjB;AASSC,gBAAAA,KATT,GAS0BlC,QAT1B,CASSkC,KATT,EASgBC,MAThB,GAS0BnC,QAT1B,CASgBmC,MAThB;AAUQ7C,gBAAAA,SAVR,GAUoB,KAAK8C,YAAL,EAVpB;AAWO1D,gBAAAA,GAXP,GAWc,KAAKoB,KAXnB,CAWOpB,GAXP;;AAYE,oBAAIA,GAAG,KAAK,MAAZ,EAAoB;AAElBA,kBAAAA,GAAG,GAAGsB,QAAQ,CAACqC,UAAT,GAAsB,WAAtB,GAAoC,WAA1C;AACD;;AACKC,gBAAAA,aAhBR,GAgBwB;AACpBJ,kBAAAA,KAAK,EAALA,KADoB;AAEpBC,kBAAAA,MAAM,EAANA,MAFoB;AAGpBI,kBAAAA,IAAI,EAAE9B,MAHc;AAIpB9B,kBAAAA,MAAM,EAANA,MAJoB;AAKpBD,kBAAAA,GAAG,EAAHA;AALoB,iBAhBxB;;AAuBE,oBAAIA,GAAG,KAAK,WAAZ,EAAyB;AAAA,0CACF,kCAAsB,CAAC+B,MAAM,CAAC,CAAD,CAAP,EAAYA,MAAM,CAAC,CAAD,CAAlB,CAAtB,CADE,mFAChB+B,IADgB,8BACVC,IADU;AAAA,2CAEF,kCAAsB,CAAChC,MAAM,CAAC,CAAD,CAAP,EAAYA,MAAM,CAAC,CAAD,CAAlB,CAAtB,CAFE,oFAEhBiC,IAFgB,8BAEVC,IAFU;AAGvBL,kBAAAA,aAAa,CAACC,IAAd,GAAqB,CAACC,IAAD,EAAOC,IAAP,EAAaC,IAAb,EAAmBC,IAAnB,CAArB;AACD;;AA3BH;AA8BI,qBAAKlD,KAAL,CAAWC,WAAX;AACA,qBAAKI,KAAL,CAAWX,gBAAX,CAA4BG,SAA5B;AA/BJ;AAAA,uBAiCwB,KAAKG,KAAL,CAAWU,WAAX,CAAuByC,QAAvB,CAAgCN,aAAhC,CAjCxB;;AAAA;AAiCU5B,gBAAAA,KAjCV;;AAoCI,oBAAI,KAAKjB,KAAL,CAAWG,aAAX,GAA2BN,SAA/B,EAA0C;AACxC,iDAAKwC,eAAL,oFAAwBhC,KAAxB,CAA8BV,WAA9B,CAA0CE,SAA1C;AAEA,uBAAKuD,QAAL,CAAc;AACZnC,oBAAAA,KAAK,EAALA,KADY;AAEZD,oBAAAA,MAAM,EAANA,MAFY;AAGZE,oBAAAA,qBAAqB,EAAE2B,aAHX;AAIZ1C,oBAAAA,aAAa,EAAEN;AAJH,mBAAd;AAMD;;AA7CL;AAAA;;AAAA;AAAA;AAAA;AA+CI,qBAAKwD,UAAL,eAAgC,YAAhC;AACA,+CAAKhB,eAAL,oFAAwBhC,KAAxB,CAA8BT,gBAA9B,CAA+CC,SAA/C;;AAhDJ;AAAA;AAkDI,qBAAKG,KAAL,CAAWC,WAAX;AAlDJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,O;;;;;;;;;;WAyDA,wBAA+B;AAC7B,aAAO,KAAKD,KAAL,CAAWE,cAAX,EAAP;AACD;;;WAGD,kBAAiBoD,EAAjB,EAA+C;AAAA,UAAhBC,EAAgB,uEAAX,GAAW;AAC7CC,MAAAA,YAAY,CAAC,KAAKxD,KAAL,CAAWyD,UAAZ,CAAZ;AACA,WAAKzD,KAAL,CAAWyD,UAAX,GAAwBC,UAAU,CAAC;AAAA,eAAMJ,EAAE,EAAR;AAAA,OAAD,EAAaC,EAAb,CAAlC;AACD;;;EArMwDI,oB;;;8BAA9C7D,Q,eAGQ,U;8BAHRA,Q,kBAIyBjB,Y","sourcesContent":["// deck.gl, MIT license\n// Attributions:\n// Copyright 2022 Foursquare Labs, Inc.\n\n/* eslint-disable camelcase */ // Some WMS parameters are not in camel case\n/* global setTimeout, clearTimeout */\n\nimport {\n Layer,\n CompositeLayer,\n CompositeLayerProps,\n UpdateParameters,\n DefaultProps,\n Viewport,\n COORDINATE_SYSTEM,\n _deepEqual as deepEqual\n} from '@deck.gl/core';\nimport {BitmapLayer} from '@deck.gl/layers';\nimport type {ImageSourceMetadata, ImageType, ImageServiceType} from '@loaders.gl/wms';\nimport {ImageSource, createImageSource} from '@loaders.gl/wms';\nimport {WGS84ToPseudoMercator} from './utils';\n\n/** All props supported by the TileLayer */\nexport type WMSLayerProps = CompositeLayerProps & _WMSLayerProps;\n\n/** Props added by the TileLayer */\ntype _WMSLayerProps = {\n data: string | ImageSource;\n serviceType?: ImageServiceType | 'auto';\n layers?: string[];\n srs?: 'EPSG:4326' | 'EPSG:3857' | 'auto';\n onMetadataLoad?: (metadata: ImageSourceMetadata) => void;\n onMetadataLoadError?: (error: Error) => void;\n onImageLoadStart?: (requestId: unknown) => void;\n onImageLoad?: (requestId: unknown) => void;\n onImageLoadError?: (requestId: unknown, error: Error) => void;\n};\n\nconst defaultProps: DefaultProps<WMSLayerProps> = {\n id: 'imagery-layer',\n data: '',\n serviceType: 'auto',\n srs: 'auto',\n layers: {type: 'array', compare: true, value: []},\n onMetadataLoad: {type: 'function', value: () => {}},\n // eslint-disable-next-line\n onMetadataLoadError: {type: 'function', value: console.error},\n onImageLoadStart: {type: 'function', value: () => {}},\n onImageLoad: {type: 'function', value: () => {}},\n onImageLoadError: {\n type: 'function',\n compare: false,\n // eslint-disable-next-line\n value: (requestId: unknown, error: Error) => console.error(error, requestId)\n }\n};\n\n/**\n * The layer is used in Hex Tile layer in order to properly discard invisible elements during animation\n */\nexport class WMSLayer<ExtraPropsT extends {} = {}> extends CompositeLayer<\n ExtraPropsT & Required<_WMSLayerProps>\n> {\n static layerName = 'WMSLayer';\n static defaultProps: DefaultProps = defaultProps;\n\n state!: {\n imageSource: ImageSource;\n image: ImageType;\n bounds: [number, number, number, number];\n lastRequestParameters: {\n bbox: [number, number, number, number];\n layers: string[];\n srs: 'EPSG:4326' | 'EPSG:3857';\n width: number;\n height: number;\n };\n lastRequestId: number;\n _nextRequestId: number;\n /** TODO: Change any => setTimeout return type. Different between Node and browser... */\n _timeoutId: any;\n loadCounter: number;\n };\n\n /** Returns true if all async resources are loaded */\n get isLoaded(): boolean {\n // Track the explicit loading done by this layer\n return Boolean(this.state) && this.state.loadCounter === 0 && super.isLoaded;\n }\n\n /** Lets deck.gl know that we want viewport change events */\n override shouldUpdateState(): boolean {\n return true;\n }\n\n override initializeState(): void {\n // intentionally empty, initialization is done in updateState\n this.state._nextRequestId = 0;\n this.state.lastRequestId = -1;\n this.state.loadCounter = 0;\n }\n\n override updateState({changeFlags, props, oldProps}: UpdateParameters<this>): void {\n const {viewport} = this.context;\n\n // Check if data source has changed\n if (changeFlags.dataChanged || props.serviceType !== oldProps.serviceType) {\n this.state.imageSource = this._createImageSource(props);\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._loadMetadata();\n this.debounce(() => this.loadImage(viewport, 'image source changed'), 0);\n } else if (!deepEqual(props.layers, oldProps.layers, 1)) {\n this.debounce(() => this.loadImage(viewport, 'layers changed'), 0);\n } else if (changeFlags.viewportChanged) {\n this.debounce(() => this.loadImage(viewport, 'viewport changed'));\n }\n }\n\n override finalizeState(): void {\n // TODO - we could cancel outstanding requests\n }\n\n override renderLayers(): Layer {\n // TODO - which bitmap layer is rendered should depend on the current viewport\n // Currently Studio only uses one viewport\n const {bounds, image, lastRequestParameters} = this.state;\n\n return (\n image &&\n new BitmapLayer({\n ...this.getSubLayerProps({id: 'bitmap'}),\n _imageCoordinateSystem:\n lastRequestParameters.srs === 'EPSG:4326'\n ? COORDINATE_SYSTEM.LNGLAT\n : COORDINATE_SYSTEM.CARTESIAN,\n bounds,\n image\n })\n );\n }\n\n async getFeatureInfoText(x: number, y: number): Promise<string | null> {\n const {lastRequestParameters} = this.state;\n if (lastRequestParameters) {\n // @ts-expect-error Undocumented method\n const featureInfo = await this.state.imageSource.getFeatureInfoText?.({\n ...lastRequestParameters,\n query_layers: lastRequestParameters.layers,\n x,\n y,\n info_format: 'application/vnd.ogc.gml'\n });\n return featureInfo;\n }\n return '';\n }\n\n _createImageSource(props: WMSLayerProps): ImageSource {\n if (props.data instanceof ImageSource) {\n return props.data;\n }\n\n if (typeof props.data === 'string') {\n return createImageSource({\n url: props.data,\n loadOptions: props.loadOptions,\n type: props.serviceType\n });\n }\n\n throw new Error('invalid image source in props.data');\n }\n\n /** Run a getMetadata on the image service */\n async _loadMetadata(): Promise<void> {\n const {imageSource} = this.state;\n try {\n this.state.loadCounter++;\n const metadata = await imageSource.getMetadata();\n\n // If a request takes a long time, it may no longer be expected\n if (this.state.imageSource === imageSource) {\n this.getCurrentLayer()?.props.onMetadataLoad(metadata);\n }\n } catch (error) {\n this.getCurrentLayer()?.props.onMetadataLoadError(error as Error);\n } finally {\n this.state.loadCounter--;\n }\n }\n\n /** Load an image */\n async loadImage(viewport: Viewport, reason: string): Promise<void> {\n const {layers, serviceType} = this.props;\n\n // TODO - move to ImageSource?\n if (serviceType === 'wms' && layers.length === 0) {\n return;\n }\n\n const bounds = viewport.getBounds();\n const {width, height} = viewport;\n const requestId = this.getRequestId();\n let {srs} = this.props;\n if (srs === 'auto') {\n // BitmapLayer only supports LNGLAT or CARTESIAN (Web-Mercator)\n srs = viewport.resolution ? 'EPSG:4326' : 'EPSG:3857';\n }\n const requestParams = {\n width,\n height,\n bbox: bounds,\n layers,\n srs\n };\n if (srs === 'EPSG:3857') {\n const [minX, minY] = WGS84ToPseudoMercator([bounds[0], bounds[1]]);\n const [maxX, maxY] = WGS84ToPseudoMercator([bounds[2], bounds[3]]);\n requestParams.bbox = [minX, minY, maxX, maxY];\n }\n\n try {\n this.state.loadCounter++;\n this.props.onImageLoadStart(requestId);\n\n const image = await this.state.imageSource.getImage(requestParams);\n\n // If a request takes a long time, later requests may have already loaded.\n if (this.state.lastRequestId < requestId) {\n this.getCurrentLayer()?.props.onImageLoad(requestId);\n // Not type safe...\n this.setState({\n image,\n bounds,\n lastRequestParameters: requestParams,\n lastRequestId: requestId\n });\n }\n } catch (error) {\n this.raiseError(error as Error, 'Load image');\n this.getCurrentLayer()?.props.onImageLoadError(requestId, error as Error);\n } finally {\n this.state.loadCounter--;\n }\n }\n\n // HELPERS\n\n /** Global counter for issuing unique request ids */\n private getRequestId(): number {\n return this.state._nextRequestId++;\n }\n\n /** Runs an action in the future, cancels it if the new action is issued before it executes */\n private debounce(fn: Function, ms = 500): void {\n clearTimeout(this.state._timeoutId);\n this.state._timeoutId = setTimeout(() => fn(), ms);\n }\n}\n"],"file":"wms-layer.js"}
@@ -42,6 +42,10 @@ export class WMSLayer extends CompositeLayer {
42
42
  _defineProperty(this, "state", void 0);
43
43
  }
44
44
 
45
+ get isLoaded() {
46
+ return Boolean(this.state) && this.state.loadCounter === 0 && super.isLoaded;
47
+ }
48
+
45
49
  shouldUpdateState() {
46
50
  return true;
47
51
  }
@@ -49,6 +53,7 @@ export class WMSLayer extends CompositeLayer {
49
53
  initializeState() {
50
54
  this.state._nextRequestId = 0;
51
55
  this.state.lastRequestId = -1;
56
+ this.state.loadCounter = 0;
52
57
  }
53
58
 
54
59
  updateState({
@@ -132,6 +137,7 @@ export class WMSLayer extends CompositeLayer {
132
137
  } = this.state;
133
138
 
134
139
  try {
140
+ this.state.loadCounter++;
135
141
  const metadata = await imageSource.getMetadata();
136
142
 
137
143
  if (this.state.imageSource === imageSource) {
@@ -143,6 +149,8 @@ export class WMSLayer extends CompositeLayer {
143
149
  var _this$getCurrentLayer2;
144
150
 
145
151
  (_this$getCurrentLayer2 = this.getCurrentLayer()) === null || _this$getCurrentLayer2 === void 0 ? void 0 : _this$getCurrentLayer2.props.onMetadataLoadError(error);
152
+ } finally {
153
+ this.state.loadCounter--;
146
154
  }
147
155
  }
148
156
 
@@ -185,6 +193,7 @@ export class WMSLayer extends CompositeLayer {
185
193
  }
186
194
 
187
195
  try {
196
+ this.state.loadCounter++;
188
197
  this.props.onImageLoadStart(requestId);
189
198
  const image = await this.state.imageSource.getImage(requestParams);
190
199
 
@@ -204,6 +213,8 @@ export class WMSLayer extends CompositeLayer {
204
213
 
205
214
  this.raiseError(error, 'Load image');
206
215
  (_this$getCurrentLayer4 = this.getCurrentLayer()) === null || _this$getCurrentLayer4 === void 0 ? void 0 : _this$getCurrentLayer4.props.onImageLoadError(requestId, error);
216
+ } finally {
217
+ this.state.loadCounter--;
207
218
  }
208
219
  }
209
220
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/wms-layer/wms-layer.ts"],"names":["CompositeLayer","COORDINATE_SYSTEM","_deepEqual","deepEqual","BitmapLayer","ImageSource","createImageSource","WGS84ToPseudoMercator","defaultProps","id","data","serviceType","srs","layers","type","compare","value","onMetadataLoad","onMetadataLoadError","console","error","onImageLoadStart","onImageLoad","onImageLoadError","requestId","WMSLayer","shouldUpdateState","initializeState","state","_nextRequestId","lastRequestId","updateState","changeFlags","props","oldProps","viewport","context","dataChanged","imageSource","_createImageSource","_loadMetadata","debounce","loadImage","viewportChanged","finalizeState","renderLayers","bounds","image","lastRequestParameters","getSubLayerProps","_imageCoordinateSystem","LNGLAT","CARTESIAN","getFeatureInfoText","x","y","featureInfo","query_layers","info_format","url","loadOptions","Error","metadata","getMetadata","getCurrentLayer","reason","length","getBounds","width","height","getRequestId","resolution","requestParams","bbox","minX","minY","maxX","maxY","getImage","setState","raiseError","fn","ms","clearTimeout","_timeoutId","setTimeout"],"mappings":"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","sourcesContent":["// deck.gl, MIT license\n// Attributions:\n// Copyright 2022 Foursquare Labs, Inc.\n\n/* eslint-disable camelcase */ // Some WMS parameters are not in camel case\n/* global setTimeout, clearTimeout */\n\nimport {\n Layer,\n CompositeLayer,\n CompositeLayerProps,\n UpdateParameters,\n DefaultProps,\n Viewport,\n COORDINATE_SYSTEM,\n _deepEqual as deepEqual\n} from '@deck.gl/core';\nimport {BitmapLayer} from '@deck.gl/layers';\nimport type {ImageSourceMetadata, ImageType, ImageServiceType} from '@loaders.gl/wms';\nimport {ImageSource, createImageSource} from '@loaders.gl/wms';\nimport {WGS84ToPseudoMercator} from './utils';\n\n/** All props supported by the TileLayer */\nexport type WMSLayerProps = CompositeLayerProps & _WMSLayerProps;\n\n/** Props added by the TileLayer */\ntype _WMSLayerProps = {\n data: string | ImageSource;\n serviceType?: ImageServiceType | 'auto';\n layers?: string[];\n srs?: 'EPSG:4326' | 'EPSG:3857' | 'auto';\n onMetadataLoad?: (metadata: ImageSourceMetadata) => void;\n onMetadataLoadError?: (error: Error) => void;\n onImageLoadStart?: (requestId: unknown) => void;\n onImageLoad?: (requestId: unknown) => void;\n onImageLoadError?: (requestId: unknown, error: Error) => void;\n};\n\nconst defaultProps: DefaultProps<WMSLayerProps> = {\n id: 'imagery-layer',\n data: '',\n serviceType: 'auto',\n srs: 'auto',\n layers: {type: 'array', compare: true, value: []},\n onMetadataLoad: {type: 'function', value: () => {}},\n // eslint-disable-next-line\n onMetadataLoadError: {type: 'function', value: console.error},\n onImageLoadStart: {type: 'function', value: () => {}},\n onImageLoad: {type: 'function', value: () => {}},\n onImageLoadError: {\n type: 'function',\n compare: false,\n // eslint-disable-next-line\n value: (requestId: unknown, error: Error) => console.error(error, requestId)\n }\n};\n\n/**\n * The layer is used in Hex Tile layer in order to properly discard invisible elements during animation\n */\nexport class WMSLayer<ExtraPropsT extends {} = {}> extends CompositeLayer<\n ExtraPropsT & Required<_WMSLayerProps>\n> {\n static layerName = 'WMSLayer';\n static defaultProps: DefaultProps = defaultProps;\n\n state!: {\n imageSource: ImageSource;\n image: ImageType;\n bounds: [number, number, number, number];\n lastRequestParameters: {\n bbox: [number, number, number, number];\n layers: string[];\n srs: 'EPSG:4326' | 'EPSG:3857';\n width: number;\n height: number;\n };\n lastRequestId: number;\n\n _nextRequestId: number;\n _timeoutId: any;\n };\n\n /** Lets deck.gl know that we want viewport change events */\n override shouldUpdateState(): boolean {\n return true;\n }\n\n override initializeState(): void {\n // intentionally empty, initialization is done in updateState\n this.state._nextRequestId = 0;\n this.state.lastRequestId = -1;\n }\n\n override updateState({changeFlags, props, oldProps}: UpdateParameters<this>): void {\n const {viewport} = this.context;\n\n // Check if data source has changed\n if (changeFlags.dataChanged || props.serviceType !== oldProps.serviceType) {\n this.state.imageSource = this._createImageSource(props);\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._loadMetadata();\n this.debounce(() => this.loadImage(viewport, 'image source changed'), 0);\n } else if (!deepEqual(props.layers, oldProps.layers, 1)) {\n this.debounce(() => this.loadImage(viewport, 'layers changed'), 0);\n } else if (changeFlags.viewportChanged) {\n this.debounce(() => this.loadImage(viewport, 'viewport changed'));\n }\n }\n\n override finalizeState(): void {\n // TODO - we could cancel outstanding requests\n }\n\n override renderLayers(): Layer {\n // TODO - which bitmap layer is rendered should depend on the current viewport\n // Currently Studio only uses one viewport\n const {bounds, image, lastRequestParameters} = this.state;\n\n return (\n image &&\n new BitmapLayer({\n ...this.getSubLayerProps({id: 'bitmap'}),\n _imageCoordinateSystem:\n lastRequestParameters.srs === 'EPSG:4326'\n ? COORDINATE_SYSTEM.LNGLAT\n : COORDINATE_SYSTEM.CARTESIAN,\n bounds,\n image\n })\n );\n }\n\n async getFeatureInfoText(x: number, y: number): Promise<string | null> {\n const {lastRequestParameters} = this.state;\n if (lastRequestParameters) {\n // @ts-expect-error Undocumented method\n const featureInfo = await this.state.imageSource.getFeatureInfoText?.({\n ...lastRequestParameters,\n query_layers: lastRequestParameters.layers,\n x,\n y,\n info_format: 'application/vnd.ogc.gml'\n });\n return featureInfo;\n }\n return '';\n }\n\n _createImageSource(props: WMSLayerProps): ImageSource {\n if (props.data instanceof ImageSource) {\n return props.data;\n }\n\n if (typeof props.data === 'string') {\n return createImageSource({\n url: props.data,\n loadOptions: props.loadOptions,\n type: props.serviceType\n });\n }\n\n throw new Error('invalid image source in props.data');\n }\n\n /** Run a getMetadata on the image service */\n async _loadMetadata(): Promise<void> {\n const {imageSource} = this.state;\n try {\n const metadata = await imageSource.getMetadata();\n\n // If a request takes a long time, it may no longer be expected\n if (this.state.imageSource === imageSource) {\n this.getCurrentLayer()?.props.onMetadataLoad(metadata);\n }\n } catch (error) {\n this.getCurrentLayer()?.props.onMetadataLoadError(error as Error);\n }\n }\n\n /** Load an image */\n async loadImage(viewport: Viewport, reason: string): Promise<void> {\n const {layers, serviceType} = this.props;\n\n // TODO - move to ImageSource?\n if (serviceType === 'wms' && layers.length === 0) {\n return;\n }\n\n const bounds = viewport.getBounds();\n const {width, height} = viewport;\n const requestId = this.getRequestId();\n let {srs} = this.props;\n if (srs === 'auto') {\n // BitmapLayer only supports LNGLAT or CARTESIAN (Web-Mercator)\n srs = viewport.resolution ? 'EPSG:4326' : 'EPSG:3857';\n }\n const requestParams = {\n width,\n height,\n bbox: bounds,\n layers,\n srs\n };\n if (srs === 'EPSG:3857') {\n const [minX, minY] = WGS84ToPseudoMercator([bounds[0], bounds[1]]);\n const [maxX, maxY] = WGS84ToPseudoMercator([bounds[2], bounds[3]]);\n requestParams.bbox = [minX, minY, maxX, maxY];\n }\n\n try {\n this.props.onImageLoadStart(requestId);\n\n const image = await this.state.imageSource.getImage(requestParams);\n\n // If a request takes a long time, later requests may have already loaded.\n if (this.state.lastRequestId < requestId) {\n this.getCurrentLayer()?.props.onImageLoad(requestId);\n // Not type safe...\n this.setState({\n image,\n bounds,\n lastRequestParameters: requestParams,\n lastRequestId: requestId\n });\n }\n } catch (error) {\n this.raiseError(error as Error, 'Load image');\n this.getCurrentLayer()?.props.onImageLoadError(requestId, error as Error);\n }\n }\n\n // HELPERS\n\n /** Global counter for issuing unique request ids */\n private getRequestId(): number {\n return this.state._nextRequestId++;\n }\n\n /** Runs an action in the future, cancels it if the new action is issued before it executes */\n private debounce(fn: Function, ms = 500): void {\n clearTimeout(this.state._timeoutId);\n this.state._timeoutId = setTimeout(() => fn(), ms);\n }\n}\n"],"file":"wms-layer.js"}
1
+ {"version":3,"sources":["../../../src/wms-layer/wms-layer.ts"],"names":["CompositeLayer","COORDINATE_SYSTEM","_deepEqual","deepEqual","BitmapLayer","ImageSource","createImageSource","WGS84ToPseudoMercator","defaultProps","id","data","serviceType","srs","layers","type","compare","value","onMetadataLoad","onMetadataLoadError","console","error","onImageLoadStart","onImageLoad","onImageLoadError","requestId","WMSLayer","isLoaded","Boolean","state","loadCounter","shouldUpdateState","initializeState","_nextRequestId","lastRequestId","updateState","changeFlags","props","oldProps","viewport","context","dataChanged","imageSource","_createImageSource","_loadMetadata","debounce","loadImage","viewportChanged","finalizeState","renderLayers","bounds","image","lastRequestParameters","getSubLayerProps","_imageCoordinateSystem","LNGLAT","CARTESIAN","getFeatureInfoText","x","y","featureInfo","query_layers","info_format","url","loadOptions","Error","metadata","getMetadata","getCurrentLayer","reason","length","getBounds","width","height","getRequestId","resolution","requestParams","bbox","minX","minY","maxX","maxY","getImage","setState","raiseError","fn","ms","clearTimeout","_timeoutId","setTimeout"],"mappings":"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","sourcesContent":["// deck.gl, MIT license\n// Attributions:\n// Copyright 2022 Foursquare Labs, Inc.\n\n/* eslint-disable camelcase */ // Some WMS parameters are not in camel case\n/* global setTimeout, clearTimeout */\n\nimport {\n Layer,\n CompositeLayer,\n CompositeLayerProps,\n UpdateParameters,\n DefaultProps,\n Viewport,\n COORDINATE_SYSTEM,\n _deepEqual as deepEqual\n} from '@deck.gl/core';\nimport {BitmapLayer} from '@deck.gl/layers';\nimport type {ImageSourceMetadata, ImageType, ImageServiceType} from '@loaders.gl/wms';\nimport {ImageSource, createImageSource} from '@loaders.gl/wms';\nimport {WGS84ToPseudoMercator} from './utils';\n\n/** All props supported by the TileLayer */\nexport type WMSLayerProps = CompositeLayerProps & _WMSLayerProps;\n\n/** Props added by the TileLayer */\ntype _WMSLayerProps = {\n data: string | ImageSource;\n serviceType?: ImageServiceType | 'auto';\n layers?: string[];\n srs?: 'EPSG:4326' | 'EPSG:3857' | 'auto';\n onMetadataLoad?: (metadata: ImageSourceMetadata) => void;\n onMetadataLoadError?: (error: Error) => void;\n onImageLoadStart?: (requestId: unknown) => void;\n onImageLoad?: (requestId: unknown) => void;\n onImageLoadError?: (requestId: unknown, error: Error) => void;\n};\n\nconst defaultProps: DefaultProps<WMSLayerProps> = {\n id: 'imagery-layer',\n data: '',\n serviceType: 'auto',\n srs: 'auto',\n layers: {type: 'array', compare: true, value: []},\n onMetadataLoad: {type: 'function', value: () => {}},\n // eslint-disable-next-line\n onMetadataLoadError: {type: 'function', value: console.error},\n onImageLoadStart: {type: 'function', value: () => {}},\n onImageLoad: {type: 'function', value: () => {}},\n onImageLoadError: {\n type: 'function',\n compare: false,\n // eslint-disable-next-line\n value: (requestId: unknown, error: Error) => console.error(error, requestId)\n }\n};\n\n/**\n * The layer is used in Hex Tile layer in order to properly discard invisible elements during animation\n */\nexport class WMSLayer<ExtraPropsT extends {} = {}> extends CompositeLayer<\n ExtraPropsT & Required<_WMSLayerProps>\n> {\n static layerName = 'WMSLayer';\n static defaultProps: DefaultProps = defaultProps;\n\n state!: {\n imageSource: ImageSource;\n image: ImageType;\n bounds: [number, number, number, number];\n lastRequestParameters: {\n bbox: [number, number, number, number];\n layers: string[];\n srs: 'EPSG:4326' | 'EPSG:3857';\n width: number;\n height: number;\n };\n lastRequestId: number;\n _nextRequestId: number;\n /** TODO: Change any => setTimeout return type. Different between Node and browser... */\n _timeoutId: any;\n loadCounter: number;\n };\n\n /** Returns true if all async resources are loaded */\n get isLoaded(): boolean {\n // Track the explicit loading done by this layer\n return Boolean(this.state) && this.state.loadCounter === 0 && super.isLoaded;\n }\n\n /** Lets deck.gl know that we want viewport change events */\n override shouldUpdateState(): boolean {\n return true;\n }\n\n override initializeState(): void {\n // intentionally empty, initialization is done in updateState\n this.state._nextRequestId = 0;\n this.state.lastRequestId = -1;\n this.state.loadCounter = 0;\n }\n\n override updateState({changeFlags, props, oldProps}: UpdateParameters<this>): void {\n const {viewport} = this.context;\n\n // Check if data source has changed\n if (changeFlags.dataChanged || props.serviceType !== oldProps.serviceType) {\n this.state.imageSource = this._createImageSource(props);\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._loadMetadata();\n this.debounce(() => this.loadImage(viewport, 'image source changed'), 0);\n } else if (!deepEqual(props.layers, oldProps.layers, 1)) {\n this.debounce(() => this.loadImage(viewport, 'layers changed'), 0);\n } else if (changeFlags.viewportChanged) {\n this.debounce(() => this.loadImage(viewport, 'viewport changed'));\n }\n }\n\n override finalizeState(): void {\n // TODO - we could cancel outstanding requests\n }\n\n override renderLayers(): Layer {\n // TODO - which bitmap layer is rendered should depend on the current viewport\n // Currently Studio only uses one viewport\n const {bounds, image, lastRequestParameters} = this.state;\n\n return (\n image &&\n new BitmapLayer({\n ...this.getSubLayerProps({id: 'bitmap'}),\n _imageCoordinateSystem:\n lastRequestParameters.srs === 'EPSG:4326'\n ? COORDINATE_SYSTEM.LNGLAT\n : COORDINATE_SYSTEM.CARTESIAN,\n bounds,\n image\n })\n );\n }\n\n async getFeatureInfoText(x: number, y: number): Promise<string | null> {\n const {lastRequestParameters} = this.state;\n if (lastRequestParameters) {\n // @ts-expect-error Undocumented method\n const featureInfo = await this.state.imageSource.getFeatureInfoText?.({\n ...lastRequestParameters,\n query_layers: lastRequestParameters.layers,\n x,\n y,\n info_format: 'application/vnd.ogc.gml'\n });\n return featureInfo;\n }\n return '';\n }\n\n _createImageSource(props: WMSLayerProps): ImageSource {\n if (props.data instanceof ImageSource) {\n return props.data;\n }\n\n if (typeof props.data === 'string') {\n return createImageSource({\n url: props.data,\n loadOptions: props.loadOptions,\n type: props.serviceType\n });\n }\n\n throw new Error('invalid image source in props.data');\n }\n\n /** Run a getMetadata on the image service */\n async _loadMetadata(): Promise<void> {\n const {imageSource} = this.state;\n try {\n this.state.loadCounter++;\n const metadata = await imageSource.getMetadata();\n\n // If a request takes a long time, it may no longer be expected\n if (this.state.imageSource === imageSource) {\n this.getCurrentLayer()?.props.onMetadataLoad(metadata);\n }\n } catch (error) {\n this.getCurrentLayer()?.props.onMetadataLoadError(error as Error);\n } finally {\n this.state.loadCounter--;\n }\n }\n\n /** Load an image */\n async loadImage(viewport: Viewport, reason: string): Promise<void> {\n const {layers, serviceType} = this.props;\n\n // TODO - move to ImageSource?\n if (serviceType === 'wms' && layers.length === 0) {\n return;\n }\n\n const bounds = viewport.getBounds();\n const {width, height} = viewport;\n const requestId = this.getRequestId();\n let {srs} = this.props;\n if (srs === 'auto') {\n // BitmapLayer only supports LNGLAT or CARTESIAN (Web-Mercator)\n srs = viewport.resolution ? 'EPSG:4326' : 'EPSG:3857';\n }\n const requestParams = {\n width,\n height,\n bbox: bounds,\n layers,\n srs\n };\n if (srs === 'EPSG:3857') {\n const [minX, minY] = WGS84ToPseudoMercator([bounds[0], bounds[1]]);\n const [maxX, maxY] = WGS84ToPseudoMercator([bounds[2], bounds[3]]);\n requestParams.bbox = [minX, minY, maxX, maxY];\n }\n\n try {\n this.state.loadCounter++;\n this.props.onImageLoadStart(requestId);\n\n const image = await this.state.imageSource.getImage(requestParams);\n\n // If a request takes a long time, later requests may have already loaded.\n if (this.state.lastRequestId < requestId) {\n this.getCurrentLayer()?.props.onImageLoad(requestId);\n // Not type safe...\n this.setState({\n image,\n bounds,\n lastRequestParameters: requestParams,\n lastRequestId: requestId\n });\n }\n } catch (error) {\n this.raiseError(error as Error, 'Load image');\n this.getCurrentLayer()?.props.onImageLoadError(requestId, error as Error);\n } finally {\n this.state.loadCounter--;\n }\n }\n\n // HELPERS\n\n /** Global counter for issuing unique request ids */\n private getRequestId(): number {\n return this.state._nextRequestId++;\n }\n\n /** Runs an action in the future, cancels it if the new action is issued before it executes */\n private debounce(fn: Function, ms = 500): void {\n clearTimeout(this.state._timeoutId);\n this.state._timeoutId = setTimeout(() => fn(), ms);\n }\n}\n"],"file":"wms-layer.js"}