@deck.gl/geo-layers 8.9.0-beta.1 → 8.9.0-beta.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.
- package/dist/dist.dev.js +12567 -4858
- package/dist/es5/geo-cell-layer/GeoCellLayer.js.map +1 -1
- package/dist/es5/geohash-layer/geohash-layer.js.map +1 -1
- package/dist/es5/great-circle-layer/great-circle-layer.js.map +1 -1
- package/dist/es5/h3-layers/h3-cluster-layer.js.map +1 -1
- package/dist/es5/h3-layers/h3-hexagon-layer.js.map +1 -1
- package/dist/es5/index.js +8 -0
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/mesh-layer/mesh-layer.js.map +1 -1
- package/dist/es5/mvt-layer/mvt-layer.js.map +1 -1
- package/dist/es5/quadkey-layer/quadkey-layer.js.map +1 -1
- package/dist/es5/s2-layer/s2-layer.js.map +1 -1
- package/dist/es5/terrain-layer/terrain-layer.js +1 -4
- package/dist/es5/terrain-layer/terrain-layer.js.map +1 -1
- package/dist/es5/tile-3d-layer/tile-3d-layer.js +9 -8
- package/dist/es5/tile-3d-layer/tile-3d-layer.js.map +1 -1
- package/dist/es5/tile-layer/tile-layer.js +26 -4
- package/dist/es5/tile-layer/tile-layer.js.map +1 -1
- package/dist/es5/tileset-2d/index.js.map +1 -1
- package/dist/es5/tileset-2d/tileset-2d.js.map +1 -1
- package/dist/es5/tileset-2d/utils.js +2 -2
- package/dist/es5/tileset-2d/utils.js.map +1 -1
- package/dist/es5/trips-layer/trips-layer.js.map +1 -1
- package/dist/es5/wms-layer/wms-layer.js +377 -0
- package/dist/es5/wms-layer/wms-layer.js.map +1 -0
- package/dist/esm/geo-cell-layer/GeoCellLayer.js.map +1 -1
- package/dist/esm/geohash-layer/geohash-layer.js.map +1 -1
- package/dist/esm/great-circle-layer/great-circle-layer.js.map +1 -1
- package/dist/esm/h3-layers/h3-cluster-layer.js.map +1 -1
- package/dist/esm/h3-layers/h3-hexagon-layer.js.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/mesh-layer/mesh-layer.js.map +1 -1
- package/dist/esm/mvt-layer/mvt-layer.js.map +1 -1
- package/dist/esm/quadkey-layer/quadkey-layer.js.map +1 -1
- package/dist/esm/s2-layer/s2-layer.js.map +1 -1
- package/dist/esm/terrain-layer/terrain-layer.js +1 -4
- package/dist/esm/terrain-layer/terrain-layer.js.map +1 -1
- package/dist/esm/tile-3d-layer/tile-3d-layer.js +9 -10
- package/dist/esm/tile-3d-layer/tile-3d-layer.js.map +1 -1
- package/dist/esm/tile-layer/tile-layer.js +11 -4
- package/dist/esm/tile-layer/tile-layer.js.map +1 -1
- package/dist/esm/tileset-2d/index.js.map +1 -1
- package/dist/esm/tileset-2d/tileset-2d.js.map +1 -1
- package/dist/esm/tileset-2d/utils.js +2 -2
- package/dist/esm/tileset-2d/utils.js.map +1 -1
- package/dist/esm/trips-layer/trips-layer.js.map +1 -1
- package/dist/esm/wms-layer/wms-layer.js +232 -0
- package/dist/esm/wms-layer/wms-layer.js.map +1 -0
- package/dist.min.js +66 -54
- package/package.json +12 -10
- package/src/geo-cell-layer/GeoCellLayer.ts +2 -2
- package/src/geohash-layer/geohash-layer.ts +4 -4
- package/src/great-circle-layer/great-circle-layer.ts +2 -2
- package/src/h3-layers/h3-cluster-layer.ts +1 -1
- package/src/h3-layers/h3-hexagon-layer.ts +4 -1
- package/src/index.ts +2 -0
- package/src/mesh-layer/mesh-layer.ts +1 -1
- package/src/mvt-layer/mvt-layer.ts +4 -4
- package/src/quadkey-layer/quadkey-layer.ts +1 -1
- package/src/s2-layer/s2-layer.ts +1 -1
- package/src/terrain-layer/terrain-layer.ts +10 -7
- package/src/tile-3d-layer/tile-3d-layer.ts +10 -11
- package/src/tile-layer/tile-layer.ts +11 -6
- package/src/tileset-2d/index.ts +1 -0
- package/src/tileset-2d/tileset-2d.ts +1 -0
- package/src/tileset-2d/utils.ts +6 -4
- package/src/trips-layer/trips-layer.ts +1 -1
- package/src/wms-layer/wms-layer.ts +246 -0
- package/typed/geo-cell-layer/GeoCellLayer.d.ts +2 -2
- package/typed/geo-cell-layer/GeoCellLayer.d.ts.map +1 -1
- package/typed/geohash-layer/geohash-layer.d.ts +3 -3
- package/typed/geohash-layer/geohash-layer.d.ts.map +1 -1
- package/typed/great-circle-layer/great-circle-layer.d.ts +3 -2
- package/typed/great-circle-layer/great-circle-layer.d.ts.map +1 -1
- package/typed/h3-layers/h3-cluster-layer.d.ts +1 -1
- package/typed/h3-layers/h3-cluster-layer.d.ts.map +1 -1
- package/typed/h3-layers/h3-hexagon-layer.d.ts +1 -1
- package/typed/h3-layers/h3-hexagon-layer.d.ts.map +1 -1
- package/typed/imagery-layer/imagery-layer.d.ts +53 -0
- package/typed/imagery-layer/imagery-layer.d.ts.map +1 -0
- package/typed/index.d.ts +2 -0
- package/typed/index.d.ts.map +1 -1
- package/typed/mesh-layer/mesh-layer.d.ts +1 -1
- package/typed/mesh-layer/mesh-layer.d.ts.map +1 -1
- package/typed/mvt-layer/mvt-layer.d.ts +1 -1
- package/typed/mvt-layer/mvt-layer.d.ts.map +1 -1
- package/typed/quadkey-layer/quadkey-layer.d.ts +1 -1
- package/typed/quadkey-layer/quadkey-layer.d.ts.map +1 -1
- package/typed/s2-layer/s2-layer.d.ts +1 -1
- package/typed/s2-layer/s2-layer.d.ts.map +1 -1
- package/typed/terrain-layer/terrain-layer.d.ts +7 -4
- package/typed/terrain-layer/terrain-layer.d.ts.map +1 -1
- package/typed/tile-3d-layer/tile-3d-layer.d.ts +3 -3
- package/typed/tile-3d-layer/tile-3d-layer.d.ts.map +1 -1
- package/typed/tile-layer/tile-layer.d.ts +3 -3
- package/typed/tile-layer/tile-layer.d.ts.map +1 -1
- package/typed/tileset-2d/index.d.ts +1 -0
- package/typed/tileset-2d/index.d.ts.map +1 -1
- package/typed/tileset-2d/tileset-2d.d.ts.map +1 -1
- package/typed/tileset-2d/utils.d.ts +5 -4
- package/typed/tileset-2d/utils.d.ts.map +1 -1
- package/typed/trips-layer/trips-layer.d.ts +1 -1
- package/typed/trips-layer/trips-layer.d.ts.map +1 -1
- package/typed/wms-layer/wms-layer.d.ts +56 -0
- package/typed/wms-layer/wms-layer.d.ts.map +1 -0
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
2
|
+
import { CompositeLayer, COORDINATE_SYSTEM, _deepEqual as deepEqual } from '@deck.gl/core';
|
|
3
|
+
import { BitmapLayer } from '@deck.gl/layers';
|
|
4
|
+
import { ImageSource, createImageSource } from '@loaders.gl/wms';
|
|
5
|
+
import { Proj4Projection } from '@math.gl/proj4';
|
|
6
|
+
const defaultProps = {
|
|
7
|
+
id: 'imagery-layer',
|
|
8
|
+
data: '',
|
|
9
|
+
serviceType: 'auto',
|
|
10
|
+
srs: 'auto',
|
|
11
|
+
layers: {
|
|
12
|
+
type: 'array',
|
|
13
|
+
compare: true,
|
|
14
|
+
value: []
|
|
15
|
+
},
|
|
16
|
+
onMetadataLoad: {
|
|
17
|
+
type: 'function',
|
|
18
|
+
compare: false,
|
|
19
|
+
value: () => {}
|
|
20
|
+
},
|
|
21
|
+
onMetadataLoadError: {
|
|
22
|
+
type: 'function',
|
|
23
|
+
compare: false,
|
|
24
|
+
value: console.error
|
|
25
|
+
},
|
|
26
|
+
onImageLoadStart: {
|
|
27
|
+
type: 'function',
|
|
28
|
+
compare: false,
|
|
29
|
+
value: () => {}
|
|
30
|
+
},
|
|
31
|
+
onImageLoad: {
|
|
32
|
+
type: 'function',
|
|
33
|
+
compare: false,
|
|
34
|
+
value: () => {}
|
|
35
|
+
},
|
|
36
|
+
onImageLoadError: {
|
|
37
|
+
type: 'function',
|
|
38
|
+
compare: false,
|
|
39
|
+
value: (requestId, error) => console.error(error, requestId)
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
const projConverter = new Proj4Projection({
|
|
43
|
+
from: 'EPSG:4326',
|
|
44
|
+
to: 'EPSG:3857'
|
|
45
|
+
});
|
|
46
|
+
export class WMSLayer extends CompositeLayer {
|
|
47
|
+
constructor(...args) {
|
|
48
|
+
super(...args);
|
|
49
|
+
|
|
50
|
+
_defineProperty(this, "state", void 0);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
shouldUpdateState() {
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
initializeState() {
|
|
58
|
+
this.state._nextRequestId = 0;
|
|
59
|
+
this.state.lastRequestId = -1;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
updateState({
|
|
63
|
+
changeFlags,
|
|
64
|
+
props,
|
|
65
|
+
oldProps
|
|
66
|
+
}) {
|
|
67
|
+
const {
|
|
68
|
+
viewport
|
|
69
|
+
} = this.context;
|
|
70
|
+
|
|
71
|
+
if (changeFlags.dataChanged || props.serviceType !== oldProps.serviceType) {
|
|
72
|
+
this.state.imageSource = this._createImageSource(props);
|
|
73
|
+
|
|
74
|
+
this._loadMetadata();
|
|
75
|
+
|
|
76
|
+
this.debounce(() => this.loadImage(viewport, 'image source changed'), 0);
|
|
77
|
+
} else if (!deepEqual(props.layers, oldProps.layers, 1)) {
|
|
78
|
+
this.debounce(() => this.loadImage(viewport, 'layers changed'), 0);
|
|
79
|
+
} else if (changeFlags.viewportChanged) {
|
|
80
|
+
this.debounce(() => this.loadImage(viewport, 'viewport changed'));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
finalizeState() {}
|
|
85
|
+
|
|
86
|
+
renderLayers() {
|
|
87
|
+
const {
|
|
88
|
+
bounds,
|
|
89
|
+
image,
|
|
90
|
+
lastRequestParameters
|
|
91
|
+
} = this.state;
|
|
92
|
+
return image && new BitmapLayer({ ...this.getSubLayerProps({
|
|
93
|
+
id: 'bitmap'
|
|
94
|
+
}),
|
|
95
|
+
_imageCoordinateSystem: lastRequestParameters.srs === 'EPSG:4326' ? COORDINATE_SYSTEM.LNGLAT : COORDINATE_SYSTEM.CARTESIAN,
|
|
96
|
+
bounds,
|
|
97
|
+
image
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
async getFeatureInfoText(x, y) {
|
|
102
|
+
const {
|
|
103
|
+
lastRequestParameters
|
|
104
|
+
} = this.state;
|
|
105
|
+
|
|
106
|
+
if (lastRequestParameters) {
|
|
107
|
+
var _this$state$imageSour, _this$state$imageSour2;
|
|
108
|
+
|
|
109
|
+
const featureInfo = await ((_this$state$imageSour = (_this$state$imageSour2 = this.state.imageSource).getFeatureInfoText) === null || _this$state$imageSour === void 0 ? void 0 : _this$state$imageSour.call(_this$state$imageSour2, { ...lastRequestParameters,
|
|
110
|
+
query_layers: lastRequestParameters.layers,
|
|
111
|
+
x,
|
|
112
|
+
y,
|
|
113
|
+
info_format: 'application/vnd.ogc.gml'
|
|
114
|
+
}));
|
|
115
|
+
return featureInfo;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return '';
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
_createImageSource(props) {
|
|
122
|
+
if (props.data instanceof ImageSource) {
|
|
123
|
+
return props.data;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (typeof props.data === 'string') {
|
|
127
|
+
return createImageSource({
|
|
128
|
+
url: props.data,
|
|
129
|
+
loadOptions: props.loadOptions,
|
|
130
|
+
type: props.serviceType
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
throw new Error('invalid image source in props.data');
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
async _loadMetadata() {
|
|
138
|
+
const {
|
|
139
|
+
imageSource
|
|
140
|
+
} = this.state;
|
|
141
|
+
|
|
142
|
+
try {
|
|
143
|
+
const metadata = await imageSource.getMetadata();
|
|
144
|
+
|
|
145
|
+
if (this.state.imageSource === imageSource) {
|
|
146
|
+
var _this$getCurrentLayer;
|
|
147
|
+
|
|
148
|
+
(_this$getCurrentLayer = this.getCurrentLayer()) === null || _this$getCurrentLayer === void 0 ? void 0 : _this$getCurrentLayer.props.onMetadataLoad(metadata);
|
|
149
|
+
}
|
|
150
|
+
} catch (error) {
|
|
151
|
+
var _this$getCurrentLayer2;
|
|
152
|
+
|
|
153
|
+
(_this$getCurrentLayer2 = this.getCurrentLayer()) === null || _this$getCurrentLayer2 === void 0 ? void 0 : _this$getCurrentLayer2.props.onMetadataLoadError(error);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
async loadImage(viewport, reason) {
|
|
158
|
+
const {
|
|
159
|
+
layers,
|
|
160
|
+
serviceType
|
|
161
|
+
} = this.props;
|
|
162
|
+
|
|
163
|
+
if (serviceType === 'wms' && layers.length === 0) {
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const bounds = viewport.getBounds();
|
|
168
|
+
const {
|
|
169
|
+
width,
|
|
170
|
+
height
|
|
171
|
+
} = viewport;
|
|
172
|
+
const requestId = this.getRequestId();
|
|
173
|
+
let {
|
|
174
|
+
srs
|
|
175
|
+
} = this.props;
|
|
176
|
+
|
|
177
|
+
if (srs === 'auto') {
|
|
178
|
+
srs = viewport.resolution ? 'EPSG:4326' : 'EPSG:3857';
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
const requestParams = {
|
|
182
|
+
width,
|
|
183
|
+
height,
|
|
184
|
+
bbox: bounds,
|
|
185
|
+
layers,
|
|
186
|
+
srs
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
if (srs === 'EPSG:3857') {
|
|
190
|
+
const [minX, minY] = projConverter.project([bounds[0], bounds[1]]);
|
|
191
|
+
const [maxX, maxY] = projConverter.project([bounds[2], bounds[3]]);
|
|
192
|
+
requestParams.bbox = [minX, minY, maxX, maxY];
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
try {
|
|
196
|
+
this.props.onImageLoadStart(requestId);
|
|
197
|
+
const image = await this.state.imageSource.getImage(requestParams);
|
|
198
|
+
|
|
199
|
+
if (this.state.lastRequestId < requestId) {
|
|
200
|
+
var _this$getCurrentLayer3;
|
|
201
|
+
|
|
202
|
+
(_this$getCurrentLayer3 = this.getCurrentLayer()) === null || _this$getCurrentLayer3 === void 0 ? void 0 : _this$getCurrentLayer3.props.onImageLoad(requestId);
|
|
203
|
+
this.setState({
|
|
204
|
+
image,
|
|
205
|
+
bounds,
|
|
206
|
+
lastRequestParameters: requestParams,
|
|
207
|
+
lastRequestId: requestId
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
} catch (error) {
|
|
211
|
+
var _this$getCurrentLayer4;
|
|
212
|
+
|
|
213
|
+
this.raiseError(error, 'Load image');
|
|
214
|
+
(_this$getCurrentLayer4 = this.getCurrentLayer()) === null || _this$getCurrentLayer4 === void 0 ? void 0 : _this$getCurrentLayer4.props.onImageLoadError(requestId, error);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
getRequestId() {
|
|
219
|
+
return this.state._nextRequestId++;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
debounce(fn, ms = 500) {
|
|
223
|
+
clearTimeout(this.state._timeoutId);
|
|
224
|
+
this.state._timeoutId = setTimeout(() => fn(), ms);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
_defineProperty(WMSLayer, "layerName", 'WMSLayer');
|
|
230
|
+
|
|
231
|
+
_defineProperty(WMSLayer, "defaultProps", defaultProps);
|
|
232
|
+
//# sourceMappingURL=wms-layer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/wms-layer/wms-layer.ts"],"names":["CompositeLayer","COORDINATE_SYSTEM","_deepEqual","deepEqual","BitmapLayer","ImageSource","createImageSource","Proj4Projection","defaultProps","id","data","serviceType","srs","layers","type","compare","value","onMetadataLoad","onMetadataLoadError","console","error","onImageLoadStart","onImageLoad","onImageLoadError","requestId","projConverter","from","to","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","project","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 {Proj4Projection} from '@math.gl/proj4';\n\n/** All props supported by the TileLayer */\nexport type WMSLayerProps = CompositeLayerProps<any> & _WMSLayerProps;\n\n/** Props added by the TileLayer */\ntype _WMSLayerProps = {\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', compare: false, value: () => {}},\n // eslint-disable-next-line\n onMetadataLoadError: {type: 'function', compare: false, value: console.error},\n onImageLoadStart: {type: 'function', compare: false, value: () => {}},\n onImageLoad: {type: 'function', compare: false, 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\nconst projConverter = new Proj4Projection({from: 'EPSG:4326', to: 'EPSG:3857'});\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] = projConverter.project([bounds[0], bounds[1]]);\n const [maxX, maxY] = projConverter.project([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"}
|