Skip to content

Commit 1c36f7d

Browse files
committed
【feature】支持设置全局自定义RequestHeader;ol webmap 出图支持自定义的tileRequestParameters;review by luox
1 parent d56b742 commit 1c36f7d

File tree

6 files changed

+331
-83
lines changed

6 files changed

+331
-83
lines changed

src/common/index.common.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,7 @@ import { ElasticSearch } from './thirdparty';
329329
import {
330330
isCORS,
331331
setCORS,
332+
setRequestHeaders,
332333
FetchRequest,
333334
ColorsPickerUtil,
334335
ArrayStatistic,
@@ -501,6 +502,7 @@ export { Format, GeoJSONFormat, JSONFormat, WKTFormat };
501502
export {
502503
isCORS,
503504
setCORS,
505+
setRequestHeaders,
504506
FetchRequest,
505507
EncryptRequest,
506508
getServiceKey,

src/common/namespace.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,7 @@ import {
337337
ElasticSearch,
338338
isCORS,
339339
setCORS,
340+
setRequestHeaders,
340341
FetchRequest,
341342
EncryptRequest,
342343
getServiceKey,
@@ -497,6 +498,7 @@ SuperMap.setCORS = setCORS;
497498
SuperMap.isCORS = isCORS;
498499
SuperMap.setRequestTimeout = setRequestTimeout;
499500
SuperMap.getRequestTimeout = getRequestTimeout;
501+
SuperMap.setRequestHeaders = setRequestHeaders;
500502
SuperMap.FetchRequest = FetchRequest;
501503
SuperMap.EncryptRequest = EncryptRequest;
502504
SuperMap.getServiceKey = getServiceKey;

src/common/util/FetchRequest.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ export var RequestJSONPPromise = {
171171

172172
var CORS;
173173
var RequestTimeout;
174+
var RequestHeadersGetter;
174175
/**
175176
* @function setCORS
176177
* @description 设置是否允许跨域请求,全局配置,优先级低于 service 下的 crossOring 参数。
@@ -279,6 +280,43 @@ export var getRequestTimeout = function () {
279280
return RequestTimeout || 45000;
280281
}
281282

283+
/**
284+
* @function setRequestHeaders
285+
* @category BaseTypes Util
286+
* @description 设置请求自定义 request headers。
287+
* @param {function} func - 请求自定义 request headers 回调函数。
288+
* @usage
289+
* ```
290+
* // 浏览器
291+
<script type="text/javascript" src="{cdn}"></script>
292+
<script>
293+
const headers = function (url) { return { token: !!url }; };
294+
{namespace}.setRequestHeaders(headers);
295+
296+
</script>
297+
298+
// ES6 Import
299+
import { setRequestHeaders } from '{npm}';
300+
301+
const headers = function (url) { return { token: !!url }; };
302+
setRequestHeaders(headers);
303+
* ```
304+
*/
305+
export var setRequestHeaders = function (headers) {
306+
return RequestHeadersGetter = headers;
307+
}
308+
309+
/**
310+
* @private
311+
* @function getRequestTimeout
312+
* @category BaseTypes Util
313+
* @description 获取请求超时的时间。
314+
* @returns {number} 请求超时时间。
315+
*/
316+
export var getRequestHeaders = function () {
317+
return RequestHeadersGetter;
318+
}
319+
282320
/**
283321
* @name FetchRequest
284322
* @namespace
@@ -501,6 +539,11 @@ export var FetchRequest = {
501539
if (!options.headers['Content-Type'] && !FormData.prototype.isPrototypeOf(params)) {
502540
options.headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
503541
}
542+
const customRequestHeadersGetter = getRequestHeaders();
543+
const customRequestHeaders = customRequestHeadersGetter && customRequestHeadersGetter(url);
544+
if (customRequestHeaders) {
545+
options.headers = Util.extend(options.headers, customRequestHeaders);
546+
}
504547
if (options.timeout) {
505548
return this._timeout(
506549
options.timeout,

src/common/util/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
isCORS,
77
setRequestTimeout,
88
getRequestTimeout,
9+
setRequestHeaders,
910
FetchRequest
1011
} from './FetchRequest';
1112

@@ -72,6 +73,7 @@ export {
7273
isCORS,
7374
setRequestTimeout,
7475
getRequestTimeout,
76+
setRequestHeaders,
7577
FetchRequest,
7678
EncryptRequest,
7779
getServiceKey,

src/openlayers/mapping/WebMap.js

Lines changed: 52 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ export class WebMap extends Observable {
130130
this.webMap = options.webMap;
131131
this.tileFormat = options.tileFormat && options.tileFormat.toLowerCase();
132132
this.restDataSingleRequestCount = options.restDataSingleRequestCount || 1000;
133+
this.tileRequestParameters = options.tileRequestParameters;
133134
this.createMap(options.mapSetting);
134135
if (this.webMap) {
135136
// webmap有可能是url地址,有可能是webmap对象
@@ -589,7 +590,8 @@ export class WebMap extends Observable {
589590
let options = {
590591
serverType,
591592
url,
592-
tileGrid: TileSuperMapRest.optionsFromMapJSON(url, result).tileGrid
593+
tileGrid: TileSuperMapRest.optionsFromMapJSON(url, result).tileGrid,
594+
tileLoadFunction: me.getCustomTileLoadFunction()
593595
};
594596
if (url && !CommonUtil.isInTheSameDomain(url) && !this.isIportalProxyServiceUrl(url)) {
595597
options.tileProxy = me.server + 'apps/viewer/getUrlResource.png?url=';
@@ -1176,6 +1178,36 @@ export class WebMap extends Observable {
11761178
break;
11771179
}
11781180
}
1181+
1182+
getCustomTileLoadFunction(transformImageUrl) {
1183+
const that = this;
1184+
if (this.tileRequestParameters) {
1185+
return function(imageTile, url) {
1186+
const src = transformImageUrl ? transformImageUrl(url) : url;
1187+
const requestParameters = that.tileRequestParameters(src);
1188+
if (requestParameters) {
1189+
FetchRequest.get(src, null, {
1190+
...requestParameters,
1191+
withoutFormatSuffix: true
1192+
})
1193+
.then(function (response) {
1194+
return response.blob();
1195+
})
1196+
.then(function (blob) {
1197+
const imageUrl = URL.createObjectURL(blob);
1198+
imageTile.getImage().src = imageUrl;
1199+
})
1200+
.catch(function (error) {
1201+
console.error('Error fetching the image:', error);
1202+
imageTile.setState('error');
1203+
});
1204+
} else {
1205+
imageTile.getImage().src = src;
1206+
}
1207+
}
1208+
}
1209+
}
1210+
11791211
/**
11801212
* @private
11811213
* @function WebMap.prototype.createDynamicTiledSource
@@ -1206,7 +1238,8 @@ export class WebMap extends Observable {
12061238
// crossOrigin: 'anonymous', //在IE11.0.9600版本,会影响通过注册服务打开的iserver地图,不出图。因为没有携带cookie会报跨域问题
12071239
// extent: this.baseLayerExtent,
12081240
// prjCoordSys: {epsgCode: isBaseLayer ? layerInfo.projection.split(':')[1] : this.baseProjection.split(':')[1]},
1209-
format: layerInfo.format
1241+
format: layerInfo.format,
1242+
tileLoadFunction: this.getCustomTileLoadFunction()
12101243
};
12111244
if (!isBaseLayer && !this.isCustomProjection(this.baseProjection)) {
12121245
options.prjCoordSys = { epsgCode: this.baseProjection.split(':')[1] };
@@ -1320,7 +1353,8 @@ export class WebMap extends Observable {
13201353
return new XYZ({
13211354
url: layerInfo.url,
13221355
wrapX: false,
1323-
crossOrigin: 'anonymous'
1356+
crossOrigin: 'anonymous',
1357+
tileLoadFunction: this.getCustomTileLoadFunction()
13241358
});
13251359
}
13261360

@@ -1339,7 +1373,8 @@ export class WebMap extends Observable {
13391373
urls,
13401374
wrapX: false,
13411375
crossOrigin: 'anonymous',
1342-
tileGrid
1376+
tileGrid,
1377+
tileLoadFunction: this.getCustomTileLoadFunction()
13431378
});
13441379
}
13451380

@@ -1361,9 +1396,7 @@ export class WebMap extends Observable {
13611396
VERSION: layerInfo.version || '1.3.0'
13621397
},
13631398
projection: layerInfo.projection || that.baseProjection,
1364-
tileLoadFunction: function (imageTile, src) {
1365-
imageTile.getImage().src = src;
1366-
}
1399+
tileLoadFunction: this.getCustomTileLoadFunction()
13671400
});
13681401
}
13691402

@@ -1756,13 +1789,12 @@ export class WebMap extends Observable {
17561789
layerInfo.origin,
17571790
layerInfo.matrixIds
17581791
),
1759-
tileLoadFunction: function (imageTile, src) {
1792+
tileLoadFunction: this.getCustomTileLoadFunction(function (src) {
17601793
if (src.indexOf('tianditu.gov.cn') >= 0) {
1761-
imageTile.getImage().src = `${src}&tk=${CommonUtil.getParameters(layerInfo.url)['tk']}`;
1762-
return;
1794+
return `${src}&tk=${CommonUtil.getParameters(layerInfo.url)['tk']}`;
17631795
}
1764-
imageTile.getImage().src = src;
1765-
}
1796+
return src;
1797+
})
17661798
});
17671799
}
17681800

@@ -2958,13 +2990,15 @@ export class WebMap extends Observable {
29582990
};
29592991
let featureType = layerInfo.featureType;
29602992
let style = await StyleUtils.toOpenLayersStyle(this.getDataVectorTileStyle(featureType), featureType);
2993+
const requestParameters = this.tileRequestParameters && this.tileRequestParameters(layerInfo.url);
29612994
return new olLayer.VectorTile({
29622995
//设置避让参数
29632996
source: new VectorTileSuperMapRest({
29642997
url: layerInfo.url,
29652998
projection: layerInfo.projection,
29662999
tileType: 'ScaleXY',
2967-
format: format
3000+
format: format,
3001+
...requestParameters
29683002
}),
29693003
style: style
29703004
});
@@ -5081,7 +5115,6 @@ export class WebMap extends Observable {
50815115
* @param {Object} layerInfo - 图层信息
50825116
*/
50835117
createMVTLayer(layerInfo) {
5084-
// let that = this;
50855118
let styles = layerInfo.styles;
50865119
const indexbounds = styles && styles.metadata && styles.metadata.indexbounds;
50875120
const visibleResolution = this.createVisibleResolution(
@@ -5094,13 +5127,15 @@ export class WebMap extends Observable {
50945127
const styleResolutions = this.getStyleResolutions(envelope);
50955128
// const origin = [envelope.left, envelope.top];
50965129
let withCredentials = this.isIportalProxyServiceUrl(styles.sprite);
5130+
const requestParameters = this.tileRequestParameters && this.tileRequestParameters(styles.sprite);
50975131
// 创建MapBoxStyle样式
50985132
let mapboxStyles = new MapboxStyles({
50995133
style: styles,
51005134
source: styles.name,
51015135
resolutions: styleResolutions,
51025136
map: this.map,
5103-
withCredentials
5137+
withCredentials,
5138+
...requestParameters
51045139
});
51055140
return new Promise((resolve) => {
51065141
mapboxStyles.on('styleloaded', function () {
@@ -5116,7 +5151,8 @@ export class WebMap extends Observable {
51165151
format: new MVT({
51175152
featureClass: olRenderFeature
51185153
}),
5119-
wrapX: false
5154+
wrapX: false,
5155+
...requestParameters
51205156
}),
51215157
style: mapboxStyles.featureStyleFuntion,
51225158
visible: layerInfo.visible,

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy