@opengeoweb/webmap-react 20.0.1 → 20.1.0

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/index.esm.js CHANGED
@@ -420,6 +420,15 @@ function _defineProperty(e, r, t) {
420
420
  writable: true
421
421
  }) : e[r] = t, e;
422
422
  }
423
+ function _get() {
424
+ return _get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) {
425
+ var p = _superPropBase(e, t);
426
+ if (p) {
427
+ var n = Object.getOwnPropertyDescriptor(p, t);
428
+ return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value;
429
+ }
430
+ }, _get.apply(null, arguments);
431
+ }
423
432
  function _getPrototypeOf(t) {
424
433
  return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) {
425
434
  return t.__proto__ || Object.getPrototypeOf(t);
@@ -643,6 +652,16 @@ function _setPrototypeOf(t, e) {
643
652
  function _slicedToArray(r, e) {
644
653
  return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();
645
654
  }
655
+ function _superPropBase(t, o) {
656
+ for (; !{}.hasOwnProperty.call(t, o) && null !== (t = _getPrototypeOf(t)););
657
+ return t;
658
+ }
659
+ function _superPropGet(t, o, e, r) {
660
+ var p = _get(_getPrototypeOf(t.prototype ), o, e);
661
+ return "function" == typeof p ? function (t) {
662
+ return p.apply(e, t);
663
+ } : p;
664
+ }
646
665
  function _toConsumableArray(r) {
647
666
  return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread();
648
667
  }
@@ -699,6 +718,7 @@ var MAX_NUMBER_STEPS_IN_TIME_SLIDER_TO_PREFETCH = 10000;
699
718
  var NUMBER_PREFETCH_WORKERS = 4;
700
719
  var NUM_IMAGES_TO_CACHE = 10000;
701
720
  var WMS_EXTENT_RATIO_TO_VIEWPORT = 1.2;
721
+ var FAILED_IMAGE_RETRY_CHECK_INTERVAL_MS = 10000;
702
722
  var TIMEAWAREIMAGEWRAPPER_IMAGEDIDNOTLOADSUCCESFULLY = 'Image did not load succesfully';
703
723
  // // To debug what dimensions are actually being used in the map, use:
704
724
  // export const ADD_SHOW_DIMS_OPTION = true;
@@ -843,6 +863,50 @@ var openLayersGetMapImageStore = new WMImageStore(NUM_IMAGES_TO_CACHE, {
843
863
  var clearImageCacheForAllMaps = function clearImageCacheForAllMaps() {
844
864
  openLayersGetMapImageStore.clear();
845
865
  };
866
+ var splitExtentAtWorldSeams = function splitExtentAtWorldSeams(extent, worldExtent) {
867
+ var worldWidth = worldExtent[2] - worldExtent[0];
868
+ if (worldWidth <= 0 || extent[2] <= extent[0]) {
869
+ return [{
870
+ requestExtent: extent,
871
+ displayExtent: extent
872
+ }];
873
+ }
874
+ var segments = [];
875
+ var segmentStart = extent[0];
876
+ var worldIndex = Math.floor((segmentStart - worldExtent[0]) / worldWidth);
877
+ while (segmentStart < extent[2]) {
878
+ var worldEnd = worldExtent[0] + (worldIndex + 1) * worldWidth;
879
+ while (worldEnd <= segmentStart) {
880
+ worldIndex += 1;
881
+ worldEnd = worldExtent[0] + (worldIndex + 1) * worldWidth;
882
+ }
883
+ var segmentEnd = Math.min(extent[2], worldEnd);
884
+ var worldOffset = worldIndex * worldWidth;
885
+ segments.push({
886
+ requestExtent: [segmentStart - worldOffset, extent[1], segmentEnd - worldOffset, extent[3]],
887
+ displayExtent: [segmentStart, extent[1], segmentEnd, extent[3]]
888
+ });
889
+ segmentStart = segmentEnd;
890
+ worldIndex += 1;
891
+ }
892
+ return segments;
893
+ };
894
+ var combineExtents = function combineExtents(extents) {
895
+ return [Math.min.apply(Math, _toConsumableArray(extents.map(function (extent) {
896
+ return extent[0];
897
+ }))), Math.min.apply(Math, _toConsumableArray(extents.map(function (extent) {
898
+ return extent[1];
899
+ }))), Math.max.apply(Math, _toConsumableArray(extents.map(function (extent) {
900
+ return extent[2];
901
+ }))), Math.max.apply(Math, _toConsumableArray(extents.map(function (extent) {
902
+ return extent[3];
903
+ })))];
904
+ };
905
+ var getExtentOverlapArea = function getExtentOverlapArea(extentA, extentB) {
906
+ var width = Math.max(0, Math.min(extentA[2], extentB[2]) - Math.max(extentA[0], extentB[0]));
907
+ var height = Math.max(0, Math.min(extentA[3], extentB[3]) - Math.max(extentA[1], extentB[1]));
908
+ return width * height;
909
+ };
846
910
  var TimeAwareImageWrapper = /*#__PURE__*/function (_ImageWrapper) {
847
911
  function TimeAwareImageWrapper(extent, resolution, pixelRatio) {
848
912
  var _this;
@@ -855,6 +919,8 @@ var TimeAwareImageWrapper = /*#__PURE__*/function (_ImageWrapper) {
855
919
  _this._resolvers = [];
856
920
  _this._styleName = 'default';
857
921
  _this._layerName = null;
922
+ _this._compositeImageKey = '';
923
+ _this._compositeImage = null;
858
924
  _this.extent = extent;
859
925
  _this.resolution = resolution;
860
926
  _this.state = ImageState.IDLE;
@@ -907,44 +973,184 @@ var TimeAwareImageWrapper = /*#__PURE__*/function (_ImageWrapper) {
907
973
  }, {
908
974
  key: "getAlternativeImage",
909
975
  value: function getAlternativeImage(extent, resolution, pixelRatio, projection, getMapUrl, params, layerName, styleName, dimsProps) {
910
- var _this$getWMSGetMapReq = this.getWMSGetMapRequestURL(extent, resolution, pixelRatio, projection, getMapUrl, params, layerName, styleName, dimsProps),
911
- src = _this$getWMSGetMapReq.src,
912
- newExtent = _this$getWMSGetMapReq.extent,
913
- newResolution = _this$getWMSGetMapReq.resolution;
914
- var geoRef = openLayersGetMapImageStore.getAltGeoReferencedImage(src, newExtent, newResolution);
915
- if (geoRef) {
976
+ var requests = this.getWMSGetMapRequestURLs(extent, resolution, pixelRatio, projection, getMapUrl, params, layerName, styleName, dimsProps);
977
+ var images = requests.map(function (request) {
978
+ var _candidates$filter$ma;
979
+ var candidates = openLayersGetMapImageStore.getAltGeoReferencedImages(request.src, request.extent, request.resolution);
980
+ return (_candidates$filter$ma = candidates.filter(function (image) {
981
+ return image.isLoadedWithoutErrors() && image.geoReference;
982
+ }).map(function (image) {
983
+ return {
984
+ image: image,
985
+ overlapArea: getExtentOverlapArea(image.geoReference.extent, request.extent)
986
+ };
987
+ }).filter(function (_ref) {
988
+ var overlapArea = _ref.overlapArea;
989
+ return overlapArea > 0;
990
+ }).sort(function (imageA, imageB) {
991
+ return imageB.overlapArea - imageA.overlapArea;
992
+ })[0]) === null || _candidates$filter$ma === void 0 ? void 0 : _candidates$filter$ma.image;
993
+ });
994
+ if (images.some(function (image) {
995
+ return !image;
996
+ })) {
997
+ return false;
998
+ }
999
+ var completeImages = images;
1000
+ if (completeImages.length > 1) {
1001
+ var uniqueImages = _toConsumableArray(new Set(completeImages));
1002
+ if (uniqueImages.length !== completeImages.length) {
1003
+ if (uniqueImages.length !== 1) {
1004
+ return false;
1005
+ }
1006
+ var _uniqueImages = _slicedToArray(uniqueImages, 1),
1007
+ _image = _uniqueImages[0];
1008
+ var imageExtent = _image.geoReference.extent;
1009
+ var requestedExtent = combineExtents(requests.map(function (request) {
1010
+ return request.extent;
1011
+ }));
1012
+ if (imageExtent[0] > requestedExtent[0] || imageExtent[1] > requestedExtent[1] || imageExtent[2] < requestedExtent[2] || imageExtent[3] < requestedExtent[3]) {
1013
+ return false;
1014
+ }
1015
+ return {
1016
+ el: _image.getElement(),
1017
+ extent: imageExtent,
1018
+ resolution: _image.geoReference.resolution,
1019
+ isLoaded: _image.isLoaded(),
1020
+ isLoadedWithoutErrors: _image.isLoadedWithoutErrors(),
1021
+ hasError: _image.hasError(),
1022
+ isLoading: _image.isLoading()
1023
+ };
1024
+ }
1025
+ var imageRequests = completeImages.map(function (image, index) {
1026
+ return _objectSpread2(_objectSpread2({}, requests[index]), {}, {
1027
+ extent: image.geoReference.extent,
1028
+ resolution: image.geoReference.resolution
1029
+ });
1030
+ });
1031
+ var image = this.createCompositeImage(completeImages, imageRequests);
1032
+ if (!image) {
1033
+ return false;
1034
+ }
916
1035
  return {
917
- el: geoRef.getElement(),
918
- extent: geoRef.geoReference.extent,
919
- resolution: geoRef.geoReference.resolution,
920
- isLoaded: geoRef.isLoaded(),
921
- isLoadedWithoutErrors: geoRef.isLoadedWithoutErrors(),
922
- hasError: geoRef.hasError(),
923
- isLoading: geoRef.isLoading()
1036
+ el: image,
1037
+ extent: combineExtents(imageRequests.map(function (request) {
1038
+ return request.extent;
1039
+ })),
1040
+ resolution: imageRequests[0].resolution,
1041
+ isLoaded: completeImages.every(function (loadedImage) {
1042
+ return loadedImage.isLoaded();
1043
+ }),
1044
+ isLoadedWithoutErrors: completeImages.every(function (loadedImage) {
1045
+ return loadedImage.isLoadedWithoutErrors();
1046
+ }),
1047
+ hasError: completeImages.some(function (loadedImage) {
1048
+ return loadedImage.hasError();
1049
+ }),
1050
+ isLoading: completeImages.some(function (loadedImage) {
1051
+ return loadedImage.isLoading();
1052
+ })
924
1053
  };
925
1054
  }
926
- return false;
1055
+ var _completeImages = _slicedToArray(completeImages, 1),
1056
+ geoRef = _completeImages[0];
1057
+ return {
1058
+ el: geoRef.getElement(),
1059
+ extent: geoRef.geoReference.extent,
1060
+ resolution: geoRef.geoReference.resolution,
1061
+ isLoaded: geoRef.isLoaded(),
1062
+ isLoadedWithoutErrors: geoRef.isLoadedWithoutErrors(),
1063
+ hasError: geoRef.hasError(),
1064
+ isLoading: geoRef.isLoading()
1065
+ };
927
1066
  }
928
1067
  }, {
929
1068
  key: "hasImage",
930
1069
  value: function hasImage(extent, resolution, pixelRatio, projection, getMapUrl, params, layerName, styleName, dimsProps) {
931
- var _this$getWMSGetMapReq2 = this.getWMSGetMapRequestURL(extent, resolution, pixelRatio, projection, getMapUrl, params, layerName, styleName, dimsProps),
932
- src = _this$getWMSGetMapReq2.src,
933
- newExtent = _this$getWMSGetMapReq2.extent,
934
- newResolution = _this$getWMSGetMapReq2.resolution;
935
- var imageEl = openLayersGetMapImageStore.getImage(src);
936
- if (imageEl) {
1070
+ var requests = this.getWMSGetMapRequestURLs(extent, resolution, pixelRatio, projection, getMapUrl, params, layerName, styleName, dimsProps);
1071
+ var images = requests.map(function (request) {
1072
+ return openLayersGetMapImageStore.getImage(request.src);
1073
+ });
1074
+ if (images.some(function (image) {
1075
+ return !image;
1076
+ })) {
1077
+ return false;
1078
+ }
1079
+ if (images.length === 1) {
1080
+ var _images = _slicedToArray(images, 1),
1081
+ imageEl = _images[0];
937
1082
  return {
938
1083
  el: imageEl.getElement(),
939
- extent: newExtent,
940
- resolution: newResolution,
1084
+ extent: requests[0].extent,
1085
+ resolution: requests[0].resolution,
941
1086
  isLoaded: imageEl.isLoaded(),
942
1087
  isLoadedWithoutErrors: imageEl.isLoadedWithoutErrors(),
943
1088
  hasError: imageEl.hasError(),
944
1089
  isLoading: imageEl.isLoading()
945
1090
  };
946
1091
  }
947
- return false;
1092
+ var completeImages = images;
1093
+ if (!completeImages.every(function (image) {
1094
+ return image.isLoaded();
1095
+ })) {
1096
+ return false;
1097
+ }
1098
+ var image = this.createCompositeImage(completeImages, requests);
1099
+ if (!image) {
1100
+ return false;
1101
+ }
1102
+ return {
1103
+ el: image,
1104
+ extent: combineExtents(requests.map(function (request) {
1105
+ return request.extent;
1106
+ })),
1107
+ resolution: requests[0].resolution,
1108
+ isLoaded: true,
1109
+ isLoadedWithoutErrors: completeImages.every(function (loadedImage) {
1110
+ return loadedImage.isLoadedWithoutErrors();
1111
+ }),
1112
+ hasError: completeImages.some(function (loadedImage) {
1113
+ return loadedImage.hasError();
1114
+ }),
1115
+ isLoading: completeImages.some(function (loadedImage) {
1116
+ return loadedImage.isLoading();
1117
+ })
1118
+ };
1119
+ }
1120
+ }, {
1121
+ key: "createCompositeImage",
1122
+ value: function createCompositeImage(images, requests) {
1123
+ var extent = combineExtents(requests.map(function (request) {
1124
+ return request.extent;
1125
+ }));
1126
+ var resolution = requests[0].resolution;
1127
+ var imageKey = JSON.stringify([images.map(function (image) {
1128
+ return image.getElement().src;
1129
+ }), requests.map(function (request) {
1130
+ return request.extent;
1131
+ }), resolution]);
1132
+ if (this._compositeImage && this._compositeImageKey === imageKey) {
1133
+ return this._compositeImage;
1134
+ }
1135
+ var canvas = document.createElement('canvas');
1136
+ canvas.width = Math.ceil((extent[2] - extent[0]) / resolution);
1137
+ canvas.height = Math.ceil((extent[3] - extent[1]) / resolution);
1138
+ var context = canvas.getContext('2d');
1139
+ if (!context) {
1140
+ return false;
1141
+ }
1142
+ images.forEach(function (image, index) {
1143
+ if (image.hasError()) {
1144
+ return;
1145
+ }
1146
+ var imageExtent = requests[index].extent;
1147
+ var overlapsNextSegment = index < images.length - 1;
1148
+ var destinationWidth = (imageExtent[2] - imageExtent[0]) / resolution + (overlapsNextSegment ? 1 : 0);
1149
+ context.drawImage(image.getElement(), (imageExtent[0] - extent[0]) / resolution, (extent[3] - imageExtent[3]) / resolution, destinationWidth, (imageExtent[3] - imageExtent[1]) / resolution);
1150
+ });
1151
+ this._compositeImageKey = imageKey;
1152
+ this._compositeImage = canvas;
1153
+ return canvas;
948
1154
  }
949
1155
  }, {
950
1156
  key: "setGeoReferencedImage",
@@ -960,22 +1166,33 @@ var TimeAwareImageWrapper = /*#__PURE__*/function (_ImageWrapper) {
960
1166
  key: "load",
961
1167
  value: function load() {
962
1168
  var _this2 = this;
963
- var _this$getWMSGetMapReq3 = this.getWMSGetMapRequestURL(this._extentToLoad, this._resolutionToLoad, this._pixelRatioToLoad, this.projection, this._getMapUrl, this._paramsToLoad, this._layerName, this._styleName, this._dimPropsToLoad),
964
- src = _this$getWMSGetMapReq3.src,
965
- newExtent = _this$getWMSGetMapReq3.extent,
966
- newResolution = _this$getWMSGetMapReq3.resolution;
967
- var imageEl = openLayersGetMapImageStore.getImageAndSetGeoReference(src, {
968
- extent: newExtent,
969
- resolution: newResolution
1169
+ var requests = this.getWMSGetMapRequestURLs(this._extentToLoad, this._resolutionToLoad, this._pixelRatioToLoad, this.projection, this._getMapUrl, this._paramsToLoad, this._layerName, this._styleName, this._dimPropsToLoad);
1170
+ var images = requests.map(function (request) {
1171
+ return openLayersGetMapImageStore.getImageAndSetGeoReference(request.src, {
1172
+ extent: request.extent,
1173
+ resolution: request.resolution
1174
+ });
970
1175
  });
971
- if (!imageEl) {
1176
+ if (images.some(function (image) {
1177
+ return !image;
1178
+ })) {
972
1179
  return;
973
1180
  }
974
- if (imageEl.isLoaded()) {
1181
+ if (images.length === 1) {
1182
+ var _images2 = _slicedToArray(images, 1),
1183
+ imageEl = _images2[0];
1184
+ if (!imageEl.isLoaded()) {
1185
+ this.state = ImageState.LOADING;
1186
+ this.changed();
1187
+ void imageEl.loadAwait()["finally"](function () {
1188
+ return _this2.load();
1189
+ });
1190
+ return;
1191
+ }
975
1192
  this.state = ImageState.LOADED;
976
1193
  this.setImage(imageEl.getElement());
977
- this.extent = newExtent;
978
- this.resolution = newResolution;
1194
+ this.extent = requests[0].extent;
1195
+ this.resolution = requests[0].resolution;
979
1196
  this.changed();
980
1197
  if (imageEl.hasError()) {
981
1198
  this._rejectAll(imageEl.getSrc());
@@ -984,10 +1201,50 @@ var TimeAwareImageWrapper = /*#__PURE__*/function (_ImageWrapper) {
984
1201
  }
985
1202
  return;
986
1203
  }
1204
+ var loadedImages = images;
1205
+ if (loadedImages.every(function (image) {
1206
+ return image.isLoaded();
1207
+ })) {
1208
+ this.state = ImageState.LOADED;
1209
+ var image = this.createCompositeImage(loadedImages, requests);
1210
+ if (!image) {
1211
+ this.state = ImageState.ERROR;
1212
+ this.changed();
1213
+ this._rejectAll(loadedImages[0].getSrc());
1214
+ return;
1215
+ }
1216
+ this.setImage(image);
1217
+ this.extent = combineExtents(requests.map(function (request) {
1218
+ return request.extent;
1219
+ }));
1220
+ this.resolution = requests[0].resolution;
1221
+ this.changed();
1222
+ var failedImage = loadedImages.find(function (loadedImage) {
1223
+ return loadedImage.hasError();
1224
+ });
1225
+ if (failedImage) {
1226
+ this._rejectAll(failedImage.getSrc());
1227
+ } else {
1228
+ this._resolveAll(loadedImages[0]);
1229
+ }
1230
+ return;
1231
+ }
987
1232
  this.state = ImageState.LOADING;
988
1233
  this.changed();
989
- void imageEl.loadAwait()["finally"](function () {
990
- _this2.load();
1234
+ void Promise.all(loadedImages.map(/*#__PURE__*/function () {
1235
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(image) {
1236
+ return _regenerator().w(function (_context) {
1237
+ while (1) switch (_context.n) {
1238
+ case 0:
1239
+ return _context.a(2, image.loadAwait());
1240
+ }
1241
+ }, _callee);
1242
+ }));
1243
+ return function (_x) {
1244
+ return _ref2.apply(this, arguments);
1245
+ };
1246
+ }()))["finally"](function () {
1247
+ return _this2.load();
991
1248
  });
992
1249
  }
993
1250
  }, {
@@ -1017,10 +1274,10 @@ var TimeAwareImageWrapper = /*#__PURE__*/function (_ImageWrapper) {
1017
1274
  }, {
1018
1275
  key: "loadAndResolve",
1019
1276
  value: function () {
1020
- var _loadAndResolve = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(extentToLoad, resolutionToLoad, pixelRatio, projection, getMapUrl, params, layerName, styleName, dimProps) {
1277
+ var _loadAndResolve = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(extentToLoad, resolutionToLoad, pixelRatio, projection, getMapUrl, params, layerName, styleName, dimProps) {
1021
1278
  var _this3 = this;
1022
- return _regenerator().w(function (_context) {
1023
- while (1) switch (_context.n) {
1279
+ return _regenerator().w(function (_context2) {
1280
+ while (1) switch (_context2.n) {
1024
1281
  case 0:
1025
1282
  this._extentToLoad = _toConsumableArray(extentToLoad || []);
1026
1283
  this._resolutionToLoad = resolutionToLoad;
@@ -1031,7 +1288,7 @@ var TimeAwareImageWrapper = /*#__PURE__*/function (_ImageWrapper) {
1031
1288
  this.projection = projection;
1032
1289
  this._styleName = styleName;
1033
1290
  this._dimPropsToLoad = _objectSpread2({}, dimProps);
1034
- return _context.a(2, new Promise(function (resolve, reject) {
1291
+ return _context2.a(2, new Promise(function (resolve, reject) {
1035
1292
  _this3._resolvers.push({
1036
1293
  resolve: resolve,
1037
1294
  reject: reject
@@ -1039,13 +1296,41 @@ var TimeAwareImageWrapper = /*#__PURE__*/function (_ImageWrapper) {
1039
1296
  _this3.load();
1040
1297
  }));
1041
1298
  }
1042
- }, _callee, this);
1299
+ }, _callee2, this);
1043
1300
  }));
1044
- function loadAndResolve(_x, _x2, _x3, _x4, _x5, _x6, _x7, _x8, _x9) {
1301
+ function loadAndResolve(_x2, _x3, _x4, _x5, _x6, _x7, _x8, _x9, _x0) {
1045
1302
  return _loadAndResolve.apply(this, arguments);
1046
1303
  }
1047
1304
  return loadAndResolve;
1048
1305
  }()
1306
+ }, {
1307
+ key: "getWMSGetMapRequestURLs",
1308
+ value: function getWMSGetMapRequestURLs(extentToLoad, resolutionToLoad, pixelRatio, projection, getMapUrl, params, layerName, styleName, dimProps) {
1309
+ var request = this.getWMSGetMapRequestURL(extentToLoad, resolutionToLoad, pixelRatio, projection, getMapUrl, params, layerName, styleName, dimProps);
1310
+ var worldExtent = projection !== null && projection !== void 0 && projection.canWrapX() ? projection.getExtent() : null;
1311
+ if (!request.src || !worldExtent) {
1312
+ return [request];
1313
+ }
1314
+ var segments = splitExtentAtWorldSeams(request.extent, worldExtent);
1315
+ if (segments.length === 1 && segments[0].requestExtent.every(function (value, index) {
1316
+ return value === request.extent[index];
1317
+ })) {
1318
+ return [request];
1319
+ }
1320
+ var paramsToUse = _objectSpread2({}, params);
1321
+ return segments.map(function (_ref3) {
1322
+ var requestExtent = _ref3.requestExtent,
1323
+ displayExtent = _ref3.displayExtent;
1324
+ return {
1325
+ src: getImageSrc(requestExtent, request.resolution, 1, projection, getMapUrl, getRequestParams(_objectSpread2(_objectSpread2(_objectSpread2({}, paramsToUse), dimProps), {}, {
1326
+ LAYERS: layerName,
1327
+ STYLES: styleName
1328
+ }), 'GetMap'), 'mapserver'),
1329
+ extent: displayExtent,
1330
+ resolution: request.resolution
1331
+ };
1332
+ });
1333
+ }
1049
1334
  }]);
1050
1335
  }(ImageWrapper);
1051
1336
 
@@ -1140,6 +1425,7 @@ var TimeawareImageSource = /*#__PURE__*/function (_ImageSource) {
1140
1425
  visible = _ref.visible;
1141
1426
  _classCallCheck(this, TimeawareImageSource);
1142
1427
  _this = _callSuper(this, TimeawareImageSource, [{}]);
1428
+ _this._failedImageRetryTimer = null;
1143
1429
  _this._wmsUrl = wmsUrl;
1144
1430
  _this._extraWMSParams = _objectSpread2({}, params);
1145
1431
  _this._layerName = layerName;
@@ -1244,8 +1530,7 @@ var TimeawareImageSource = /*#__PURE__*/function (_ImageSource) {
1244
1530
  cancelled: false,
1245
1531
  task: function () {
1246
1532
  var _task = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
1247
- var _openLayersGetMapImag;
1248
- var jobWrapper, dimPropsWithTime, _jobWrapper$getWMSGet, src;
1533
+ var jobWrapper, dimPropsWithTime, requests;
1249
1534
  return _regenerator().w(function (_context) {
1250
1535
  while (1) switch (_context.n) {
1251
1536
  case 0:
@@ -1253,8 +1538,12 @@ var TimeawareImageSource = /*#__PURE__*/function (_ImageSource) {
1253
1538
  dimPropsWithTime = _objectSpread2(_objectSpread2({}, _this3._dimProperties), {}, {
1254
1539
  TIME: dimValue
1255
1540
  });
1256
- _jobWrapper$getWMSGet = jobWrapper.getWMSGetMapRequestURL(extent, resolution, pixelRatio, projection, _this3._wmsUrl, _this3._extraWMSParams, _this3._layerName, _this3._styleName, dimPropsWithTime), src = _jobWrapper$getWMSGet.src;
1257
- (_openLayersGetMapImag = openLayersGetMapImageStore.getImage(src)) === null || _openLayersGetMapImag === void 0 || _openLayersGetMapImag.clearError();
1541
+ requests = jobWrapper.getWMSGetMapRequestURLs(extent, resolution, pixelRatio, projection, _this3._wmsUrl, _this3._extraWMSParams, _this3._layerName, _this3._styleName, dimPropsWithTime);
1542
+ requests.forEach(function (_ref2) {
1543
+ var _openLayersGetMapImag;
1544
+ var src = _ref2.src;
1545
+ (_openLayersGetMapImag = openLayersGetMapImageStore.getImage(src)) === null || _openLayersGetMapImag === void 0 || _openLayersGetMapImag.clearError();
1546
+ });
1258
1547
  _context.n = 1;
1259
1548
  return jobWrapper.loadAndResolve(extent, resolution, pixelRatio, projection, _this3._wmsUrl, _this3._extraWMSParams, _this3._layerName, _this3._styleName, dimPropsWithTime)["catch"](function (e) {
1260
1549
  // Do not log errors, as they are not very useful and can better be inspected via the network console
@@ -1296,8 +1585,13 @@ var TimeawareImageSource = /*#__PURE__*/function (_ImageSource) {
1296
1585
  var requestedImageHasWantedExtent = (this._loadedExtent && containsExtent$1(this._loadedExtent, requestExtent) || containsExtent$1(this._imWrapperForOlSource.getExtent(), requestExtent)) && (this._loadedResolution && fromResolutionLike(this._loadedResolution) === requestResolution || fromResolutionLike(this._imWrapperForOlSource.getResolution()) === requestResolution);
1297
1586
  var hasExactImage = this._loadedExtent && this._imWrapperForOlSource.hasImage(this._loadedExtent, this._loadedResolution, pixelRatio, projection, this._wmsUrl, this._extraWMSParams, this._layerName, this._styleName, requestDimProperties);
1298
1587
  if (hasExactImage && hasExactImage.isLoaded && requestedImageHasWantedExtent) {
1299
- this._imWrapperForOlSource.setGeoReferencedImage(hasExactImage);
1300
- return this._imWrapperForOlSource;
1588
+ if (!hasExactImage.hasError) {
1589
+ this._imWrapperForOlSource.setGeoReferencedImage(hasExactImage);
1590
+ return this._imWrapperForOlSource;
1591
+ }
1592
+ // The image failed to load. Do not display the broken image, but check again later: the image is reloaded once it becomes stale.
1593
+ this._scheduleFailedImageRetry();
1594
+ return this._getAltImageOrEmpty(requestExtent, requestResolution, pixelRatio, projection, requestDimProperties);
1301
1595
  }
1302
1596
  this._lastRequestedExtent = requestExtent;
1303
1597
  this._lastRequestedResolution = requestResolution;
@@ -1305,7 +1599,12 @@ var TimeawareImageSource = /*#__PURE__*/function (_ImageSource) {
1305
1599
  this._lastRequestedProjection = projection;
1306
1600
  this.throttledImageLoad();
1307
1601
  // While we are loading, check if there is an alternative image available
1308
- var altImage = this._loadedExtent && this._imWrapperForOlSource.getAlternativeImage(this._lastRequestedExtent, this._lastRequestedResolution, this._lastRequestedPixelRatio, this._lastRequestedProjection, this._wmsUrl, this._extraWMSParams, this._layerName, this._styleName, requestDimProperties);
1602
+ return this._getAltImageOrEmpty(this._lastRequestedExtent, this._lastRequestedResolution, this._lastRequestedPixelRatio, this._lastRequestedProjection, requestDimProperties);
1603
+ }
1604
+ }, {
1605
+ key: "_getAltImageOrEmpty",
1606
+ value: function _getAltImageOrEmpty(extent, resolution, pixelRatio, projection, dimProperties) {
1607
+ var altImage = this._loadedExtent && this._imWrapperForOlSource.getAlternativeImage(extent, resolution, pixelRatio, projection, this._wmsUrl, this._extraWMSParams, this._layerName, this._styleName, dimProperties);
1309
1608
  if (altImage && altImage.isLoaded) {
1310
1609
  // A similar image is available for display, show it
1311
1610
  this._imWrapperForAltImage.setGeoReferencedImage(altImage);
@@ -1314,6 +1613,28 @@ var TimeawareImageSource = /*#__PURE__*/function (_ImageSource) {
1314
1613
  // This thing is has nothing to show yet.
1315
1614
  return this._imWrapperEmptyButLoading;
1316
1615
  }
1616
+ }, {
1617
+ key: "_scheduleFailedImageRetry",
1618
+ value: function _scheduleFailedImageRetry() {
1619
+ var _this4 = this;
1620
+ if (this._failedImageRetryTimer) {
1621
+ return;
1622
+ }
1623
+ this._failedImageRetryTimer = setTimeout(function () {
1624
+ _this4._failedImageRetryTimer = null;
1625
+ _this4.changed();
1626
+ }, FAILED_IMAGE_RETRY_CHECK_INTERVAL_MS);
1627
+ }
1628
+ }, {
1629
+ key: "disposeInternal",
1630
+ value: function disposeInternal() {
1631
+ if (this._failedImageRetryTimer) {
1632
+ clearTimeout(this._failedImageRetryTimer);
1633
+ this._failedImageRetryTimer = null;
1634
+ }
1635
+ this.cancelPrefetch();
1636
+ _superPropGet(TimeawareImageSource, "disposeInternal", this)([]);
1637
+ }
1317
1638
  }, {
1318
1639
  key: "setDimProps",
1319
1640
  value: function setDimProps(params) {
@@ -1358,12 +1679,13 @@ var TimeawareImageSource = /*#__PURE__*/function (_ImageSource) {
1358
1679
  }
1359
1680
  var dimPropWithRequestedDate = _objectSpread2({}, this._dimProperties);
1360
1681
  dimPropWithRequestedDate['TIME'] = isoTime;
1361
- var _this$_imWrapperForOl = this._imWrapperForOlSource.getWMSGetMapRequestURL(this._lastRequestedExtent, this._lastRequestedResolution, this._lastRequestedPixelRatio, this._lastRequestedProjection, this._wmsUrl, this._extraWMSParams, this._layerName, this._styleName, dimPropWithRequestedDate),
1362
- src = _this$_imWrapperForOl.src,
1363
- newExtent = _this$_imWrapperForOl.extent,
1364
- newResolution = _this$_imWrapperForOl.resolution;
1365
- var geoRefs = openLayersGetMapImageStore.getAltGeoReferencedImages(src, newExtent, newResolution);
1366
- return geoRefs;
1682
+ var requests = this._imWrapperForOlSource.getWMSGetMapRequestURLs(this._lastRequestedExtent, this._lastRequestedResolution, this._lastRequestedPixelRatio, this._lastRequestedProjection, this._wmsUrl, this._extraWMSParams, this._layerName, this._styleName, dimPropWithRequestedDate);
1683
+ return requests.flatMap(function (_ref3) {
1684
+ var src = _ref3.src,
1685
+ extent = _ref3.extent,
1686
+ resolution = _ref3.resolution;
1687
+ return openLayersGetMapImageStore.getAltGeoReferencedImages(src, extent, resolution);
1688
+ });
1367
1689
  }
1368
1690
  /**
1369
1691
  * This function can be used to determine if the animation can proceed to the next step.
@@ -1727,6 +2049,36 @@ var fetchEDRParameter = /*#__PURE__*/function () {
1727
2049
  return _ref6.apply(this, arguments);
1728
2050
  };
1729
2051
  }();
2052
+ var fetchEDRJson = /*#__PURE__*/function () {
2053
+ var _ref7 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee7(url) {
2054
+ var response;
2055
+ return _regenerator().w(function (_context7) {
2056
+ while (1) switch (_context7.n) {
2057
+ case 0:
2058
+ _context7.n = 1;
2059
+ return fetch(withJsonFormat(url));
2060
+ case 1:
2061
+ response = _context7.v;
2062
+ return _context7.a(2, handleResponse(response));
2063
+ }
2064
+ }, _callee7);
2065
+ }));
2066
+ return function fetchEDRJson(_x1) {
2067
+ return _ref7.apply(this, arguments);
2068
+ };
2069
+ }();
2070
+ // EDR labels can be plain strings or language maps (e.g. { en: 'Temperature' }).
2071
+ var normalizeEDRLabel = function normalizeEDRLabel(label, fallback) {
2072
+ if (typeof label === 'string' && label) {
2073
+ return label;
2074
+ }
2075
+ if (label && _typeof(label) === 'object' && 'en' in label) {
2076
+ if (typeof label.en === 'string' && label.en) {
2077
+ return label.en;
2078
+ }
2079
+ }
2080
+ return fallback;
2081
+ };
1730
2082
 
1731
2083
  /* *
1732
2084
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -1853,13 +2205,14 @@ var useEDRGetCollectionDetails = function useEDRGetCollectionDetails(edrBaseUrlW
1853
2205
  return useQuery(webmapEDRQueryOptions.getCollectionDetailsQuery(edrBaseUrlWithCollection, enabled, instanceId));
1854
2206
  };
1855
2207
  var useEDRGetParameterData = function useEDRGetParameterData(edrBaseUrlWithCollection, parameterName) {
2208
+ var _datetime$length;
1856
2209
  var datetime = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
1857
2210
  var instanceId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';
1858
2211
  var _useEDRGetCollectionD = useEDRGetCollectionDetails(edrBaseUrlWithCollection, instanceId),
1859
2212
  collection = _useEDRGetCollectionD.data;
1860
2213
  return useQuery({
1861
2214
  staleTime: DEFAULT_STALE_TIME$1,
1862
- queryKey: generateWebmapQueryKeys(['get-parameter-data', edrBaseUrlWithCollection, instanceId, parameterName, datetime]),
2215
+ queryKey: generateWebmapQueryKeys(['get-parameter-data', edrBaseUrlWithCollection, instanceId, parameterName, datetime !== null && datetime !== void 0 ? datetime : '']),
1863
2216
  queryFn: function () {
1864
2217
  var _queryFn2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {
1865
2218
  var data;
@@ -1867,7 +2220,7 @@ var useEDRGetParameterData = function useEDRGetParameterData(edrBaseUrlWithColle
1867
2220
  while (1) switch (_context2.n) {
1868
2221
  case 0:
1869
2222
  _context2.n = 1;
1870
- return fetchEDRParameter(collection, edrBaseUrlWithCollection, parameterName, datetime, instanceId);
2223
+ return fetchEDRParameter(collection, edrBaseUrlWithCollection, parameterName, datetime !== null && datetime !== void 0 ? datetime : '', instanceId);
1871
2224
  case 1:
1872
2225
  data = _context2.v;
1873
2226
  return _context2.a(2, coverageCollectionToFeatureCollection(data, parameterName));
@@ -1879,7 +2232,7 @@ var useEDRGetParameterData = function useEDRGetParameterData(edrBaseUrlWithColle
1879
2232
  }
1880
2233
  return queryFn;
1881
2234
  }(),
1882
- enabled: collection !== undefined && parameterName.length > 0 && datetime.length > 0
2235
+ enabled: collection !== undefined && parameterName.length > 0 && ((_datetime$length = datetime === null || datetime === void 0 ? void 0 : datetime.length) !== null && _datetime$length !== void 0 ? _datetime$length : 0) > 0
1883
2236
  });
1884
2237
  };
1885
2238
 
@@ -3464,7 +3817,7 @@ var getDimensionsList = function getDimensionsList(dimensions) {
3464
3817
  };
3465
3818
 
3466
3819
  var LayerInfoDialog = function LayerInfoDialog(_ref) {
3467
- var _layer$styles, _layer$styles2, _layer$path, _layer$keywords;
3820
+ var _layer$styles, _layer$styles2, _edrParameterMetadata, _edrParameterMetadata2, _edrParameterMetadata3, _layer$path, _layer$keywords;
3468
3821
  var onClose = _ref.onClose,
3469
3822
  layer = _ref.layer,
3470
3823
  serviceName = _ref.serviceName,
@@ -3484,7 +3837,8 @@ var LayerInfoDialog = function LayerInfoDialog(_ref) {
3484
3837
  } : _ref$startPosition,
3485
3838
  selectedStyle = _ref.selectedStyle,
3486
3839
  showLayerLegend = _ref.showLayerLegend,
3487
- onToggleLayerLegendVisibility = _ref.onToggleLayerLegendVisibility;
3840
+ onToggleLayerLegendVisibility = _ref.onToggleLayerLegendVisibility,
3841
+ edrParameterMetadata = _ref.edrParameterMetadata;
3488
3842
  var styles = getLayerStyles(layer);
3489
3843
  var dimensions = getDimensionsList(layer.dimensions);
3490
3844
  var _useWebmapReactTransl = useWebmapReactTranslation(),
@@ -3517,6 +3871,17 @@ var LayerInfoDialog = function LayerInfoDialog(_ref) {
3517
3871
  }), jsx(LayerInfoText, {
3518
3872
  label: t('webmap-react-name'),
3519
3873
  value: layer.name
3874
+ }), !!edrParameterMetadata && jsxs(Fragment, {
3875
+ children: [jsx(LayerInfoText, {
3876
+ label: "EDR parameter",
3877
+ value: edrParameterMetadata.id || layer.name
3878
+ }), jsx(LayerInfoText, {
3879
+ label: "Observed property",
3880
+ value: ((_edrParameterMetadata = edrParameterMetadata.observedProperty) === null || _edrParameterMetadata === void 0 ? void 0 : _edrParameterMetadata.label) || '-'
3881
+ }), jsx(LayerInfoText, {
3882
+ label: "Unit",
3883
+ value: ((_edrParameterMetadata2 = edrParameterMetadata.unit) === null || _edrParameterMetadata2 === void 0 || (_edrParameterMetadata2 = _edrParameterMetadata2.symbol) === null || _edrParameterMetadata2 === void 0 ? void 0 : _edrParameterMetadata2.value) || ((_edrParameterMetadata3 = edrParameterMetadata.unit) === null || _edrParameterMetadata3 === void 0 ? void 0 : _edrParameterMetadata3.label) || '-'
3884
+ })]
3520
3885
  }), jsx(LayerInfoText, {
3521
3886
  label: t('webmap-react-service'),
3522
3887
  value: serviceName
@@ -6982,11 +7347,12 @@ var TimeawareImageSourceWMSLayer = function TimeawareImageSourceWMSLayer(_ref) {
6982
7347
  // Assign olSource in wmlayer for metronome
6983
7348
  wmLayer.olSource = olLayer === null || olLayer === void 0 ? void 0 : olLayer.getSource();
6984
7349
  return function () {
6985
- var _olLayer$getSource;
6986
- olLayer === null || olLayer === void 0 || (_olLayer$getSource = olLayer.getSource()) === null || _olLayer$getSource === void 0 || _olLayer$getSource.cancelPrefetch();
7350
+ var olSource = olLayer.getSource();
7351
+ olSource === null || olSource === void 0 || olSource.cancelPrefetch();
6987
7352
  wmLayer.olSource = null;
6988
7353
  map.removeLayer(olLayer);
6989
7354
  olLayer.dispose();
7355
+ olSource === null || olSource === void 0 || olSource.dispose();
6990
7356
  };
6991
7357
  // The dependency list should only contain the map, wmLayer, visible and dimensionValues. Other prop changes are handled by other effects.
6992
7358
  // eslint-disable-next-line react-hooks/exhaustive-deps
@@ -11528,8 +11894,9 @@ var OpenLayersMapDraw = function OpenLayersMapDraw(_ref) {
11528
11894
  }
11529
11895
  // Transform back to orig
11530
11896
  var splitResultAsGeoJson = geojsonFormatter.writeFeaturesObject(geojsonFormatterNoTransform.readFeatures(splitResult));
11531
- // Only the first part continues as the current feature, the other parts are new features
11532
- var splitFeatures = keepIdentityOnFirstSplitFeature(splitResultAsGeoJson.features, selectedFeature);
11897
+ // Round like updateFeature does, so a later edit of one part does not
11898
+ // move the shared edge away from the other part.
11899
+ var splitFeatures = keepIdentityOnFirstSplitFeature(splitResultAsGeoJson.features.map(roundFeatureCoordinates), selectedFeature);
11533
11900
  // Assemble the result.
11534
11901
  var newGeoJson = _objectSpread2(_objectSpread2({}, geojson), {}, {
11535
11902
  features: [].concat(_toConsumableArray(geojson.features.slice(0, selectedFeatureIndex)), _toConsumableArray(splitFeatures), _toConsumableArray(geojson.features.slice(selectedFeatureIndex + 1)))
@@ -14470,4 +14837,4 @@ var getLayerUpdateInfo = function getLayerUpdateInfo(wmLayer, mapId) {
14470
14837
  return updateObject;
14471
14838
  };
14472
14839
 
14473
- export { BaseLayerType, CLASSNAME_MAP_MEASURE_TOOLTIP, CONSTRAINED_SELECTION_TYPES, COORDINATE_DECIMALS, ClickOnMapTool, Clock, DEFAULT_GEOJSON_STYLE_FILL_OPACITY, DRAWMODE, DefaultBaseLayers, DimensionSelectButton, DimensionSelectDialog, DimensionSelectSlider, EditModeButton as EditModeButtonField, FEATURE_DRAW_FILL_COLOR, FEATURE_DRAW_FILL_COLOR_TRANSPARENT, FEATURE_DRAW_SECONDARY_FILL_COLOR, FEATURE_DRAW_SECONDARY_STROKE_COLOR, FEATURE_DRAW_STROKE_COLOR, FEATURE_FILL, FEATURE_FILL_SELECTED, FEATURE_STROKE, FEATURE_STROKE_EDIT, FEATURE_STROKE_SELECTED, FEATURE_VERTICES_EDIT_HANDLES, FEATURE_VERTICE_HANDLE_IMAGE, FEATURE_VERTICE_IMAGE, FeatureLayer, FeatureLayers, GeoJSONTextField, IntersectionSelect, LayerInfoButton, LayerInfoDialog, LayerInfoLegend, LayerInfoList, LayerInfoText, Legend, LegendButton, LegendDialog, LegendLayout, MIN_HEIGHT, MIN_WIDTH, MapContext, MapControlButton, MapControls, MapDimensionSelect, MapFeatureClass, MapMeasure, MapTime, MapWarningProperties, NEW_FEATURE_CREATED, NEW_LINESTRING_CREATED, NEW_POINT_CREATED, OpenLayersFeatureLayer, OpenLayersGetFeatureInfo, OpenLayersLayer, OpenLayersMapDraw, OpenLayersMapView, OpenLayersZoomControl, POINTER_CLICK_TOLERANCE_PX, SELECTED_FEATURE_COLOR, SELECTED_POINT_HALO_STYLE, STAC_ASSET_STYLE_PREFIX, STAC_ITEM_PAGE_LIMIT, STAC_ITEM_SEARCH_FIELDS_CONFORMANCE, STAC_TEMPORAL_STEP_SAMPLE_LIMIT, SelectField, StoryLayoutGrid, TRANSIENT_FEATURE_PROPERTIES, TimeAwareEDRLocationLayer, TimeAwareGeoTIFFLayer, TimeAwareWMTSLayer, TimeContext, TimeawareImageSource, TimeawareImageSourceWMSLayer, WEBMAP_REACT_NAMESPACE, WMSLayer, WMTSLayer, XYZLayer, ZoomControls, addFeatureProperties, addGeoJSONProperties, addSelectionTypeToGeoJSON, asNewFeature, basicExampleDrawOptions, basicExampleMultipleShapeDrawOptions, basicExampleMultipleShapeWithValuesDrawOptions, basicExampleSharedVertexDrawOptions, calculateBoxSelection, calculateNewSelection, catmullRomSpline, clearImageCacheForAllMaps, colorMaps, connectSharedVertices, createBoxBasedOnModifiedVertex, createIconStyle, createInterSections, createModifyFeatures, createMoveFeatures, createOval, currentlySupportedDrawModes, defaultBox, defaultCircle, defaultDelete, defaultEdrStyles, defaultFreehandLine, defaultGeoJSONStyleProperties, defaultIntersectionStyleProperties, defaultLayers, defaultLineString, defaultLocation, defaultModes, defaultOval, defaultPoint, defaultPolygon, defaultRotatableBox, defaultSmoothLine, defaultSplit, defaultSquare, defaultTimeFormat, dimensionConfig, drawPolyStoryStyles, drawStyles, emptyGeoJSON, endToolExampleConfig, exampleIntersectionOptions, exampleIntersectionWithShapeOptions, exampleIntersections, exampleIntersectionsMultiDrawTool, featureMultiPoint, featurePoint, featurePolygon, fetchStacCatalogCollections, fetchStacCatalogRoot, fetchStacCollection, fetchStacItem, fetchStacItems, fetchStacItemsPage, fetchStacItemsWithPagination, fillOptions, firSelectionType, formatTime, generateImageFromLegend, genericOpenLayersFeatureStyle, geowebColorToOpenLayersColor, getAffectedIndices, getBoxRotateHandlePoints, getBoxSelectPreviewStyle, getDimensionIcon, getDimensionLabel, getDimensionValue, getDimensionsList, getDoubleControlToolIcon, getDrawModeIdFromSelectionType, getFeatureCollection, getFeatureExtent, getFeaturePointStyle, getFirTitle, getGeoJSONPropertyValue, getGeoJson, getIcon, getIntersectionToolIcon, getIsInsideAcceptanceTime, getLastEmptyFeatureIndex, getLayerBbox, getLayerExtentForProjection, getLayerStyles, getLayerUpdateInfo, getLegendClass, getOlFeatureKey, getProj4, getRendersAsStyles, getStacAssetKeyFromStyle, getStacAssetStyles, getStacCollectionStyles, getStacFrameItemsToRender, getStacItemLookupWindowForTimes, getStacItemSearchUrl, getStacItemsUrl, getTimeDimension, getToolIcon, hasEditableVertices, initializeOpenLayersProjections, inlineFeatureStyle, intersectPointGeoJSONS, intersectPolygonGeoJSONS, intersectionFeatureBE, intersectionFeatureNL, isBrowserReadableGeoTIFFAsset, isClickFromDrag, isDefaultModifiable, isDefaultMovable, isGeoJSONFeatureCreatedByTool, isGeoJSONGeometryEmpty, isGeoTIFFAsset, isPointFeatureCollection, keepIdentityOnFirstSplitFeature, labelOptions, lineString, lineStringCollection, makeFeatureStyleDisc, makeFeatureStyleLoading, makeFeatureStyleMultiParam, makeFeatureStyleMultiParamLoading, makeFeatureStyleWind, makeLegendFromColorMap, makeLegendFromStyleName, makeTimeList, makeView, marksByDimension, measureResultStyle, measureToolStyle, modifyHandleStyle$1 as modifyHandleStyle, modifyStyles, moveFeature, multiLineStringLabelStyle, multiPolygonLabelStyle, opacityOptions, openLayersGetMapImageStore, polygonCleanDangling, polygonCleanDanglingCoords, polygonFeatureCollectionCleanDangling, precipitationMMLegendColorsWoW, projectorCache, publicLayers, publicServices, removeFeatureProperties, removeOverlappingLines, removeTransientFeatureProperties, resolvePreferredStyleName$1 as resolvePreferredStyleName, resolveStacAssetKey, rewindGeometry, roundCoordinates, roundFeatureCoordinates, selectPreferredWMSProjection, setMapCenter, setViewFromExtent, setViewFromFeature, shouldEnterEditMode, shouldExitEditModeForMultiSelect, simpleBoxGeoJSON, simpleBoxGeoJSONWrongOrder, simpleFlightRouteLineStringGeoJSON, simpleFlightRoutePointsGeoJSON, simpleGeometryCollectionGeoJSON, simpleLineStringGeoJSON, simpleMultiPolygon, simplePointsGeojson, simplePolygonGeoJSON, simpleSmallLineStringGeoJSON, splitLine, splitPolygon, splitStyle, stacCatalogCollectionToLayerProps, stacColormapToOlStyle, stacGrayscaleOlStyle, stacNormalizedGrayscaleOlStyle, startToolExampleConfig, strokeWidthOptions, styleNameToStyleLike, temperatureLegendColorsCWK, temperatureLegendColorsWoW, textLabelStyle, textStyle, textStyleWithMargin, toMovedFeatures, updateEditModeButtonsWithFir, useAnimationForLayer, useEDRGetCollectionDetails, useEDRGetParameterData, useEDRWMLayer, useGeoJSON, useGetWMLayerInstance, useGetWMSLayerStyleList, useIconStyle, useMapDrawTool, useModifyFeatures, useMoveFeatures, useProjection, useQueryGetWMSGetCapabilities, useQueryGetWMSLayer, useQueryGetWMSLayers, useQueryGetWMSLayersTree, useQueryGetWMSServiceInfo, useQueryWMTSGetCapabilities, useSetIntervalWhenVisible, useStacCatalogRoot, useStacCollection, useStacItems, useStacOverviewItems, useStacTemporalStepItems, useViewFromLayer, viewUtils, webmapEDRQueryOptions, webmapReactTranslations };
14840
+ export { BaseLayerType, CLASSNAME_MAP_MEASURE_TOOLTIP, CONSTRAINED_SELECTION_TYPES, COORDINATE_DECIMALS, ClickOnMapTool, Clock, DEFAULT_GEOJSON_STYLE_FILL_OPACITY, DRAWMODE, DefaultBaseLayers, DimensionSelectButton, DimensionSelectDialog, DimensionSelectSlider, EditModeButton as EditModeButtonField, FEATURE_DRAW_FILL_COLOR, FEATURE_DRAW_FILL_COLOR_TRANSPARENT, FEATURE_DRAW_SECONDARY_FILL_COLOR, FEATURE_DRAW_SECONDARY_STROKE_COLOR, FEATURE_DRAW_STROKE_COLOR, FEATURE_FILL, FEATURE_FILL_SELECTED, FEATURE_STROKE, FEATURE_STROKE_EDIT, FEATURE_STROKE_SELECTED, FEATURE_VERTICES_EDIT_HANDLES, FEATURE_VERTICE_HANDLE_IMAGE, FEATURE_VERTICE_IMAGE, FeatureLayer, FeatureLayers, GeoJSONTextField, IntersectionSelect, LayerInfoButton, LayerInfoDialog, LayerInfoLegend, LayerInfoList, LayerInfoText, Legend, LegendButton, LegendDialog, LegendLayout, MIN_HEIGHT, MIN_WIDTH, MapContext, MapControlButton, MapControls, MapDimensionSelect, MapFeatureClass, MapMeasure, MapTime, MapWarningProperties, NEW_FEATURE_CREATED, NEW_LINESTRING_CREATED, NEW_POINT_CREATED, OpenLayersFeatureLayer, OpenLayersGetFeatureInfo, OpenLayersLayer, OpenLayersMapDraw, OpenLayersMapView, OpenLayersZoomControl, POINTER_CLICK_TOLERANCE_PX, SELECTED_FEATURE_COLOR, SELECTED_POINT_HALO_STYLE, STAC_ASSET_STYLE_PREFIX, STAC_ITEM_PAGE_LIMIT, STAC_ITEM_SEARCH_FIELDS_CONFORMANCE, STAC_TEMPORAL_STEP_SAMPLE_LIMIT, SelectField, StoryLayoutGrid, TRANSIENT_FEATURE_PROPERTIES, TimeAwareEDRLocationLayer, TimeAwareGeoTIFFLayer, TimeAwareWMTSLayer, TimeContext, TimeawareImageSource, TimeawareImageSourceWMSLayer, WEBMAP_REACT_NAMESPACE, WMSLayer, WMTSLayer, XYZLayer, ZoomControls, addFeatureProperties, addGeoJSONProperties, addSelectionTypeToGeoJSON, asNewFeature, basicExampleDrawOptions, basicExampleMultipleShapeDrawOptions, basicExampleMultipleShapeWithValuesDrawOptions, basicExampleSharedVertexDrawOptions, calculateBoxSelection, calculateNewSelection, catmullRomSpline, clearImageCacheForAllMaps, colorMaps, connectSharedVertices, createBoxBasedOnModifiedVertex, createIconStyle, createInterSections, createModifyFeatures, createMoveFeatures, createOval, currentlySupportedDrawModes, defaultBox, defaultCircle, defaultDelete, defaultEdrStyles, defaultFreehandLine, defaultGeoJSONStyleProperties, defaultIntersectionStyleProperties, defaultLayers, defaultLineString, defaultLocation, defaultModes, defaultOval, defaultPoint, defaultPolygon, defaultRotatableBox, defaultSmoothLine, defaultSplit, defaultSquare, defaultTimeFormat, dimensionConfig, drawPolyStoryStyles, drawStyles, emptyGeoJSON, endToolExampleConfig, exampleIntersectionOptions, exampleIntersectionWithShapeOptions, exampleIntersections, exampleIntersectionsMultiDrawTool, featureMultiPoint, featurePoint, featurePolygon, fetchEDRArea, fetchEDRCollectionDetails, fetchEDRCube, fetchEDRJson, fetchEDRParameter, fetchStacCatalogCollections, fetchStacCatalogRoot, fetchStacCollection, fetchStacItem, fetchStacItems, fetchStacItemsPage, fetchStacItemsWithPagination, fillOptions, firSelectionType, formatTime, generateImageFromLegend, genericOpenLayersFeatureStyle, geowebColorToOpenLayersColor, getAffectedIndices, getBoxRotateHandlePoints, getBoxSelectPreviewStyle, getDimensionIcon, getDimensionLabel, getDimensionValue, getDimensionsList, getDoubleControlToolIcon, getDrawModeIdFromSelectionType, getFeatureCollection, getFeatureExtent, getFeaturePointStyle, getFirTitle, getGeoJSONPropertyValue, getGeoJson, getIcon, getIntersectionToolIcon, getIsInsideAcceptanceTime, getLastEmptyFeatureIndex, getLayerBbox, getLayerExtentForProjection, getLayerStyles, getLayerUpdateInfo, getLegendClass, getOlFeatureKey, getProj4, getRendersAsStyles, getStacAssetKeyFromStyle, getStacAssetStyles, getStacCollectionStyles, getStacFrameItemsToRender, getStacItemLookupWindowForTimes, getStacItemSearchUrl, getStacItemsUrl, getTimeDimension, getToolIcon, handleResponse, hasEditableVertices, initializeOpenLayersProjections, inlineFeatureStyle, intersectPointGeoJSONS, intersectPolygonGeoJSONS, intersectionFeatureBE, intersectionFeatureNL, isBrowserReadableGeoTIFFAsset, isClickFromDrag, isDefaultModifiable, isDefaultMovable, isGeoJSONFeatureCreatedByTool, isGeoJSONGeometryEmpty, isGeoTIFFAsset, isPointFeatureCollection, joinUrlParams, keepIdentityOnFirstSplitFeature, labelOptions, lineString, lineStringCollection, makeFeatureStyleDisc, makeFeatureStyleLoading, makeFeatureStyleMultiParam, makeFeatureStyleMultiParamLoading, makeFeatureStyleWind, makeLegendFromColorMap, makeLegendFromStyleName, makeTimeList, makeView, marksByDimension, measureResultStyle, measureToolStyle, modifyHandleStyle$1 as modifyHandleStyle, modifyStyles, moveFeature, multiLineStringLabelStyle, multiPolygonLabelStyle, normalizeEDRLabel, opacityOptions, openLayersGetMapImageStore, polygonCleanDangling, polygonCleanDanglingCoords, polygonFeatureCollectionCleanDangling, precipitationMMLegendColorsWoW, projectorCache, publicLayers, publicServices, removeFeatureProperties, removeOverlappingLines, removeTransientFeatureProperties, resolvePreferredStyleName$1 as resolvePreferredStyleName, resolveStacAssetKey, rewindGeometry, roundCoordinates, roundFeatureCoordinates, selectPreferredWMSProjection, setMapCenter, setViewFromExtent, setViewFromFeature, shouldEnterEditMode, shouldExitEditModeForMultiSelect, simpleBoxGeoJSON, simpleBoxGeoJSONWrongOrder, simpleFlightRouteLineStringGeoJSON, simpleFlightRoutePointsGeoJSON, simpleGeometryCollectionGeoJSON, simpleLineStringGeoJSON, simpleMultiPolygon, simplePointsGeojson, simplePolygonGeoJSON, simpleSmallLineStringGeoJSON, splitLine, splitPolygon, splitStyle, stacCatalogCollectionToLayerProps, stacColormapToOlStyle, stacGrayscaleOlStyle, stacNormalizedGrayscaleOlStyle, startToolExampleConfig, strokeWidthOptions, styleNameToStyleLike, temperatureLegendColorsCWK, temperatureLegendColorsWoW, textLabelStyle, textStyle, textStyleWithMargin, toMovedFeatures, updateEditModeButtonsWithFir, useAnimationForLayer, useEDRGetCollectionDetails, useEDRGetParameterData, useEDRWMLayer, useGeoJSON, useGetWMLayerInstance, useGetWMSLayerStyleList, useIconStyle, useMapDrawTool, useModifyFeatures, useMoveFeatures, useProjection, useQueryGetWMSGetCapabilities, useQueryGetWMSLayer, useQueryGetWMSLayers, useQueryGetWMSLayersTree, useQueryGetWMSServiceInfo, useQueryWMTSGetCapabilities, useSetIntervalWhenVisible, useStacCatalogRoot, useStacCollection, useStacItems, useStacOverviewItems, useStacTemporalStepItems, useViewFromLayer, viewUtils, webmapEDRQueryOptions, webmapReactTranslations };
@@ -14,5 +14,19 @@ export interface LayerInfoDialogProps {
14
14
  selectedStyle?: string;
15
15
  showLayerLegend: boolean;
16
16
  onToggleLayerLegendVisibility: (showLegend: boolean) => void;
17
+ edrParameterMetadata?: {
18
+ id?: string;
19
+ label?: string;
20
+ description?: string;
21
+ observedProperty?: {
22
+ label?: string;
23
+ };
24
+ unit?: {
25
+ label?: string;
26
+ symbol?: {
27
+ value?: string;
28
+ };
29
+ };
30
+ };
17
31
  }
18
32
  export declare const LayerInfoDialog: React.FC<LayerInfoDialogProps>;
@@ -11,7 +11,7 @@ interface TimeAwareGeoreferencedImageSrc {
11
11
  resolution: number;
12
12
  }
13
13
  interface TimeAwareGeoreferencedImage {
14
- el: HTMLImageElement;
14
+ el: HTMLImageElement | HTMLCanvasElement;
15
15
  extent: Extent;
16
16
  resolution: number;
17
17
  isLoaded: boolean;
@@ -19,6 +19,7 @@ interface TimeAwareGeoreferencedImage {
19
19
  isLoadedWithoutErrors: boolean;
20
20
  isLoading: boolean;
21
21
  }
22
+ type TimeAwareGeoreferencedImageRequest = TimeAwareGeoreferencedImageSrc;
22
23
  declare class TimeAwareImageWrapper extends ImageWrapper {
23
24
  private _extentToLoad;
24
25
  private _resolutionToLoad;
@@ -30,15 +31,19 @@ declare class TimeAwareImageWrapper extends ImageWrapper {
30
31
  private _resolvers;
31
32
  private _styleName;
32
33
  private _layerName;
34
+ private _compositeImageKey;
35
+ private _compositeImage;
33
36
  constructor(extent: Extent, resolution: number, pixelRatio: number);
34
37
  getWMSGetMapRequestURL(extentToLoad: Extent, resolutionToLoad: number, __pixelRatio: number, projection: Projection | null, getMapUrl: string | null, params: Record<string, string>, layerName: string | null, styleName: string, dimProps: Record<string, string>): TimeAwareGeoreferencedImageSrc;
35
38
  getAlternativeImage(extent: Extent, resolution: number, pixelRatio: number, projection: Projection, getMapUrl: string, params: Record<string, string>, layerName: string, styleName: string, dimsProps: Record<string, string>): TimeAwareGeoreferencedImage | false;
36
39
  hasImage(extent: Extent, resolution: number, pixelRatio: number, projection: Projection, getMapUrl: string, params: Record<string, string>, layerName: string, styleName: string, dimsProps: Record<string, string>): TimeAwareGeoreferencedImage | false;
40
+ private createCompositeImage;
37
41
  setGeoReferencedImage(image: TimeAwareGeoreferencedImage): void;
38
42
  load(): void;
39
43
  setState(state: number): void;
40
44
  private _rejectAll;
41
45
  private _resolveAll;
42
46
  loadAndResolve(extentToLoad: Extent, resolutionToLoad: number, pixelRatio: number, projection: Projection, getMapUrl: string, params: Record<string, string>, layerName: string, styleName: string, dimProps: Record<string, string>): Promise<WMImage>;
47
+ getWMSGetMapRequestURLs(extentToLoad: Extent, resolutionToLoad: number, pixelRatio: number, projection: Projection | null, getMapUrl: string | null, params: Record<string, string>, layerName: string | null, styleName: string, dimProps: Record<string, string>): TimeAwareGeoreferencedImageRequest[];
43
48
  }
44
49
  export default TimeAwareImageWrapper;
@@ -38,6 +38,7 @@ export declare class TimeawareImageSource extends ImageSource {
38
38
  private throttledPrefetch;
39
39
  private throttledImageLoad;
40
40
  private _layerId;
41
+ private _failedImageRetryTimer;
41
42
  constructor({ wmsUrl, timeStampsToPrefetch, layerName, layerId, styleName, dimProps, params, visible, }: TimeawareImageSourceOptions);
42
43
  private _conditionalPrefetch;
43
44
  private _loadImagery;
@@ -45,6 +46,9 @@ export declare class TimeawareImageSource extends ImageSource {
45
46
  triggerPrefetch(): void;
46
47
  cancelPrefetch(): void;
47
48
  getImage(extent: Extent, resolution: number, pixelRatio: number, projection: Projection): ImageWrapper;
49
+ private _getAltImageOrEmpty;
50
+ private _scheduleFailedImageRetry;
51
+ disposeInternal(): void;
48
52
  setDimProps(params: Record<string, string>): void;
49
53
  /**
50
54
  * Check if an image is available and loaded for requested date. Used for showlayerinfo to proceed.
@@ -5,4 +5,5 @@ export declare const ENABLE_PREFETCH = true;
5
5
  export declare const ADD_SHOW_DIMS_OPTION = false;
6
6
  export declare const NUM_IMAGES_TO_CACHE = 10000;
7
7
  export declare const WMS_EXTENT_RATIO_TO_VIEWPORT = 1.2;
8
+ export declare const FAILED_IMAGE_RETRY_CHECK_INTERVAL_MS = 10000;
8
9
  export declare const TIMEAWAREIMAGEWRAPPER_IMAGEDIDNOTLOADSUCCESFULLY = "Image did not load succesfully";
@@ -5,3 +5,5 @@ export declare const fetchEDRCollectionDetails: (edrBaseUrlWithCollection: strin
5
5
  export declare const fetchEDRCube: (edrBaseUrlWithCollection: string, parameterName: string, datetime?: string, instanceId?: string, bbox?: string) => Promise<CoverageCollection<PointDomain | PointSeriesDomain> | Coverage<PointDomain | PointSeriesDomain>>;
6
6
  export declare const fetchEDRArea: (edrBaseUrlWithCollection: string, parameterName: string, datetime?: string, instanceId?: string, coords?: string) => Promise<CoverageCollection<PointDomain | PointSeriesDomain> | Coverage<PointDomain | PointSeriesDomain>>;
7
7
  export declare const fetchEDRParameter: (collection: EDRInstance | undefined, edrBaseUrlWithCollection: string, parameterName: string, datetime?: string, instanceId?: string) => Promise<CoverageCollection<PointDomain | PointSeriesDomain> | Coverage<PointDomain | PointSeriesDomain> | undefined>;
8
+ export declare const fetchEDRJson: <T>(url: string) => Promise<T>;
9
+ export declare const normalizeEDRLabel: (label: unknown, fallback: string) => string;
@@ -11,4 +11,4 @@ export declare const webmapEDRQueryOptions: {
11
11
  };
12
12
  };
13
13
  export declare const useEDRGetCollectionDetails: (edrBaseUrlWithCollection: string, instanceId?: string, enabled?: boolean) => UseQueryResult<EDRInstance>;
14
- export declare const useEDRGetParameterData: (edrBaseUrlWithCollection: string, parameterName: string, datetime?: string, instanceId?: string) => UseQueryResult<GeoJSON.FeatureCollection | undefined>;
14
+ export declare const useEDRGetParameterData: (edrBaseUrlWithCollection: string, parameterName: string, datetime?: string | null, instanceId?: string) => UseQueryResult<GeoJSON.FeatureCollection | undefined>;
@@ -1,3 +1,4 @@
1
1
  export * from './hooks';
2
+ export * from './api';
2
3
  export * from './colormaps';
3
4
  export { useEDRWMLayer } from './utils/useEDRWMLayer';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengeoweb/webmap-react",
3
- "version": "20.0.1",
3
+ "version": "20.1.0",
4
4
  "description": "GeoWeb react wrapper for webmap",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -20,9 +20,9 @@
20
20
  }
21
21
  },
22
22
  "dependencies": {
23
- "@opengeoweb/webmap": "20.0.1",
24
- "@opengeoweb/theme": "20.0.1",
25
- "@opengeoweb/shared": "20.0.1",
23
+ "@opengeoweb/webmap": "20.1.0",
24
+ "@opengeoweb/theme": "20.1.0",
25
+ "@opengeoweb/shared": "20.1.0",
26
26
  "lodash": "^4.18.1",
27
27
  "ol": "^10.4.0",
28
28
  "proj4": "^2.9.2",