Skip to content

Commit 382d7b0

Browse files
committed
[update] 升级webmap 支持DV中生成的多坐标系地图(iptl目前生成的地图,没有携带wkt值,webmap可能打不开)
review by zhaoqin
1 parent 01b65e5 commit 382d7b0

File tree

1 file changed

+72
-4
lines changed

1 file changed

+72
-4
lines changed

src/openlayers/mapping/WebMap.js

Lines changed: 72 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
* This program are made available under the terms of the Apache License, Version 2.0
33
* which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/
44
import ol from 'openlayers';
5+
import proj4 from "proj4";
6+
window.proj4 = proj4;
7+
window.Proj4js = proj4;
58
import {
69
FetchRequest,
710
SecurityManager,
@@ -153,6 +156,17 @@ export class WebMap extends ol.Observable {
153156
return;
154157
}
155158
that.baseProjection = mapInfo.projection;
159+
160+
// 多坐标系支持
161+
if(proj4) ol.proj.setProj4(proj4);
162+
if(that.addProjctionFromWKT(mapInfo.projection)){
163+
mapInfo.projection = that.baseProjection = that.getEpsgInfoFromWKT(mapInfo.projection);
164+
}else{
165+
// 不支持的坐标系
166+
that.errorCallback && that.errorCallback({type: "Not support CS", errorMsg: `Not support CS: ${mapInfo.projection}`}, 'getMapFaild', that.map);
167+
return;
168+
}
169+
156170
that.mapParams = {
157171
title: mapInfo.title,
158172
description: mapInfo.description
@@ -207,15 +221,15 @@ export class WebMap extends ol.Observable {
207221
center = [0, 0];
208222
}
209223
//与DV一致用底图的默认范围,不用存储的范围。否则会导致地图拖不动
210-
extent = options.baseLayer.extent;
224+
this.baseLayerExtent = extent = options.baseLayer.extent;
211225
if(this.mapParams) {
212226
this.mapParams.extent = extent;
213227
this.mapParams.projection = projection;
214228
}
215229

216230
// 计算当前最大分辨率
217231
let maxResolution;
218-
if(extent && extent.length === 4){
232+
if(options.baseLayer.layerType === "TILE" && extent && extent.length === 4){
219233
let width = extent[2] - extent[0];
220234
let height = extent[3] - extent[1];
221235
let maxResolution1 = width/256;
@@ -508,12 +522,13 @@ export class WebMap extends ol.Observable {
508522
if (credential) {
509523
SecurityManager[`register${keyfix}`](keyParams, credential);
510524
}
525+
// extent: isBaseLayer ? layerInfo.extent : ol.proj.transformExtent(layerInfo.extent, layerInfo.projection, this.baseProjection),
511526
let source = new ol.source.TileSuperMapRest({
512527
transparent: true,
513528
url: layerInfo.url,
514529
wrapX: false,
515530
serverType: serverType,
516-
extent: isBaseLayer ? layerInfo.extent : ol.proj.transformExtent(layerInfo.extent, layerInfo.projection, this.baseProjection),
531+
extent: this.baseLayerExtent,
517532
prjCoordSys:{ epsgCode: isBaseLayer ? layerInfo.projection.split(':')[1] : this.baseProjection.split(':')[1] },
518533

519534
tileProxy: this.tileProxy
@@ -630,7 +645,11 @@ export class WebMap extends ol.Observable {
630645
let that = this,
631646
url = layerInfo.url.trim();
632647
if(layerInfo.layerType === "TILE"){
633-
url += ".json";
648+
// 直接使用动态投影方式请求数据
649+
let projection = {
650+
epsgCode: that.baseProjection.split(":")[1]
651+
}
652+
url += `.json?prjCoordSys=${JSON.stringify(projection)}`;
634653
}else{
635654
url += (url.indexOf('?') > -1 ? '&SERVICE=WMS&REQUEST=GetCapabilities' : '?SERVICE=WMS&REQUEST=GetCapabilities');
636655
}
@@ -2510,6 +2529,55 @@ export class WebMap extends ol.Observable {
25102529
})
25112530
});
25122531
}
2532+
2533+
/**
2534+
* 通过wkt参数扩展支持多坐标系
2535+
*
2536+
* @param {String} wkt 字符串
2537+
* @returns {Boolean} 坐标系是否添加成功
2538+
*/
2539+
addProjctionFromWKT(wkt){
2540+
if(typeof(wkt) !== 'string'){
2541+
//参数类型错误
2542+
return false;
2543+
}else{
2544+
if(wkt === "EPSG:4326" || wkt === "EPSG:3857"){
2545+
return true;
2546+
}else{
2547+
let epsgCode = this.getEpsgInfoFromWKT(wkt);
2548+
if(epsgCode){
2549+
proj4.defs(epsgCode, wkt);
2550+
return true;
2551+
}else{
2552+
// 参数类型非wkt标准
2553+
return false;
2554+
}
2555+
}
2556+
}
2557+
}
2558+
2559+
/**
2560+
* 通过wkt参数获取坐标信息
2561+
*
2562+
* @param {String} wkt 字符串
2563+
* @returns {String} epsg 如:"EPSG:4326"
2564+
*/
2565+
getEpsgInfoFromWKT(wkt){
2566+
if(typeof(wkt) !== 'string'){
2567+
return false;
2568+
}else if(wkt.indexOf("EPSG") === 0){
2569+
return wkt;
2570+
}else{
2571+
let lastAuthority = wkt.lastIndexOf("AUTHORITY") + 10,
2572+
endString = wkt.indexOf("]",lastAuthority)-1;
2573+
if(lastAuthority >0 && endString >0){
2574+
return `EPSG:${wkt.substring(lastAuthority, endString).split(",")[1].substr(1)}`;
2575+
}else{
2576+
return false;
2577+
}
2578+
}
2579+
}
2580+
25132581
}
25142582

25152583
ol.supermap.WebMap = WebMap;

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