@@ -29,6 +29,7 @@ import MVT from 'ol/format/MVT';
2929import Observable from 'ol/Observable' ;
3030import olMap from 'ol/Map' ;
3131import View from 'ol/View' ;
32+ import MouseWheelZoom from 'ol/interaction/MouseWheelZoom' ;
3233import * as olProj from 'ol/proj' ;
3334import * as olProj4 from 'ol/proj/proj4' ;
3435import Units from 'ol/proj/Units' ;
@@ -673,7 +674,83 @@ export class WebMap extends Observable {
673674 // 挂载带baseLayer上,便于删除
674675 baseLayer . labelLayer = labelLayer ;
675676 }
676- }
677+ this . limitScale ( mapInfo , baseLayer ) ;
678+ }
679+
680+ validScale ( scale ) {
681+ if ( ! scale ) {
682+ return false ;
683+ }
684+ const scaleNum = scale . split ( ':' ) [ 1 ] ;
685+ if ( ! scaleNum ) {
686+ return false ;
687+ }
688+ const res = 1 / + scaleNum ;
689+ if ( res === Infinity || res >= 1 ) {
690+ return false ;
691+ }
692+ return true ;
693+ }
694+
695+ limitScale ( mapInfo , baseLayer ) {
696+ if ( this . validScale ( mapInfo . minScale ) && this . validScale ( mapInfo . maxScale ) ) {
697+ let visibleScales , minScale , maxScale ;
698+ if ( baseLayer . layerType === 'WMTS' ) {
699+ visibleScales = baseLayer . scales ;
700+ minScale = mapInfo . minScale . split ( ':' ) [ 1 ] ;
701+ maxScale = mapInfo . maxScale . split ( ':' ) [ 1 ] ;
702+ } else {
703+ const scales = this . scales . map ( ( scale ) => {
704+ return 1 / scale . split ( ':' ) [ 1 ] ;
705+ } ) ;
706+ visibleScales = baseLayer . visibleScales || scales ;
707+ minScale = 1 / mapInfo . minScale . split ( ':' ) [ 1 ] ;
708+ maxScale = 1 / mapInfo . maxScale . split ( ':' ) [ 1 ] ;
709+ }
710+
711+ const minVisibleScale = this . findNearest ( visibleScales , minScale ) ;
712+ const maxVisibleScale = this . findNearest ( visibleScales , maxScale ) ;
713+ const minZoom = visibleScales . indexOf ( minVisibleScale ) ;
714+ const maxZoom = visibleScales . indexOf ( maxVisibleScale ) ;
715+ if ( minZoom !== 0 && maxZoom !== visibleScales . length - 1 ) {
716+ this . map . setView (
717+ new View (
718+ Object . assign ( { } , this . map . getView ( ) . options_ , {
719+ maxResolution : undefined ,
720+ minResolution : undefined ,
721+ minZoom,
722+ maxZoom,
723+ constrainResolution : false
724+ } )
725+ )
726+ ) ;
727+ this . map . addInteraction (
728+ new MouseWheelZoom ( {
729+ constrainResolution : true
730+ } )
731+ ) ;
732+ }
733+ }
734+ }
735+
736+ parseNumber ( scaleStr ) {
737+ return Number ( scaleStr . split ( ":" ) [ 1 ] )
738+ }
739+
740+ findNearest ( scales , target ) {
741+ let resultIndex = 0
742+ let targetScaleD = target ;
743+ for ( let i = 1 , len = scales . length ; i < len ; i ++ ) {
744+ if (
745+ Math . abs ( scales [ i ] - targetScaleD ) <
746+ Math . abs ( scales [ resultIndex ] - targetScaleD )
747+ ) {
748+ resultIndex = i
749+ }
750+ }
751+ return scales [ resultIndex ]
752+ }
753+
677754 /**
678755 * @private
679756 * @function ol.supermap.WebMap.prototype.addMVTMapLayer
@@ -752,6 +829,7 @@ export class WebMap extends Observable {
752829 // if(options.baseLayer.visibleScales && options.baseLayer.visibleScales.length > 0){
753830 // maxZoom = options.baseLayer.visibleScales.length;
754831 // }
832+ this . map . setView ( new View ( { zoom, center, projection, maxZoom } ) ) ;
755833 let viewOptions = { } ;
756834
757835 if ( baseLayer . scales && baseLayer . scales . length > 0 && baseLayer . layerType === "WMTS" ||
0 commit comments