Tom R
Tom R

Reputation: 48

What is proper way to clear the image cache on an Openlayers ImageWMS source?

I have an ImageLayer with an ImageWMS source. When the user changes the map time I use wmsLayer.getSource().updateParams() to update its TIME parameter. This works fine if the time exists on the server. Openlayers generates a new getMap request with the new TIME parameter. But if the new time doesn't exist and the server returns an error, the map layer continues to display the old image. I want the old image to be cleared and nothing to be displayed on the map (I show a failure indicator elsewhere).

To fix this I use

wmsLayer.getSource().on('imageloaderror', onLoadError).

Then in onLoadError I was doing this, which used to work:

wmsLayer.renderer_.image_=null;

This stopped working at some point and I recently had to change it to this:

wmsLayer.getRenderer().image=null;

The problem is that I think I'm reaching into implementation details with a club fist, so I'm wondering what the proper, forward compatible way to clear the image cache is after a request fails to return an image. I am currently using openlayers 10.2.

Upvotes: 0

Views: 67

Answers (1)

Mike
Mike

Reputation: 17962

If you cannot use opacity a better way would be to prevent errors reaching the image. Typically a WMS will return a status even with a invalid request as the response will be xml instead of an image. You can check the response content type in a custom imageLoadFunction and set the OpenLayers image src to an empty data url if the response is not an image:

const canvas = document.createElement('canvas');
canvas.width = 1;
canvas.height = 1;
const empty = canvas.toDataURL();

const source =  new ol.source.ImageWMS({
  url: 'https://....',
  params: {'LAYERS': '....'},
  imageLoadFunction: function(img, src) {
    fetch(src).then((response) => {
      if (response.headers.get('content-type').startsWith('image/')) {
        response.blob().then((blob) => {
          img.getImage().src = URL.createObjectURL(blob);
        });
      } else {
        img.getImage().src = empty;
      }
    });
  },
});

Upvotes: 0

Related Questions