@@ -29,7 +29,6 @@ import MouseWheelZoom from 'ol/interaction/MouseWheelZoom';
2929import * as olProj from 'ol/proj' ;
3030import * as olProj4 from 'ol/proj/proj4' ;
3131import * as olLayer from 'ol/layer' ;
32- import WMTSCapabilities from 'ol/format/WMTSCapabilities' ;
3332import WMSCapabilities from 'ol/format/WMSCapabilities' ;
3433import TileGrid from 'ol/tilegrid/TileGrid' ;
3534import * as olTilegrid from 'ol/tilegrid' ;
@@ -49,6 +48,7 @@ import Text from 'ol/style/Text';
4948import Collection from 'ol/Collection' ;
5049import { containsCoordinate , getCenter } from 'ol/extent' ;
5150import difference from 'lodash.difference' ;
51+ import { XMLParser } from 'fast-xml-parser' ;
5252
5353window . proj4 = proj4 ;
5454window . Proj4js = proj4 ;
@@ -70,6 +70,19 @@ const dpiConfig = {
7070 default : 96 , // 常用dpi
7171 iServerWMTS : 90.7142857142857 // iserver使用的wmts图层dpi
7272} ;
73+ // 以下路径统一转为array格式(fast-xml-parser插件在返回值数量为1时候返回obj,返回数量大于1时返回array)
74+ const WMTS_ARRAY_NODE_PATHS = [
75+ 'Capabilities.Contents.Layer' ,
76+ 'Capabilities.Contents.Layer.Format' ,
77+ 'Capabilities.Contents.Layer.Style' ,
78+ 'Capabilities.Contents.Layer.TileMatrixSetLink' ,
79+ 'Capabilities.Contents.TileMatrixSet' ,
80+ 'Capabilities.Contents.TileMatrixSet.TileMatrix' ,
81+ 'Capabilities.OperationsMetadata.Operation' ,
82+ 'Capabilities.OperationsMetadata.Operation.DCP.HTTP.Get' ,
83+ 'Capabilities.OperationsMetadata.Operation.DCP.HTTP.Get.Constraint' ,
84+ 'Capabilities.OperationsMetadata.Operation.DCP.HTTP.Get.Constraint.AllowedValues.Value'
85+ ] ;
7386/**
7487 * @class WebMap
7588 * @category iPortal/Online Resources Map
@@ -667,9 +680,15 @@ export class WebMap extends Observable {
667680 * @param {Object } capabilitiesText - wmts信息
668681 */
669682 getWMTSScales ( identifier , capabilitiesText ) {
670- const format = new WMTSCapabilities ( ) ;
671- let capabilities = format . read ( capabilitiesText ) ;
672-
683+ const parser = new XMLParser ( {
684+ attributeNamePrefix : '' ,
685+ ignoreAttributes : false ,
686+ removeNSPrefix : true ,
687+ isArray : ( name , jpath ) => {
688+ return WMTS_ARRAY_NODE_PATHS . includes ( jpath ) ;
689+ }
690+ } ) ;
691+ const capabilities = parser . parse ( capabilitiesText ) . Capabilities ;
673692 let content = capabilities . Contents ;
674693 let tileMatrixSet = content . TileMatrixSet ;
675694 let scales = [ ] ;
@@ -1628,7 +1647,12 @@ export class WebMap extends Observable {
16281647 }
16291648 return this . getRequestUrl ( url , proxy ) ;
16301649 }
1631-
1650+ getBoundsFromConrner ( lower , upper ) {
1651+ const bottomLeft = lower . split ( ' ' ) ,
1652+ topRight = upper . split ( ' ' ) ;
1653+ const bounds = bottomLeft . concat ( topRight ) ;
1654+ return [ + bounds [ 0 ] , + bounds [ 1 ] , + bounds [ 2 ] , + bounds [ 3 ] ] ;
1655+ }
16321656 /**
16331657 * @private
16341658 * @function WebMap.prototype.getWmtsInfo
@@ -1648,8 +1672,15 @@ export class WebMap extends Observable {
16481672 return response . text ( ) ;
16491673 } )
16501674 . then ( function ( capabilitiesText ) {
1651- const format = new WMTSCapabilities ( ) ;
1652- let capabilities = format . read ( capabilitiesText ) ;
1675+ const parser = new XMLParser ( {
1676+ attributeNamePrefix : '' ,
1677+ ignoreAttributes : false ,
1678+ removeNSPrefix : true ,
1679+ isArray : ( name , jpath ) => {
1680+ return WMTS_ARRAY_NODE_PATHS . includes ( jpath ) ;
1681+ }
1682+ } ) ;
1683+ const capabilities = parser . parse ( capabilitiesText ) . Capabilities ;
16531684 if ( that . isValidResponse ( capabilities ) ) {
16541685 let content = capabilities . Contents ;
16551686 let tileMatrixSet = content . TileMatrixSet ,
@@ -1664,7 +1695,10 @@ export class WebMap extends Observable {
16641695 idx = n ;
16651696 layer = layers [ idx ] ;
16661697 layerFormat = layer . Format [ 0 ] ;
1667- var layerBounds = layer . WGS84BoundingBox ;
1698+ var WGS84BoundingBox = layer . WGS84BoundingBox ;
1699+ var boundingBox = layer . BoundingBox ;
1700+ let bbox = WGS84BoundingBox ? WGS84BoundingBox : boundingBox ;
1701+ var layerBounds = that . getBoundsFromConrner ( bbox . LowerCorner , bbox . UpperCorner )
16681702 // tileMatrixSetLink = layer.TileMatrixSetLink;
16691703 break ;
16701704 }
@@ -1686,15 +1720,15 @@ export class WebMap extends Observable {
16861720 matrixIds . push ( tileMatrixSet [ i ] . TileMatrix [ h ] . Identifier ) ;
16871721 }
16881722 //bug wmts出图需要加上origin,否则会出现出图不正确的情况。偏移或者瓦片出不了
1689- let origin = tileMatrixSet [ i ] . TileMatrix [ 0 ] . TopLeftCorner ;
1723+ let origin = tileMatrixSet [ i ] . TileMatrix [ 0 ] . TopLeftCorner . split ( ' ' ) . map ( Number ) ;
16901724 layerInfo . origin =
16911725 [ 'EPSG:4326' , 'EPSG:4490' ] . indexOf ( wmtsLayerEpsg ) > - 1 ? [ origin [ 1 ] , origin [ 0 ] ] : origin ;
16921726 break ;
16931727 }
16941728 }
16951729 let name = layerInfo . name ,
16961730 extent ;
1697- if ( layerBounds ) {
1731+ if ( WGS84BoundingBox ) {
16981732 if ( layerBounds [ 0 ] < - 180 ) {
16991733 layerBounds [ 0 ] = - 180 ;
17001734 }
@@ -1708,11 +1742,13 @@ export class WebMap extends Observable {
17081742 layerBounds [ 3 ] = 90 ;
17091743 }
17101744 extent = olProj . transformExtent ( layerBounds , 'EPSG:4326' , that . baseProjection ) ;
1711- } else {
1745+ } else if ( boundingBox ) {
1746+ extent = layerBounds ;
1747+ } else {
17121748 extent = olProj . get ( that . baseProjection ) . getExtent ( ) ;
1713- }
1749+ }
17141750 layerInfo . tileUrl = that . getTileUrl (
1715- capabilities . OperationsMetadata . GetTile . DCP . HTTP . Get ,
1751+ capabilities . OperationsMetadata . Operation . find ( o => o . name === ' GetTile' ) . DCP . HTTP . Get ,
17161752 layer ,
17171753 layerFormat ,
17181754 isKvp
0 commit comments