@deck.gl/geo-layers 8.9.8 → 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 (47) hide show
  1. package/dist/dist.dev.js +127 -16
  2. package/dist/es5/tileset-2d/tile-2d-header.js +17 -1
  3. package/dist/es5/tileset-2d/tile-2d-header.js.map +1 -1
  4. package/dist/es5/wms-layer/wms-layer.js +34 -14
  5. package/dist/es5/wms-layer/wms-layer.js.map +1 -1
  6. package/dist/esm/tileset-2d/tile-2d-header.js +19 -2
  7. package/dist/esm/tileset-2d/tile-2d-header.js.map +1 -1
  8. package/dist/esm/wms-layer/wms-layer.js +11 -0
  9. package/dist/esm/wms-layer/wms-layer.js.map +1 -1
  10. package/dist.min.js +56 -56
  11. package/package.json +10 -10
  12. package/src/tileset-2d/tile-2d-header.ts +26 -1
  13. package/src/wms-layer/wms-layer.ts +15 -1
  14. package/typed/geo-cell-layer/GeoCellLayer.js +49 -0
  15. package/typed/great-circle-layer/great-circle-layer.js +29 -0
  16. package/typed/h3-layers/h3-cluster-layer.js +33 -0
  17. package/typed/h3-layers/h3-hexagon-layer.js +251 -0
  18. package/typed/imagery-layer/imagery-layer.d.ts +53 -0
  19. package/typed/imagery-layer/imagery-layer.d.ts.map +1 -0
  20. package/typed/index.js +33 -0
  21. package/typed/mesh-layer/mesh-layer-fragment.glsl.js +55 -0
  22. package/typed/mesh-layer/mesh-layer-vertex.glsl.js +80 -0
  23. package/typed/mesh-layer/mesh-layer.js +110 -0
  24. package/typed/mvt-layer/coordinate-transform.js +41 -0
  25. package/typed/mvt-layer/find-index-binary.js +96 -0
  26. package/typed/mvt-layer/mvt-layer.js +297 -0
  27. package/typed/quadkey-layer/quadkey-layer.js +18 -0
  28. package/typed/quadkey-layer/quadkey-utils.js +26 -0
  29. package/typed/s2-layer/s2-geometry.js +123 -0
  30. package/typed/s2-layer/s2-layer.js +37 -0
  31. package/typed/s2-layer/s2-utils.js +88 -0
  32. package/typed/terrain-layer/terrain-layer.js +226 -0
  33. package/typed/tile-3d-layer/tile-3d-layer.js +294 -0
  34. package/typed/tile-layer/tile-2d-header.js +113 -0
  35. package/typed/tile-layer/tile-2d-traversal.js +181 -0
  36. package/typed/tile-layer/tile-layer.js +192 -0
  37. package/typed/tile-layer/tileset-2d.d.ts.map +1 -1
  38. package/typed/tile-layer/tileset-2d.js +399 -0
  39. package/typed/tile-layer/types.js +1 -0
  40. package/typed/tile-layer/utils.d.ts +1 -1
  41. package/typed/tile-layer/utils.d.ts.map +1 -1
  42. package/typed/tile-layer/utils.js +197 -0
  43. package/typed/tileset-2d/tile-2d-header.d.ts +5 -1
  44. package/typed/tileset-2d/tile-2d-header.d.ts.map +1 -1
  45. package/typed/trips-layer/trips-layer.js +92 -0
  46. package/typed/wms-layer/wms-layer.d.ts +4 -0
  47. package/typed/wms-layer/wms-layer.d.ts.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/tileset-2d/tile-2d-header.ts"],"names":["Tile2DHeader","constructor","index","isVisible","isSelected","parent","children","content","_loader","undefined","_abortController","_loaderId","_isLoaded","_isCancelled","_needsReload","data","isLoading","then","isLoaded","Boolean","needsReload","byteLength","result","Number","isFinite","console","error","_loadData","getData","requestScheduler","onLoad","onError","id","bbox","userData","zoom","loaderId","AbortController","signal","requestToken","scheduleRequest","tile","done","tileData","err","loadData","opts","setNeedsReload","abort"],"mappings":"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","sourcesContent":["/* eslint-env browser */\nimport {RequestScheduler} from '@loaders.gl/loader-utils';\nimport {TileBoundingBox, TileIndex, TileLoadProps} from './types';\n\nexport type TileLoadDataProps<DataT = any> = {\n requestScheduler: RequestScheduler;\n getData: (props: TileLoadProps) => Promise<DataT>;\n onLoad: (tile: Tile2DHeader<DataT>) => void;\n onError: (error: any, tile: Tile2DHeader<DataT>) => void;\n};\n\nexport class Tile2DHeader<DataT = any> {\n index: TileIndex;\n isVisible: boolean;\n isSelected: boolean;\n parent: Tile2DHeader | null;\n children: Tile2DHeader[] | null;\n content: DataT | null;\n state?: number;\n layers?: any[] | null; // Layer[] | null\n\n id!: string; // assigned _always_ with result of `getTileId`\n bbox!: TileBoundingBox; // assigned _always_ with result of `getTileMetadata`\n zoom!: number; // assigned _always_ with result of `getTileZoom`\n userData?: Record<string, any>; // _may be_ assigned with result of `getTileMetadata`\n\n private _abortController: AbortController | null;\n private _loader: Promise<void> | undefined;\n private _loaderId: number;\n private _isLoaded: boolean;\n private _isCancelled: boolean;\n private _needsReload: boolean;\n\n constructor(index: TileIndex) {\n this.index = index;\n this.isVisible = false;\n this.isSelected = false;\n this.parent = null;\n this.children = [];\n\n this.content = null;\n\n this._loader = undefined;\n this._abortController = null;\n this._loaderId = 0;\n this._isLoaded = false;\n this._isCancelled = false;\n this._needsReload = false;\n }\n\n get data(): Promise<DataT | null> | DataT | null {\n return this.isLoading && this._loader ? this._loader.then(() => this.data) : this.content;\n }\n\n get isLoaded(): boolean {\n return this._isLoaded && !this._needsReload;\n }\n\n get isLoading(): boolean {\n return Boolean(this._loader) && !this._isCancelled;\n }\n\n get needsReload(): boolean {\n return this._needsReload || this._isCancelled;\n }\n\n get byteLength(): number {\n const result = this.content ? (this.content as any).byteLength : 0;\n if (!Number.isFinite(result)) {\n // eslint-disable-next-line no-console\n console.error('byteLength not defined in tile data');\n }\n return result;\n }\n\n /* eslint-disable max-statements */\n private async _loadData({\n getData,\n requestScheduler,\n onLoad,\n onError\n }: TileLoadDataProps<DataT>): Promise<void> {\n const {index, id, bbox, userData, zoom} = this;\n const loaderId = this._loaderId;\n\n this._abortController = new AbortController();\n const {signal} = this._abortController;\n\n // @ts-expect-error (2345) Argument of type '(tile: any) => 1 | -1' is not assignable ...\n const requestToken = await requestScheduler.scheduleRequest(this, tile => {\n return tile.isSelected ? 1 : -1;\n });\n\n if (!requestToken) {\n this._isCancelled = true;\n return;\n }\n // A tile can be cancelled while being scheduled\n if (this._isCancelled) {\n requestToken.done();\n return;\n }\n\n let tileData: DataT | null = null;\n let error;\n try {\n tileData = await getData({index, id, bbox, userData, zoom, signal});\n } catch (err) {\n error = err || true;\n } finally {\n requestToken.done();\n }\n\n // If loadData has been called with a newer version, discard the result from this operation\n if (loaderId !== this._loaderId) {\n return;\n }\n // Clear the `isLoading` flag\n this._loader = undefined;\n // Rewrite tile content with the result of getTileData if successful, or `null` in case of\n // error or cancellation\n this.content = tileData;\n // If cancelled, do not invoke the callbacks\n // Consider it loaded if we tried to cancel but `getTileData` still returned data\n if (this._isCancelled && !tileData) {\n this._isLoaded = false;\n return;\n }\n this._isLoaded = true;\n this._isCancelled = false;\n\n if (error) {\n onError(error, this);\n } else {\n onLoad(this);\n }\n }\n\n loadData(opts: TileLoadDataProps): Promise<void> {\n this._isLoaded = false;\n this._isCancelled = false;\n this._needsReload = false;\n this._loaderId++;\n this._loader = this._loadData(opts);\n return this._loader;\n }\n\n setNeedsReload(): void {\n if (this.isLoading) {\n this.abort();\n this._loader = undefined;\n }\n this._needsReload = true;\n }\n\n abort(): void {\n if (this.isLoaded) {\n return;\n }\n\n this._isCancelled = true;\n this._abortController?.abort();\n }\n}\n"],"file":"tile-2d-header.js"}
1
+ {"version":3,"sources":["../../../src/tileset-2d/tile-2d-header.ts"],"names":["Tile2DHeader","constructor","index","isVisible","isSelected","parent","children","content","_loader","undefined","_abortController","_loaderId","_isLoaded","_isCancelled","_needsReload","bbox","_bbox","value","boundingBox","west","south","east","north","left","top","right","bottom","data","isLoading","then","isLoaded","Boolean","needsReload","byteLength","result","Number","isFinite","console","error","_loadData","getData","requestScheduler","onLoad","onError","id","userData","zoom","loaderId","AbortController","signal","requestToken","scheduleRequest","tile","done","tileData","err","loadData","opts","setNeedsReload","abort"],"mappings":"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","sourcesContent":["/* eslint-env browser */\nimport {RequestScheduler} from '@loaders.gl/loader-utils';\nimport {TileBoundingBox, TileIndex, TileLoadProps} from './types';\n\nexport type TileLoadDataProps<DataT = any> = {\n requestScheduler: RequestScheduler;\n getData: (props: TileLoadProps) => Promise<DataT>;\n onLoad: (tile: Tile2DHeader<DataT>) => void;\n onError: (error: any, tile: Tile2DHeader<DataT>) => void;\n};\n\nexport class Tile2DHeader<DataT = any> {\n index: TileIndex;\n isVisible: boolean;\n isSelected: boolean;\n parent: Tile2DHeader | null;\n children: Tile2DHeader[] | null;\n content: DataT | null;\n state?: number;\n layers?: any[] | null; // Layer[] | null\n\n id!: string; // assigned _always_ with result of `getTileId`\n zoom!: number; // assigned _always_ with result of `getTileZoom`\n userData?: Record<string, any>; // _may be_ assigned with result of `getTileMetadata`\n boundingBox!: [min: number[], max: number[]]; // assigned _always_ with bbox from `getTileMetadata`\n\n private _abortController: AbortController | null;\n private _loader: Promise<void> | undefined;\n private _loaderId: number;\n private _isLoaded: boolean;\n private _isCancelled: boolean;\n private _needsReload: boolean;\n private _bbox!: TileBoundingBox;\n\n constructor(index: TileIndex) {\n this.index = index;\n this.isVisible = false;\n this.isSelected = false;\n this.parent = null;\n this.children = [];\n\n this.content = null;\n\n this._loader = undefined;\n this._abortController = null;\n this._loaderId = 0;\n this._isLoaded = false;\n this._isCancelled = false;\n this._needsReload = false;\n }\n\n /** @deprecated use `boundingBox` instead */\n get bbox(): TileBoundingBox {\n return this._bbox;\n }\n\n // TODO - remove in v9\n set bbox(value: TileBoundingBox) {\n // Only set once from `Tileset2D.getTileMetadata`\n if (this._bbox) return;\n\n this._bbox = value;\n if ('west' in value) {\n this.boundingBox = [\n [value.west, value.south],\n [value.east, value.north]\n ];\n } else {\n this.boundingBox = [\n [value.left, value.top],\n [value.right, value.bottom]\n ];\n }\n }\n\n get data(): Promise<DataT | null> | DataT | null {\n return this.isLoading && this._loader ? this._loader.then(() => this.data) : this.content;\n }\n\n get isLoaded(): boolean {\n return this._isLoaded && !this._needsReload;\n }\n\n get isLoading(): boolean {\n return Boolean(this._loader) && !this._isCancelled;\n }\n\n get needsReload(): boolean {\n return this._needsReload || this._isCancelled;\n }\n\n get byteLength(): number {\n const result = this.content ? (this.content as any).byteLength : 0;\n if (!Number.isFinite(result)) {\n // eslint-disable-next-line no-console\n console.error('byteLength not defined in tile data');\n }\n return result;\n }\n\n /* eslint-disable max-statements */\n private async _loadData({\n getData,\n requestScheduler,\n onLoad,\n onError\n }: TileLoadDataProps<DataT>): Promise<void> {\n const {index, id, bbox, userData, zoom} = this;\n const loaderId = this._loaderId;\n\n this._abortController = new AbortController();\n const {signal} = this._abortController;\n\n // @ts-expect-error (2345) Argument of type '(tile: any) => 1 | -1' is not assignable ...\n const requestToken = await requestScheduler.scheduleRequest(this, tile => {\n return tile.isSelected ? 1 : -1;\n });\n\n if (!requestToken) {\n this._isCancelled = true;\n return;\n }\n // A tile can be cancelled while being scheduled\n if (this._isCancelled) {\n requestToken.done();\n return;\n }\n\n let tileData: DataT | null = null;\n let error;\n try {\n tileData = await getData({index, id, bbox, userData, zoom, signal});\n } catch (err) {\n error = err || true;\n } finally {\n requestToken.done();\n }\n\n // If loadData has been called with a newer version, discard the result from this operation\n if (loaderId !== this._loaderId) {\n return;\n }\n // Clear the `isLoading` flag\n this._loader = undefined;\n // Rewrite tile content with the result of getTileData if successful, or `null` in case of\n // error or cancellation\n this.content = tileData;\n // If cancelled, do not invoke the callbacks\n // Consider it loaded if we tried to cancel but `getTileData` still returned data\n if (this._isCancelled && !tileData) {\n this._isLoaded = false;\n return;\n }\n this._isLoaded = true;\n this._isCancelled = false;\n\n if (error) {\n onError(error, this);\n } else {\n onLoad(this);\n }\n }\n\n loadData(opts: TileLoadDataProps): Promise<void> {\n this._isLoaded = false;\n this._isCancelled = false;\n this._needsReload = false;\n this._loaderId++;\n this._loader = this._loadData(opts);\n return this._loader;\n }\n\n setNeedsReload(): void {\n if (this.isLoading) {\n this.abort();\n this._loader = undefined;\n }\n this._needsReload = true;\n }\n\n abort(): void {\n if (this.isLoaded) {\n return;\n }\n\n this._isCancelled = true;\n this._abortController?.abort();\n }\n}\n"],"file":"tile-2d-header.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"}