@@ -6,61 +6,87 @@ import { Unit } from '@supermap/iclient-common/REST';
66import { Util as CommonUtil } from '@supermap/iclient-common/commontypes/Util' ;
77import { ServerGeometry } from '@supermap/iclient-common/iServer/ServerGeometry' ;
88import { Util } from '../core/Util' ;
9- import TileImage from 'ol/source/TileImage' ;
9+ import ImageSource , { defaultImageLoadFunction } from 'ol/source/Image' ;
10+ import ImageWrapper from 'ol/Image' ;
1011import Geometry from 'ol/geom/Geometry' ;
1112import GeoJSON from 'ol/format/GeoJSON' ;
12- import * as olSize from 'ol/size' ;
13- import * as olTilegrid from 'ol/tilegrid' ;
14- import TileGrid from 'ol/tilegrid/TileGrid' ;
13+ import { containsExtent , getCenter , getHeight , getWidth , getForViewAndSize } from 'ol/extent' ;
1514
1615/**
1716 * @class ol.source.ImageSuperMapRest
1817 * @category iServer Map Tile
1918 * @classdesc SuperMap iServer Image 图层源。
2019 * @param {Object } options - 参数。
21- * @param {string } options.url - 服务地址 ,例如: http://{ip}:{port}/iserver/services/map-world/rest/maps/World。
22- * @param {ol.tilegrid.TileGrid } [options.tileGrid ] - 瓦片网格对象 。
20+ * @param {string } options.url - 地图服务地址 ,例如: http://{ip}:{port}/iserver/services/map-world/rest/maps/World。
21+ * @param {SuperMap.ServerType } [options.serverType=SuperMap.ServerType.ISERVER ] - 服务类型 ISERVER|IPORTAL|ONLINE 。
2322 * @param {boolean } [options.redirect=false] - 是否重定向。
2423 * @param {boolean } [options.transparent=true] - 瓦片是否透明。
24+ * @param {boolean } [options.antialias=false] - 是否反走样地图。
2525 * @param {boolean } [options.cacheEnabled=true] - 是否使用服务端的缓存,true 表示使用服务端的缓存。
2626 * @param {Object } [options.prjCoordSys] - 请求的地图的坐标参考系统。当此参数设置的坐标系统不同于地图的原有坐标系统时, 系统会进行动态投影,并返回动态投影后的地图瓦片。例如:{"epsgCode":3857}。
2727 * @param {string } [options.layersID] - 获取进行切片的地图图层 ID,即指定进行地图切片的图层,可以是临时图层集,也可以是当前地图中图层的组合。
2828 * @param {boolean } [options.clipRegionEnabled = false] - 是否地图只显示该区域覆盖的部分。true 表示地图只显示该区域覆盖的部分。
29- * @param {ol. geom. Geometry } [options.clipRegion] - 地图显示裁剪的区域。是一个面对象,当 clipRegionEnabled = true 时有效,即地图只显示该区域覆盖的部分。
29+ * @param {(ol/ geom/ Geometry|ol/geom/Geometry) } [options.clipRegion] - 地图显示裁剪的区域。是一个面对象,当 clipRegionEnabled = true 时有效,即地图只显示该区域覆盖的部分。
3030 * @param {boolean } [options.overlapDisplayed=false] - 地图对象在同一范围内时,是否重叠显示。如果为 true,则同一范围内的对象会直接压盖;如果为 false 则通过 overlapDisplayedOptions 控制对象不压盖显示。
31- * @param {OverlapDisplayedOptions } [options.overlapDisplayedOptions] - 避免地图对象压盖显示的过滤选项,当 overlapDisplayed 为 false 时有效,用来增强对地图对象压盖时的处理。
31+ * @param {SuperMap.OverlapDisplayedOptions } [options.overlapDisplayedOptions] - 避免地图对象压盖显示的过滤选项,当 overlapDisplayed 为 false 时有效,用来增强对地图对象压盖时的处理。
32+ * @param {boolean } [options.markerAngleFixed=false] - 指定点状符号的角度是否固定。
33+ * @param {boolean } [options.textAngleFixed=false] - 文本角度是否固定。
34+ * @param {boolean } [options.textOrientationFixed=false] - 文本朝向是否固定。
35+ * @param {boolean } [options.paintBackground=false] - 是否绘制地图背景。
36+ * @param {boolean } [options.maxVisibleTextSize] - 文本的最大可见尺寸,单位为像素。
37+ * @param {boolean } [options.maxVisibleVertex] - 最大几何对象可见节点数。 如果几何对象的节点数超过指定的个数,则超过的那部分节点不显示。
38+ * @param {boolean } [options.minVisibleTextSize] - 文本的最小可见尺寸,单位为像素。
3239 * @param {string } [options.tileversion] - 切片版本名称,_cache 为 true 时有效。
33- * @param {string } [options.tileProxy] - 服务代理地址 。
34- * @param {(NDVIParameter|HillshadeParameter) } [options.rasterfunction] - 栅格分析参数。
40+ * @param {string } [options.tileProxy] - 代理地址 。
41+ * @param {(SuperMap. NDVIParameter|SuperMap. HillshadeParameter) } [options.rasterfunction] - 栅格分析参数。
3542 * @param {string } [options.format = 'png'] - 瓦片表述类型,支持 "png" 、"webp"、"bmp" 、"jpg"、 "gif" 等图片类型。
43+ * @param {Function } [options.imageLoadFunction] - 加载图片的方法。默认为function(imageTile, src) {imageTile.getImage().src = src;};
44+ * @param {string } [options.ratio=1.5] - 请求图片大小比例. 1 表示请求图片大小和地图视窗范围一致, 2 表示请求图片大小是地图视窗范围的2倍,以此类推。
3645 * @extends {ol.source.TileImage }
3746 */
38- export class ImageSuperMapRest extends TileImage {
47+ export class ImageSuperMapRest extends ImageSource {
3948 constructor ( options ) {
40- options . attributions =
41- options . attributions || "Map Data <span>© <a href='http://support.supermap.com.cn/product/iServer.aspx' target='_blank'>SuperMap iServer</a></span> with <a href='https://iclient.supermap.io/'>© SuperMap iClient</a>"
49+ super ( {
50+ attributions : options . attributions ,
51+ imageSmoothing : options . imageSmoothing ,
52+ projection : options . projection ,
53+ resolutions : options . resolutions
54+ } ) ;
55+ if ( options . url === undefined ) {
56+ return ;
57+ }
58+ this . imageLoadFunction_ =
59+ options . imageLoadFunction !== undefined ? options . imageLoadFunction : defaultImageLoadFunction ;
60+ this . _image = null ;
61+ this . renderedRevision_ = 0 ;
62+ this . _crossOrigin = options . crossOrigin !== undefined ? options . crossOrigin : null ;
63+ this . _url = options . url ;
64+ this . ratio_ = options . ratio !== undefined ? options . ratio : 1.5 ;
4265
43- options . format = options . format ? options . format : 'png'
44- var layerUrl = CommonUtil . urlPathAppend ( options . url , "image." + options . format ) ;
66+ options . attributions =
67+ options . attributions ||
68+ "Map Data <span>© <a href='http://support.supermap.com.cn/product/iServer.aspx' target='_blank'>SuperMap iServer</a></span> with <a href='https://iclient.supermap.io/'>© SuperMap iClient</a>" ;
4569
70+ options . format = options . format ? options . format : 'png' ;
71+ this . _layerUrl = CommonUtil . urlPathAppend ( options . url , 'image.' + options . format ) ;
4672 //为url添加安全认证信息片段
47- layerUrl = SecurityManager . appendCredential ( layerUrl ) ;
73+ this . _layerUrl = SecurityManager . appendCredential ( this . _layerUrl ) ;
4874
4975 const params = { } ;
5076 //切片是否透明
51- var transparent = options . transparent !== undefined ? options . transparent : true ;
77+ const transparent = options . transparent !== undefined ? options . transparent : true ;
5278 params [ 'transparent' ] = transparent ;
5379
5480 //是否使用缓存吗,默认为true
55- var cacheEnabled = options . cacheEnabled !== undefined ? options . cacheEnabled : true ;
81+ const cacheEnabled = options . cacheEnabled !== undefined ? options . cacheEnabled : true ;
5682 params [ 'cacheEnabled' ] = cacheEnabled ;
5783
5884 //如果有layersID,则是在使用专题图
5985 if ( options . layersID !== undefined ) {
6086 params [ 'layersID' ] = options . layersID ;
6187 }
6288 //是否重定向,默认为false
63- var redirect = false ;
89+ let redirect = false ;
6490 if ( options . redirect !== undefined ) {
6591 redirect = options . redirect ;
6692 }
@@ -86,117 +112,107 @@ export class ImageSuperMapRest extends TileImage {
86112 if ( options . rasterfunction ) {
87113 params [ 'rasterfunction' ] = JSON . stringify ( options . rasterfunction ) ;
88114 }
89- layerUrl = CommonUtil . urlAppend ( encodeURI ( layerUrl ) , CommonUtil . getParameterString ( params ) ) ;
90- super ( {
91- attributions : options . attributions ,
92- cacheSize : options . cacheSize ,
93- crossOrigin : options . crossOrigin ,
94- logo : Util . getOlVersion ( ) === '4' ? options . logo : null ,
95- opaque : options . opaque ,
96- projection : options . projection ,
97- reprojectionErrorThreshold : options . reprojectionErrorThreshold ,
98- state : options . state ,
99- tileClass : options . tileClass ,
100- tileGrid : options . tileGrid ,
101- tileLoadFunction : options . tileLoadFunction ,
102- tilePixelRatio : options . tilePixelRatio ,
103- tileUrlFunction : tileUrlFunction ,
104- wrapX : options . wrapX !== undefined ? options . wrapX : false ,
105- cacheEnabled : options . cacheEnabled ,
106- layersID : options . layersID
107- } ) ;
115+ //是否反走样地图,默认为false
116+ if ( options . antialias !== undefined ) {
117+ params [ 'antialias' ] = options . antialias ;
118+ }
119+ if ( options . markerAngleFixed !== undefined ) {
120+ params [ 'markerAngleFixed' ] = options . markerAngleFixed ;
121+ }
122+ if ( options . textAngleFixed !== undefined ) {
123+ params [ 'textAngleFixed' ] = options . textAngleFixed ;
124+ }
125+ if ( options . textOrientationFixed !== undefined ) {
126+ params [ 'textOrientationFixed' ] = options . textOrientationFixed ;
127+ }
128+ if ( options . paintBackground !== undefined ) {
129+ params [ 'paintBackground' ] = options . paintBackground ;
130+ }
131+ if ( ! isNaN ( options . maxVisibleTextSize ) ) {
132+ params [ 'maxVisibleTextSize' ] = + options . maxVisibleTextSize ;
133+ }
134+ if ( ! isNaN ( options . minVisibleTextSize ) ) {
135+ params [ 'maxVisibleTextSize' ] = + options . minVisibleTextSize ;
136+ }
137+ if ( ! isNaN ( options . maxVisibleVertex ) ) {
138+ params [ 'maxVisibleVertex' ] = Math . round ( + options . maxVisibleVertex ) ;
139+ }
140+
141+ this . _layerUrl = CommonUtil . urlAppend ( encodeURI ( this . _layerUrl ) , CommonUtil . getParameterString ( params ) ) ;
108142
109143 //存储一个cacheEnabled
110144 this . cacheEnabled = cacheEnabled ;
111145
112146 if ( options . tileProxy ) {
113147 this . tileProxy = options . tileProxy ;
114148 }
115- var me = this ;
116-
117- /**
118- * @function ol.source.ImageSuperMapRest.prototype.tileUrlFunction
119- * @param {Object } tileCoord - 瓦片坐标系。
120- * @param {Object } pixelRatio - 像素密度。
121- * @param {string } projection - 投影参考系。
122- * @description 瓦片地址参数。
123- * @returns {string } 返回瓦片地址参数
124- */
125- function tileUrlFunction ( tileCoord , pixelRatio , projection ) {
126- if ( ! this . tileGrid ) {
127- this . tileGrid = this . getTileGridForProjection && this . getTileGridForProjection ( projection ) ;
128- }
129- if ( ! this . tileGrid ) {
130- if ( options . extent ) {
131- this . tileGrid = ImageSuperMapRest . createTileGrid ( options . extent ) ;
132- if ( this . resolutions ) {
133- this . tileGrid . resolutions = me . resolutions ;
134- }
135- } else {
136- if ( projection . getCode ( ) === 'EPSG:3857' ) {
137- this . tileGrid = ImageSuperMapRest . createTileGrid ( [
138- - 20037508.3427892 ,
139- - 20037508.3427892 ,
140- 20037508.3427892 ,
141- 20037508.3427892
142- ] ) ;
143- this . extent = [ - 20037508.3427892 , - 20037508.3427892 , 20037508.3427892 , 20037508.3427892 ] ;
144- }
145- if ( projection . getCode ( ) === 'EPSG:4326' ) {
146- this . tileGrid = ImageSuperMapRest . createTileGrid ( [ - 180 , - 90 , 180 , 90 ] ) ;
147- this . extent = [ - 180 , - 90 , 180 , 90 ] ;
148- }
149- }
150- }
151- var tileExtent = this . tileGrid . getTileCoordExtent ( tileCoord , this . tmpExtent_ ) ;
152- var tileSize = olSize . toSize ( this . tileGrid . getTileSize ( tileCoord [ 0 ] ) , this . tmpSize ) ;
153- var url =
154- layerUrl +
155- encodeURI (
156- '&width=' +
157- tileSize [ 0 ] +
158- '&height=' +
159- tileSize [ 1 ] +
160- '&viewBounds=' +
161- '{"leftBottom" : {"x":' +
162- tileExtent [ 0 ] +
163- ',"y":' +
164- tileExtent [ 1 ] +
165- '},"rightTop" : {"x":' +
166- tileExtent [ 2 ] +
167- ',"y":' +
168- tileExtent [ 3 ] +
169- '}}'
170- ) ;
171-
172- //支持代理
173- if ( me . tileProxy ) {
174- url = me . tileProxy + encodeURIComponent ( url ) ;
175- }
176- //不启用缓存时启用时间戳
177- if ( ! me . cacheEnabled ) {
178- url += '&_t=' + new Date ( ) . getTime ( ) ;
179- }
180-
181- return url ;
149+ }
150+ getImageInternal ( extent , resolution , pixelRatio ) {
151+ resolution = this . findNearestResolution ( resolution ) ;
152+ const imageResolution = resolution / pixelRatio ;
153+ const center = getCenter ( extent ) ;
154+ const viewWidth = Math . ceil ( getWidth ( extent ) / imageResolution ) ;
155+ const viewHeight = Math . ceil ( getHeight ( extent ) / imageResolution ) ;
156+ const viewExtent = getForViewAndSize ( center , imageResolution , 0 , [ viewWidth , viewHeight ] ) ;
157+ const requestWidth = Math . ceil ( ( this . ratio_ * getWidth ( extent ) ) / imageResolution ) ;
158+ const requestHeight = Math . ceil ( ( this . ratio_ * getHeight ( extent ) ) / imageResolution ) ;
159+ const requestExtent = getForViewAndSize ( center , imageResolution , 0 , [ requestWidth , requestHeight ] ) ;
160+ const image = this . _image ;
161+ if (
162+ image &&
163+ this . renderedRevision_ === this . getRevision ( ) &&
164+ image . getResolution ( ) === resolution &&
165+ image . getPixelRatio ( ) === pixelRatio &&
166+ containsExtent ( image . getExtent ( ) , viewExtent )
167+ ) {
168+ return image ;
182169 }
170+ const imageSize = [
171+ Math . round ( getWidth ( requestExtent ) / imageResolution ) ,
172+ Math . round ( getHeight ( requestExtent ) / imageResolution )
173+ ] ;
174+ const imageUrl = this . _getRequestUrl ( requestExtent , imageSize ) ;
175+ this . _image = new ImageWrapper (
176+ requestExtent ,
177+ resolution ,
178+ pixelRatio ,
179+ imageUrl ,
180+ this . _crossOrigin ,
181+ this . imageLoadFunction_
182+ ) ;
183+ this . renderedRevision_ = this . getRevision ( ) ;
184+ this . _image . addEventListener ( 'change' , this . handleImageChange . bind ( this ) ) ;
185+ return this . _image ;
186+ }
187+ _getRequestUrl ( extent , imageSize ) {
188+ const params = {
189+ width : imageSize [ 0 ] ,
190+ height : imageSize [ 1 ] ,
191+ viewBounds : { leftBottom : { x : extent [ 0 ] , y : extent [ 1 ] } , rightTop : { x : extent [ 2 ] , y : extent [ 3 ] } }
192+ } ;
193+ //不启用缓存时启用时间戳
194+ if ( ! this . cacheEnabled ) {
195+ params [ '_t' ] = new Date ( ) . getTime ( ) ;
196+ }
197+ let imageUrl = CommonUtil . urlAppend ( this . _layerUrl , CommonUtil . getParameterString ( params ) ) ;
198+ //支持代理
199+ if ( this . tileProxy ) {
200+ imageUrl = this . tileProxy + encodeURIComponent ( imageUrl ) ;
201+ }
202+ return imageUrl ;
183203 }
184-
185204 /**
186205 * @function ol.source.ImageSuperMapRest.optionsFromMapJSON
187- * @param {string } url - 服务地址 。
206+ * @param {string } url - 地址 。
188207 * @param {Object } mapJSONObj - 地图 JSON。
189208 * @description 获取地图 JSON 信息。
190209 */
191210 static optionsFromMapJSON ( url , mapJSONObj ) {
192- var options = { } ;
193- options . url = url ;
194- options . crossOrigin = 'anonymous' ;
195211 var extent = [ mapJSONObj . bounds . left , mapJSONObj . bounds . bottom , mapJSONObj . bounds . right , mapJSONObj . bounds . top ] ;
196212 var resolutions = getResolutions ( ) ;
197213
198214 function getResolutions ( ) {
199- var level = 17 ;
215+ var level = 28 ;
200216 var dpi = 96 ;
201217 var width = extent [ 2 ] - extent [ 0 ] ;
202218 var height = extent [ 3 ] - extent [ 1 ] ;
@@ -228,37 +244,6 @@ export class ImageSuperMapRest extends TileImage {
228244
229245 return resolutions . sort ( sortNumber ) ;
230246 }
231-
232- options . tileGrid = new TileGrid ( {
233- extent : extent ,
234- resolutions : resolutions
235- } ) ;
236- return options ;
237- }
238-
239- /**
240- * @function ol.source.ImageSuperMapRest.createTileGrid
241- * @param {number } extent - 长度。
242- * @param {number } maxZoom - 最大的放大级别。
243- * @param {number } minZoom - 最小的放大级别。
244- * @param {number } tileSize - 瓦片的尺寸。
245- * @param {number } origin - 原点。
246- * @description 创建网格切片。
247- * @returns {ol.tilegrid.TileGrid } 创建的网格切片
248- */
249- static createTileGrid ( extent , maxZoom , minZoom , tileSize , origin ) {
250- var tilegrid = olTilegrid . createXYZ ( {
251- extent : extent ,
252- maxZoom : maxZoom ,
253- minZoom : minZoom ,
254- tileSize : tileSize
255- } ) ;
256- return new TileGrid ( {
257- extent : extent ,
258- minZoom : minZoom ,
259- origin : origin ,
260- resolutions : tilegrid . getResolutions ( ) ,
261- tileSize : tilegrid . getTileSize ( )
262- } ) ;
247+ return { url, resolutions } ;
263248 }
264249}
0 commit comments