Skip to content

Commit 540128e

Browse files
committed
[bug] 修复 ol webmap 叠加图层中含有与底图坐标不同且不支持动态投影的图层,报错。
review by zhaoq
1 parent c9f9c01 commit 540128e

File tree

1 file changed

+69
-46
lines changed

1 file changed

+69
-46
lines changed

src/openlayers/mapping/WebMap.js

Lines changed: 69 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ export class WebMap extends Observable {
308308
that.mapParams = {
309309
title: mapInfo.title,
310310
description: mapInfo.description
311-
};
311+
};
312312

313313
if (handleResult.action === "BrowseMap") {
314314
that.createSpecLayer(mapInfo);
@@ -351,7 +351,7 @@ export class WebMap extends Observable {
351351
* @private
352352
* @param {string} crs 必传参数,值是webmap2中定义的坐标系,可能是 1、EGSG:xxx 2、WKT string
353353
* @param {string} baseLayerUrl 可选参数,地图的服务地址;用于EPSG:-1 的时候,用于请求iServer提供的wkt
354-
* @return {Object}
354+
* @return {Object}
355355
*/
356356
async handleCRS(crs, baseLayerUrl) {
357357
let that = this, handleResult = {};
@@ -1160,7 +1160,7 @@ export class WebMap extends Observable {
11601160
* @private
11611161
* @function ol.supermap.WebMap.prototype.createXYZSource
11621162
* @description 创建图层的XYZsource。
1163-
* @param {Object} layerInfo - 图层信息。。
1163+
* @param {Object} layerInfo - 图层信息
11641164
* @returns {ol/source/XYZ} xyz的source
11651165
*/
11661166
createXYZSource(layerInfo) {
@@ -1196,52 +1196,71 @@ export class WebMap extends Observable {
11961196

11971197
/**
11981198
* @private
1199-
* @function ol.supermap.WebMap.prototype.getLayerExtent
1200-
* @description 获取(Supermap Rest/WMS)的图层参数。
1199+
* @function ol.supermap.WebMap.prototype.getTileLayerExtent
1200+
* @description 获取(Supermap RestMap)的图层参数。
12011201
* @param {Object} layerInfo - 图层信息。
1202-
* @param {function} callback - 获得wmts图层参数执行的回调函数
1202+
* @param {function} callback - 获得tile图层参数执行的回调函数
12031203
*/
1204-
getLayerExtent(layerInfo, callback) {
1204+
async getTileLayerExtent(layerInfo, callback) {
1205+
let that = this;
1206+
// 默认使用动态投影方式请求数据
1207+
let dynamicLayerInfo = await that.getTileLayerExtentInfo(layerInfo)
1208+
if (dynamicLayerInfo) {
1209+
Object.assign(layerInfo, dynamicLayerInfo);
1210+
callback(layerInfo);
1211+
} else {
1212+
// 不支持动态投影,请求restmap原始信息
1213+
let originLayerInfo = await that.getTileLayerExtentInfo(layerInfo, false);
1214+
Object.assign(layerInfo, originLayerInfo);
1215+
callback(layerInfo);
1216+
}
1217+
}
1218+
1219+
/**
1220+
* @private
1221+
* @function ol.supermap.WebMap.prototype.getTileLayerExtentInfo
1222+
* @description 获取rest map的图层参数。
1223+
* @param {String} url - 图层url。
1224+
* @param {Boolean} isDynamic - 是否请求动态投影信息
1225+
*/
1226+
getTileLayerExtentInfo(layerInfo, isDynamic = true) {
12051227
let that = this,
1206-
url = layerInfo.url.trim();
1207-
if (layerInfo.layerType === "TILE") {
1208-
// 直接使用动态投影方式请求数据
1228+
token,
1229+
url = layerInfo.url.trim(),
1230+
credential = layerInfo.credential,
1231+
options = {
1232+
withCredentials: this.withCredentials,
1233+
withoutFormatSuffix: true
1234+
};
1235+
if (isDynamic) {
12091236
let projection = {
12101237
epsgCode: that.baseProjection.split(":")[1]
12111238
}
1212-
if(that.baseProjection !== "EPSG:-1") {
1239+
if (that.baseProjection !== "EPSG:-1") {
12131240
// bug IE11 不会自动编码
12141241
url += '.json?prjCoordSys=' + encodeURI(JSON.stringify(projection));
1215-
}
1216-
if (layerInfo.credential) {
1217-
url = `${url}&token=${encodeURI(layerInfo.credential.token)}`;
12181242
}
1219-
} else {
1220-
url += (url.indexOf('?') > -1 ? '&SERVICE=WMS&REQUEST=GetCapabilities' : '?SERVICE=WMS&REQUEST=GetCapabilities');
12211243
}
1222-
let options = {
1223-
withCredentials: this.withCredentials,
1224-
withoutFormatSuffix: true
1225-
};
1226-
FetchRequest.get(that.getRequestUrl(`${url}.json`), null, options).then(function (response) {
1227-
return layerInfo.layerType === "TILE" ? response.json() : response.text();
1228-
}).then(async function (result) {
1229-
if (layerInfo.layerType === "TILE") {
1230-
layerInfo.units = result.coordUnit && result.coordUnit.toLowerCase();
1231-
layerInfo.coordUnit = result.coordUnit;
1232-
layerInfo.visibleScales = result.visibleScales;
1233-
layerInfo.extent = [result.bounds.left, result.bounds.bottom, result.bounds.right, result.bounds.top];
1234-
layerInfo.projection = `EPSG:${result.prjCoordSys.epsgCode}`;
1235-
let token = layerInfo.credential ? layerInfo.credential.token : undefined;
1236-
let isSupprtWebp = await that.isSupportWebp(layerInfo.url, token);
1237-
// eslint-disable-next-line require-atomic-updates
1238-
layerInfo.format = isSupprtWebp ? 'webp' : 'png';
1239-
callback(layerInfo);
1240-
} else {
1241-
layerInfo.projection = that.baseProjection;
1242-
callback(layerInfo);
1244+
if (credential) {
1245+
url = `${url}&token=${encodeURI(credential.token)}`;
1246+
token = credential.token;
1247+
}
1248+
return FetchRequest.get(that.getRequestUrl(`${url}.json`), null, options).then(function (response) {
1249+
return response.json();
1250+
}).then(async (result) => {
1251+
if (result.succeed === false) {
1252+
return null
1253+
};
1254+
let isSupportWebp = await that.isSupportWebp(layerInfo.url, token);
1255+
return {
1256+
units: result.coordUnit && result.coordUnit.toLowerCase(),
1257+
coordUnit: result.coordUnit,
1258+
visibleScales: result.visibleScales,
1259+
extent: [result.bounds.left, result.bounds.bottom, result.bounds.right, result.bounds.top],
1260+
projection: `EPSG:${result.prjCoordSys.epsgCode}`,
1261+
format: isSupportWebp ? 'webp' : 'png'
12431262
}
1244-
}).catch((error) =>{
1263+
}).catch((error) => {
12451264
throw error;
12461265
});
12471266
}
@@ -1663,8 +1682,13 @@ export class WebMap extends Observable {
16631682
}
16641683
} else if (dataSource && dataSource.type === "USER_DATA") {
16651684
that.addGeojsonFromUrl(layer, len, layerIndex, false);
1666-
} else if (layer.layerType === 'SUPERMAP_REST' ||
1667-
layer.layerType === "TILE" ||
1685+
} else if (layer.layerType === "TILE"){
1686+
that.getTileLayerExtent(layer, function (layerInfo) {
1687+
that.map.addLayer(that.createBaseLayer(layerInfo, layerIndex));
1688+
that.layerAdded++;
1689+
that.sendMapToUser(len);
1690+
})
1691+
}else if (layer.layerType === 'SUPERMAP_REST' ||
16681692
layer.layerType === "WMS" ||
16691693
layer.layerType === "WMTS") {
16701694
if (layer.layerType === "WMTS") {
@@ -1674,11 +1698,10 @@ export class WebMap extends Observable {
16741698
that.sendMapToUser(len);
16751699
})
16761700
} else {
1677-
that.getLayerExtent(layer, function (layerInfo) {
1678-
that.map.addLayer(that.createBaseLayer(layerInfo, layerIndex));
1679-
that.layerAdded++;
1680-
that.sendMapToUser(len);
1681-
});
1701+
layer.projection = that.baseProjection;
1702+
that.map.addLayer(that.createBaseLayer(layer, layerIndex));
1703+
that.layerAdded++;
1704+
that.sendMapToUser(len);
16821705
}
16831706
} else if (dataSource && dataSource.type === "REST_DATA") {
16841707
//从restData获取数据
@@ -3749,7 +3772,7 @@ export class WebMap extends Observable {
37493772
*
37503773
* @param {String} wkt 字符串
37513774
* @param {string} crsCode epsg信息,如: "EPSG:4490"
3752-
*
3775+
*
37533776
* @returns {Boolean} 坐标系是否添加成功
37543777
*/
37553778
addProjctionFromWKT(wkt, crsCode) {

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