diff --git a/examples/js/include-web.js b/examples/js/include-web.js index 7f87e748f..8a8b8ce42 100644 --- a/examples/js/include-web.js +++ b/examples/js/include-web.js @@ -236,6 +236,6 @@ }); window.isLocal = false; window.server = document.location.toString().match(/file:\/\//) ? "http://localhost:8090" : document.location.protocol + "//" + document.location.host; - window.version = "12.0.0-r"; + window.version = "12.0.1"; window.preRelease = ""; })(); diff --git a/package.json b/package.json index ba2f973c8..16761009a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "SuperMapiClient", "description": "SuperMap iClient JavaScript 是一套由 JavaScript 语言编写的 GIS 客户端应用开发包, 支持多源数据地图,支持多终端,跨浏览器, 通过本产品可快速实现浏览器上美观、流畅的地图呈现。", - "version": "12.0.0-r", + "version": "12.0.1-dev", "directories": { "doc": "doc", "example": "examples", diff --git a/src/classic/package.json b/src/classic/package.json index 73b01b024..c09e11b5a 100644 --- a/src/classic/package.json +++ b/src/classic/package.json @@ -1,7 +1,7 @@ { "name": "@supermapgis/iclient-classic", "description": "", - "version": "12.0.0-r", + "version": "12.0.1-dev", "keywords": [ "SuperMap" ], @@ -15,6 +15,6 @@ "license": "Apache-2.0", "dependencies": { "mapv": "2.0.62", - "@supermapgis/iclient-common": "12.0.0-r" + "@supermapgis/iclient-common": "12.0.1-dev" } } diff --git a/src/common/mapping/WebMapService.js b/src/common/mapping/WebMapService.js index ed10a9524..229ca1f60 100644 --- a/src/common/mapping/WebMapService.js +++ b/src/common/mapping/WebMapService.js @@ -225,6 +225,7 @@ export class WebMapService { let bounds; let restResourceURL = ''; let kvpResourceUrl = ''; + const scales = []; const proxy = this.handleProxy(); let serviceUrl = Util.urlAppend(layerInfo.url, 'REQUEST=GetCapabilities&SERVICE=WMTS&VERSION=1.0.0'); serviceUrl = this.handleParentRes(serviceUrl); @@ -297,6 +298,7 @@ export class WebMapService { const tileMatrix = tileMatrixSet[i].TileMatrix[j]; const identifier = tileMatrix['ows:Identifier']; const topLeftCorner = [...tileMatrix['TopLeftCorner'].split(' ')]; + scales.push(tileMatrix['ScaleDenominator']); if ( (!this.numberEqual(topLeftCorner[0], defaultCRSTopLeftCorner[0]) || !this.numberEqual(topLeftCorner[1], defaultCRSTopLeftCorner[1])) && @@ -365,7 +367,7 @@ export class WebMapService { restResourceURL = resourceUrl['@_template']; } } - resolve({ isMatched, matchMaxZoom, matchMinZoom, style, bounds, restResourceURL, kvpResourceUrl }); + resolve({ isMatched, matchMaxZoom, matchMinZoom, style, bounds, restResourceURL, kvpResourceUrl, scales }); }) .catch(error => { reject(error); diff --git a/src/common/mapping/WebMapV2.js b/src/common/mapping/WebMapV2.js index 00519e4db..28c97aa90 100644 --- a/src/common/mapping/WebMapV2.js +++ b/src/common/mapping/WebMapV2.js @@ -114,9 +114,10 @@ export function createWebMapV2Extending(SuperClass, { MapManager, mapRepo, crsMa this._handleLayerInfo(mapInfo, _taskID); } else { setTimeout(() => { - this._createMap(mapInfo); - this.map.on('load', () => { - this._handleLayerInfo(mapInfo, _taskID); + this._createMap(mapInfo).then(() => { + this.map.on('load', () => { + this._handleLayerInfo(mapInfo, _taskID); + }); }); }, 0); } @@ -236,7 +237,78 @@ export function createWebMapV2Extending(SuperClass, { MapManager, mapRepo, crsMa return true; } - _createMap(mapInfo) { + async _getScales(mapInfo) { + const baseLayerInfo = mapInfo.baseLayer; + const scales = []; + let coordUnit = baseLayerInfo.coordUnit || baseLayerInfo.units || mapRepo.CRS.get(this.baseProjection).unit; + if (!coordUnit) { + coordUnit = this.baseProjection == 'EPSG:3857' ? 'm' : 'degree'; + } + let visibleScales = null; + if (baseLayerInfo.layerType === 'TILE') { + try { + const reqOptions = { + withoutFormatSuffix: true, + withCredentials: this.webMapService.handleWithCredentials('', baseLayerInfo.url, false) + }; + const res = await this.getBounds(`${baseLayerInfo.url}.json`, reqOptions) + if (res && res.visibleScales) { + visibleScales = res.visibleScales; + } + } catch (error) { + console.error(error); + } + } + if (visibleScales && visibleScales.length > 0) { + //底部设置过固定比例尺,则使用设置的 + visibleScales.forEach((scale) => { + const value = 1 / scale; + scales.push(`1:${value}`); + }); + } else if (baseLayerInfo.layerType === 'WMTS') { + try { + const result = await this.webMapService.getWmtsInfo(baseLayerInfo, this.baseProjection); + result.scales.forEach((scale) => { + scales.push(`1:${scale}`); + }); + } catch (error) { + console.error(error); + } + } else if (baseLayerInfo.layerType === 'ZXY_TILE') { + const { resolutions: visibleResolution } = baseLayerInfo; + visibleResolution.forEach((result) => { + const currentScale = '1:' + Util.getScaleFromResolution(result, coordUnit); + scales.push(currentScale); + }); + } else { + const extent = baseLayerInfo.layerType === 'MAPBOXSTYLE' ? mapRepo.CRS.get(this.baseProjection).extent : mapInfo.extent; + const resolutions = this._getResolutionsByExtent({ + extent: this._transExtentToBounds(extent), + tileSize: 512 + }); + for (const res of resolutions) { + const scale = '1:' + Util.getScaleFromResolution(res, coordUnit); + if (scales.indexOf(scale) === -1) { + scales.push(scale); + } + } + } + return scales; + } + + _transExtentToBounds(extent) { + if (extent instanceof Array) { + return extent; + } + return [ + extent.leftBottom.x, + extent.leftBottom.y, + extent.rightTop.x, + extent.rightTop.y + ]; + } + + async _createMap(mapInfo) { // 获取字体样式 const fontFamilys = this._getLabelFontFamily(mapInfo); const center = this._getMapCenter(mapInfo); @@ -247,10 +319,6 @@ export function createWebMapV2Extending(SuperClass, { MapManager, mapRepo, crsMa const interactive = this.mapOptions.interactive; const tileSize = mapInfo.baseLayer.tileSize; - if (mapInfo.baseLayer.layerType === 'ZXY_TILE') { - const {leftBottom, rightTop} = mapInfo.extent; - mapInfo.visibleExtent = [leftBottom.x, leftBottom.y, rightTop.x, rightTop.y]; - } if (isNaN(minZoom)) { minZoom = mapInfo.minScale ? this._transformScaleToZoom(mapInfo.minScale, mapRepo.CRS.get(this.baseProjection), tileSize) @@ -272,8 +340,9 @@ export function createWebMapV2Extending(SuperClass, { MapManager, mapRepo, crsMa } if (!bounds) { if (mapInfo.minScale && mapInfo.maxScale) { + const scales = await this._getScales(mapInfo); zoomBase = Math.min( - this._transformScaleToZoom(mapInfo.minScale, mapRepo.CRS.get(this.baseProjection), tileSize), + this._transformScaleToZoom(scales[0] || mapInfo.minScale, mapRepo.CRS.get(this.baseProjection), tileSize), this._transformScaleToZoom(mapInfo.maxScale, mapRepo.CRS.get(this.baseProjection), tileSize) ); } else { @@ -294,7 +363,6 @@ export function createWebMapV2Extending(SuperClass, { MapManager, mapRepo, crsMa maxZoom, bearing: this.bearing || 0, pitch: this.pitch || 0, - bounds, interactive: interactive === void 0 ? true : interactive, style: { version: 8, @@ -3127,7 +3195,7 @@ export function createWebMapV2Extending(SuperClass, { MapManager, mapRepo, crsMa } _getVisibility(visible) { - const visibility = visible === true || visible === 'visible' ? 'visible' : 'none'; + const visibility = visible === false || visible === 'none' ? 'none' : 'visible'; return visibility; } diff --git a/src/common/package.json b/src/common/package.json index 1747d84c4..07298cd4f 100644 --- a/src/common/package.json +++ b/src/common/package.json @@ -1,7 +1,7 @@ { "name": "@supermapgis/iclient-common", "description": "", - "version": "12.0.0-r", + "version": "12.0.1-dev", "keywords": [ "SuperMap" ], diff --git a/src/leaflet/package.json b/src/leaflet/package.json index 4483f95e8..0982f1ed0 100644 --- a/src/leaflet/package.json +++ b/src/leaflet/package.json @@ -1,7 +1,7 @@ { "name": "@supermapgis/iclient-leaflet", "description": "", - "version": "12.0.0-r", + "version": "12.0.1-dev", "keywords": [ "SuperMap", "Leaflet" @@ -19,7 +19,7 @@ "echarts":"5.5.0", "mapv":"2.0.62", "leaflet": "1.9.4", - "@supermapgis/iclient-common": "12.0.0-r", + "@supermapgis/iclient-common": "12.0.1-dev", "@mapbox/vector-tile": "1.3.1", "jsonsql": "0.2.5", "pbf": "3.2.1", diff --git a/src/mapboxgl/package.json b/src/mapboxgl/package.json index 935474379..3f7b904d9 100644 --- a/src/mapboxgl/package.json +++ b/src/mapboxgl/package.json @@ -1,7 +1,7 @@ { "name": "@supermapgis/iclient-mapboxgl", "description": "", - "version": "12.0.0-r", + "version": "12.0.1-dev", "keywords": [ "SuperMap", "MapboxGL v1" @@ -20,7 +20,7 @@ "@turf/meta": "^7.2.0", "mapv": "2.0.62", "mapbox-gl": "1.13.2", - "@supermapgis/iclient-common": "12.0.0-r", + "@supermapgis/iclient-common": "12.0.1-dev", "lodash.clonedeep": "^4.5.0", "proj4": "2.17.0" } diff --git a/src/maplibregl/package.json b/src/maplibregl/package.json index 32e04ea6d..984475fed 100644 --- a/src/maplibregl/package.json +++ b/src/maplibregl/package.json @@ -1,7 +1,7 @@ { "name": "@supermapgis/iclient-maplibregl", "description": "", - "version": "12.0.0-r", + "version": "12.0.1-dev", "keywords": [ "SuperMap", "maplibregl" @@ -17,7 +17,7 @@ "dependencies": { "@maplibre/maplibre-gl-style-spec": "^23.3.0", "maplibre-gl": "5.6.0", - "@supermapgis/iclient-common": "12.0.0-r", + "@supermapgis/iclient-common": "12.0.1-dev", "lodash.clonedeep": "^4.5.0", "proj4": "2.17.0" } diff --git a/src/openlayers/package.json b/src/openlayers/package.json index 2d2bc37ea..d519f7cee 100644 --- a/src/openlayers/package.json +++ b/src/openlayers/package.json @@ -1,7 +1,7 @@ { "name": "@supermapgis/iclient-ol", "description": "", - "version": "12.0.0-r", + "version": "12.0.1-dev", "keywords": [ "SuperMap", "OpenLayers" @@ -15,7 +15,7 @@ "author": "SuperMap", "license": "Apache-2.0", "dependencies": { - "@supermapgis/iclient-common": "12.0.0-r", + "@supermapgis/iclient-common": "12.0.1-dev", "@supermapgis/tile-decryptor": "^1.0.0", "@turf/turf": "7.2.0", "mapv": "2.0.62", diff --git a/test/mapboxgl/mapping/WebMapV2Spec.js b/test/mapboxgl/mapping/WebMapV2Spec.js index c2ff4d4e3..a6b3a505f 100644 --- a/test/mapboxgl/mapping/WebMapV2Spec.js +++ b/test/mapboxgl/mapping/WebMapV2Spec.js @@ -3791,4 +3791,313 @@ describe('mapboxgl_WebMapV2', () => { done(); }); }); + + it('baselayer is TILE, calc zoomBase with visibleScales', (done) => { + spyOn(FetchRequest, 'get').and.callFake((url) => { + if (url.indexOf('portal.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(iportal_serviceProxy))); + } + if (url.indexOf('123/map.json') > -1) { + return Promise.resolve(new Response(JSON.stringify({ + ...dynamicProjectionMapInfo, + layers: [] + }))); + } + if (url.indexOf(`China_Dark.json`) > -1) { + return Promise.resolve( + new Response( + JSON.stringify({ + prjCoordSys: { epsgCode: -1 }, + bounds: { + top: 20037508.342789087, + left: -20037508.342789248, + bottom: -25819498.513543323, + leftBottom: { + x: -20037508.342789248, + y: -25819498.513543323 + }, + right: 20037508.342789244, + rightTop: { + x: 20037508.342789244, + y: 20037508.342789087 + } + }, + visibleScales:[ + 1.6901635716001733e-9, + 3.3803271432574796e-9, + 6.760654286286427e-9, + 1.3521308573486984e-8, + 2.7042617146973967e-8, + 5.408523427932187e-8, + 1.0817046855864374e-7, + 2.163409371172875e-7, + 4.32681874234575e-7, + 8.6536374846915e-7, + 0.0000017307274969383, + 0.0000034614549938766, + 0.0000069229099877532 + ] + }) + ) + ); + } + }); + datavizWebmap = new WebMap('123', { + target: 'map', + serverUrl: 'http://fake/fakeiportal', + withCredentials: false + }); + datavizWebmap.on('mapcreatesucceeded', ({ map }) => { + expect(map.getZoom()).toBe(dynamicProjectionMapInfo.level - 1); + done(); + }); + }); + + it('baselayer is ZXY_TILE, calc zoomBase with resolutions, minScale 0', (done) => { + spyOn(FetchRequest, 'get').and.callFake((url) => { + if (url.indexOf('portal.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(iportal_serviceProxy))); + } + if (url.indexOf('123/map.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(baseLayerIsZXY_TILEMapInfo))); + } + }); + datavizWebmap = new WebMap('123', { + target: 'map', + serverUrl: 'http://fake/fakeiportal', + withCredentials: false + }); + datavizWebmap.on('mapcreatesucceeded', ({ map }) => { + expect(map.getZoom()).toBe(baseLayerIsZXY_TILEMapInfo.level); + done(); + }); + }); + + it('baselayer is ZXY_TILE, calc zoomBase with resolutions, minScale 10', (done) => { + spyOn(FetchRequest, 'get').and.callFake((url) => { + if (url.indexOf('portal.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(iportal_serviceProxy))); + } + if (url.indexOf('123/map.json') > -1) { + return Promise.resolve(new Response(JSON.stringify({ + ...baseLayerIsZXY_TILEMapInfo, + minScale: "1:577791.7098724197" + }))); + } + }); + datavizWebmap = new WebMap('123', { + target: 'map', + serverUrl: 'http://fake/fakeiportal', + withCredentials: false + }); + datavizWebmap.on('mapcreatesucceeded', ({ map }) => { + expect(map.getZoom()).toBe(baseLayerIsZXY_TILEMapInfo.level); + done(); + }); + }); + + it('baseLayer is WMTS, calc zoomBase with scales', (done) => { + spyOn(FetchRequest, 'get').and.callFake((url) => { + if (url.indexOf('map-china400/wmts100') > -1) { + return Promise.resolve(new Response(wmtsCapabilitiesText)); + } + return Promise.resolve(new Response(JSON.stringify({}))); + }); + datavizWebmap = new WebMap(baseLayers['WMTS'], { ...commonOption }); + const callback = function ({ map }) { + expect(map.getZoom()).toBe(baseLayers['WMTS'].level); + done(); + }; + datavizWebmap.on('mapcreatesucceeded', callback); + }); + + it('baselayer is jinjing mvt, calc zoomBase with resolutions', (done) => { + const mapInfo = { + ...webmap_MAPBOXSTYLE_Tile, + layers: [], + maxScale: "1:70.45225847627215", + minScale: "1:1154289.802875243" + }; + spyOn(FetchRequest, 'get').and.callFake((url) => { + if (url.indexOf('portal.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(iportal_serviceProxy))); + } + if (url.indexOf('123/map.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(mapInfo))); + } + if (url.indexOf('/style.json')) { + return Promise.resolve(new Response(JSON.stringify(vectorTile_style))); + } + return Promise.resolve(new Response(JSON.stringify({ + visibleScales: [ + 1.6901635716026555e-9, + 3.3803271432053056e-9, + 6.760654286410611e-9, + 1.3521308572821242e-8, + 2.7042617145642484e-8, + 5.408523429128511e-8, + 1.0817046858256998e-7, + 2.1634093716513974e-7, + 4.3268187433028044e-7, + 8.653637486605571e-7, + 0.0000017307274973211203, + 0.0000034614549946422405, + 0.0000069229099892844565 + ] + }))); + }); + datavizWebmap = new WebMap('123', { + target: 'map', + serverUrl: 'http://fake/fakeiportal', + withCredentials: false + }); + datavizWebmap.on('mapcreatesucceeded', ({ map }) => { + expect(map.getZoom()).toBe(webmap_MAPBOXSTYLE_Tile.level); + const { layers } = map.getStyle(); + expect(layers[0].layout.visibility).toBe('visible'); + done(); + }); + }); + + it('baselayer is jinjing TILE, calc zoomBase with resolutions', (done) => { + const mapInfo = { + ...webmap_MAPBOXSTYLE_Tile, + baseLayer: { + layerType: 'TILE', + name: '京津地区地图', + url: 'http://localhost:8090/iserver/services/map-jingjin/rest/maps/%E4%BA%AC%E6%B4%A5%E5%9C%B0%E5%8C%BA%E5%9C%B0%E5%9B%BE' + }, + layers: [], + level: 4, + maxScale: '1:0.96376561276023', + minScale: '1:4042325.9646626837', + extent: { + leftBottom: { + x: 114.58902605452259, + y: 37.76434929128856 + }, + rightTop: { + x: 119.51371730073062, + y: 42.31307532235788 + } + } + }; + spyOn(FetchRequest, 'get').and.callFake((url) => { + if (url.indexOf('portal.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(iportal_serviceProxy))); + } + if (url.indexOf('123/map.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(mapInfo))); + } + if (url.indexOf('/style.json')) { + return Promise.resolve(new Response(JSON.stringify(vectorTile_style))); + } + return Promise.resolve(new Response(JSON.stringify({ + visibleScales: [] + }))); + }); + datavizWebmap = new WebMap('123', { + target: 'map', + serverUrl: 'http://fake/fakeiportal', + withCredentials: false + }); + datavizWebmap.on('mapcreatesucceeded', ({ map }) => { + expect(map.getZoom()).toBeCloseTo(10.19); + done(); + }); + }); + + it('baseLayer is others, calc zoomBase with resolutions', (done) => { + const metaInfo = { + resourceSets: [ + { + resources: [ + { + __type: 'ImageryMetadata:http://schemas.microsoft.com/search/local/ws/rest/v1', + imageHeight: 256, + imageUrl: + 'https://{subdomain}.ssl.ak.dynamic.tiles.virtualearth.net/comp/ch/{quadkey}?mkt=zh-CN&it=G,L&shading=hill&og=2505&n=z', + imageUrlSubdomains: ['t0', 't1', 't2', 't3'], + imageWidth: 256 + } + ] + } + ], + statusCode: 200, + statusDescription: 'OK' + }; + spyOn(FetchRequest, 'get').and.callFake((url) => { + if (url.indexOf('Imagery/Metadata/RoadOnDemand') > -1) { + return Promise.resolve(new Response(JSON.stringify(metaInfo))); + } + return Promise.resolve(); + }); + const mapInfo = baseLayers['BING']; + const callback = function ({ map }) { + expect(map.getZoom()).toBe(mapInfo.level); + done(); + }; + datavizWebmap = new WebMap(mapInfo, { + bingMapsKey: 'AhOVlIlR89XkNyDsXBAb7TjabrEokPoqhjk4ncLm9cQkJ5ae_JyhgV1wMcWnVrko' + }); + datavizWebmap.on('mapcreatesucceeded', callback); + }); + + it('test MAPBOXSTYLE layers visibility', (done) => { + const mapInfo = { + ...webmap_MAPBOXSTYLE_Tile, + layers: [{ + layerType: 'MAPBOXSTYLE', + name: 'China', + dataSource: { + type: 'EXTERNAL', + url: 'https://fakeiportal.supermap.io/iserver/services/map-china400/restjsr/v1/vectortile/maps/China' + }, + visible: false + }] + } + const china4326StyleJSON = JSON.parse(styleJson); + const chinaStyleJSON = { + ...china4326StyleJSON, + sources: { + "china_source": china4326StyleJSON.sources["ChinaqxAlberts_4548@fl-new"] + }, + layers: [{ + ...china4326StyleJSON.layers[1], + id: "china_layer", + "source-layer": "china_source_layer", + source: "china_source" + }] + } + spyOn(FetchRequest, 'get').and.callFake((url, params, options) => { + if (url.indexOf('portal.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(iportal_serviceProxy))); + } + if (url.indexOf('map.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(mapInfo))); + } + if (url.indexOf('maps/China_4326/style.json') > -1) { + return Promise.resolve(new Response(styleJson)); + } + if (url.indexOf('maps/China/style.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(chinaStyleJSON))); + } + return Promise.resolve(); + }); + datavizWebmap = new WebMap(id, { + server: server + }); + datavizWebmap.on('mapcreatesucceeded', (data) => { + expect(data.map.addStyle).toHaveBeenCalledTimes(2); + const hideLayer = datavizWebmap.getLayers().find(layer => layer.id === "china_source_layer"); + expect(hideLayer).not.toBeUndefined(); + expect(hideLayer.visible).toBeFalsy(); + const layersOnMap = data.map.getStyle().layers; + expect(layersOnMap.filter(item => item.layout.visibility === "visible").length).toBe(2); + const matchHideLayerOnMap = layersOnMap.find(layer => layer.id === "china_layer"); + expect(matchHideLayerOnMap).not.toBeUndefined(); + expect(matchHideLayerOnMap.layout.visibility).toBe("none"); + done(); + }); + }); }); diff --git a/test/resources/WebMapV5.js b/test/resources/WebMapV5.js index 4ea7f8ff4..27c9ebfe2 100644 --- a/test/resources/WebMapV5.js +++ b/test/resources/WebMapV5.js @@ -4072,8 +4072,8 @@ var dynamicProjectionMapInfo = { y: 20037508.34258019 } }, - maxScale: '1:144447.9275', - level: 12, + maxScale: '1:144447.92746805', + level: 6, center: { x: 12654327.874745157, y: 248497.88596388634 @@ -4099,8 +4099,68 @@ var dynamicProjectionMapInfo = { ], description: '', projection: 'EPSG:3857', - minScale: '1:591658710.91', + minScale: '1:73957338.8636414', title: '动态投影', version: '2.4.3', rootUrl: 'http://localhost:8190/iportal/' }; + +var baseLayerIsZXY_TILEMapInfo = { + extent: { + leftBottom: { + x: 795233.5770899998, + y: 794267.8361200001 + }, + rightTop: { + x: 872991.5360700004, + y: 853188.3580900002 + } + }, + maxScale: '1:564.249716499433', + level: 10, + center: { + x: 834112.5574142822, + y: 823728.096774991 + }, + baseLayer: { + layerType: 'ZXY_TILE', + subdomains: [], + visible: true, + mapBounds: [795233.5770899998, 794267.8361200001, 872991.5360700004, 853188.3580900002], + maxZoom: 24, + origin: [-4786700, 8353100], + tileSize: 256, + name: 'HK', + minZoom: 10, + resolutions: [ + 156543.03392800014, 78271.51696399994, 39135.75848200009, 19567.87924099992, 9783.93962049996, 4891.96981024998, + 2445.98490512499, 1222.992452562495, 611.4962262813797, 305.74811314055756, 152.87405657041106, 76.43702828507324, + 38.21851414253662, 19.10925707126831, 9.554628535634155, 4.77731426794937, 2.388657133974685, 1.1943285668550503, + 0.5971642835598172, 0.29858214164761665, 0.14929107082380833 + ], + url: 'https://mapapi.geodata.gov.hk/gs/api/v1.0.0/xyz/basemap/HK80/{z}/{x}/{y}.png' + }, + layers: [ + { + layerType: 'ZXY_TILE', + subdomains: [], + visible: true, + maxZoom: 24, + origin: [-4786700, 8353100], + tileSize: 256, + name: 'hk-叠加-0-bounds', + minZoom: 0, + resolutions: [ + 156543.03392800014, 78271.51696399994, 0.5971642835598172, 0.29858214164761665, 0.14929107082380833 + ], + url: 'https://mapapi.geodata.gov.hk/gs/api/v1.0.0/xyz/basemap/HK80/{z}/{x}/{y}.png' + } + ], + description: '', + projection: + 'PROJCS["Hong Kong 1980 Grid System", \r\n GEOGCS["Hong Kong 1980", \r\n DATUM["Hong Kong 1980", \r\n SPHEROID["International 1924", 6378388.0, 297.0, AUTHORITY["EPSG","7022"]], \r\n TOWGS84[-162.619, -276.959, -161.764, 0.067753, -2.243649, -1.158827, -1.094246], \r\n AUTHORITY["EPSG","6611"]], \r\n PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], \r\n UNIT["degree", 0.017453292519943295], \r\n AXIS["lat", NORTH], \r\n AXIS["lon", EAST], \r\n AUTHORITY["EPSG","4611"]], \r\n PROJECTION["Transverse_Mercator", AUTHORITY["EPSG","9807"]], \r\n PARAMETER["central_meridian", 114.17855555555556], \r\n PARAMETER["latitude_of_origin", 22.312133333333335], \r\n PARAMETER["scale_factor", 1.0], \r\n PARAMETER["false_easting", 836694.05], \r\n PARAMETER["false_northing", 819069.8], \r\n UNIT["m", 1.0], \r\n AXIS["Northing", NORTH], \r\n AXIS["Easting", EAST], \r\n AUTHORITY["EPSG","2326"]]', + minScale: '1:591658710.9089769', + title: 'hk-叠加-0-无bounds', + version: '2.4.3', + rootUrl: 'http://172.16.14.44:8190/iportal/' +}; \ No newline at end of file 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