如何将 XMLHttpRequest 与开放层一起使用
How to use XMLHttpRequest with Open Layers
我需要从多个 WebMapServers(我公司的)使用开放层(和纯 Javascript)获取图像。
基本上它有效。问题是某些服务器需要 HTTP Basic Auth。 OL 文档和相关的 SO 问题说这应该通过 imageLoadFunction 中的 XMLHttpRequest 来完成:
https://openlayers.org/en/latest/apidoc/module-ol_Image.html
起初我想使用 XMLHttpRequest 获取图片,但不使用 Basic Auth:
var map = new ol.Map({
target: 'map',
layers: [
new ol.layer.Image({
source: new ol.source.ImageWMS({
ratio: 1,
params: { LAYERS: 'ENC', CSBOOL: '2083', CSVALUE: ',,,,,3'},
url: 'https://wms-without-basic-auth.com/?',
imageLoadFunction: function(image, src) {
image.getImage().src = src;
/*
var client = new XMLHttpRequest();
client.open('GET', src, true);
client.setRequestHeader( 'Content-Type', 'image/png' );
client.setRequestHeader( 'Accept', 'image/png' );
client.onload(function() {
image.getImage().src = src;
});
client.send();
*/
},
})
})
],
view: new ol.View({
center: ol.proj.fromLonLat([6,54]),
zoom: 6
})
});
imageLoadFunction 仅适用于行
image.getImage().src = src;
但不包含注释的 XMLHttpRequest。
我认为必须在 client.onload 函数中分配加载的图像,但我不确定如何执行此操作。
那么我应该如何使用 imageLoadFunction 中的 XMLHttpRequest?
来自the docs:
Providing a custom imageLoadFunction can be useful to load images with post requests or - in general - through XHR requests, where the src of the image element would be set to a data URI when the content is loaded.
也许可以试试这样:
imageLoadFunction: function(image, src) {
var client = new XMLHttpRequest();
client.open('GET', src, true);
client.setRequestHeader( 'Content-Type', 'image/png' );
client.setRequestHeader( 'Accept', 'image/png' );
client.responseType = 'blob';
client.onload(function() {
const blob = new Blob(client.response);
const urlData = URL.createObjectURL(blob);
image.getImage().src = urlData;
});
client.send();
},
它的作用:
- 从您的服务器获取图像
- 创建 blob
- Converts the blob to urlData
- 最终使用 urlData 作为图像的来源
我需要从多个 WebMapServers(我公司的)使用开放层(和纯 Javascript)获取图像。 基本上它有效。问题是某些服务器需要 HTTP Basic Auth。 OL 文档和相关的 SO 问题说这应该通过 imageLoadFunction 中的 XMLHttpRequest 来完成:
https://openlayers.org/en/latest/apidoc/module-ol_Image.html
起初我想使用 XMLHttpRequest 获取图片,但不使用 Basic Auth:
var map = new ol.Map({
target: 'map',
layers: [
new ol.layer.Image({
source: new ol.source.ImageWMS({
ratio: 1,
params: { LAYERS: 'ENC', CSBOOL: '2083', CSVALUE: ',,,,,3'},
url: 'https://wms-without-basic-auth.com/?',
imageLoadFunction: function(image, src) {
image.getImage().src = src;
/*
var client = new XMLHttpRequest();
client.open('GET', src, true);
client.setRequestHeader( 'Content-Type', 'image/png' );
client.setRequestHeader( 'Accept', 'image/png' );
client.onload(function() {
image.getImage().src = src;
});
client.send();
*/
},
})
})
],
view: new ol.View({
center: ol.proj.fromLonLat([6,54]),
zoom: 6
})
});
imageLoadFunction 仅适用于行
image.getImage().src = src;
但不包含注释的 XMLHttpRequest。 我认为必须在 client.onload 函数中分配加载的图像,但我不确定如何执行此操作。 那么我应该如何使用 imageLoadFunction 中的 XMLHttpRequest?
来自the docs:
Providing a custom imageLoadFunction can be useful to load images with post requests or - in general - through XHR requests, where the src of the image element would be set to a data URI when the content is loaded.
也许可以试试这样:
imageLoadFunction: function(image, src) {
var client = new XMLHttpRequest();
client.open('GET', src, true);
client.setRequestHeader( 'Content-Type', 'image/png' );
client.setRequestHeader( 'Accept', 'image/png' );
client.responseType = 'blob';
client.onload(function() {
const blob = new Blob(client.response);
const urlData = URL.createObjectURL(blob);
image.getImage().src = urlData;
});
client.send();
},
它的作用:
- 从您的服务器获取图像
- 创建 blob
- Converts the blob to urlData
- 最终使用 urlData 作为图像的来源