123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344 |
- import L, { Util as LUtil} from "leaflet";
- import "@supermap/iclient-leaflet/core/Base";
- import {
- SecurityManager,
- Unit,
- ServerGeometry,
- CommonUtil
- } from '@supermap/iclient-common';
- import * as Util from "@supermap/iclient-leaflet/core/Util";
- import Attributions from '@supermap/iclient-leaflet/core/Attributions'
- export let TiledMapLayer = L.TileLayer.extend({
- options: {
- //如果有layersID,则是在使用专题图
- layersID: null,
- //如果为 true,则将请求重定向到瓦片的真实地址;如果为 false,则响应体中是瓦片的字节流
- redirect: false,
- transparent: true,
- cacheEnabled: true,
- clipRegionEnabled: false,
- //地图显示裁剪的区域
- clipRegion: null,
- //请求的地图的坐标参考系统。 如:prjCoordSys={"epsgCode":3857}
- prjCoordSys: null,
- //地图对象在同一范围内时,是否重叠显示
- overlapDisplayed: false,
- //避免地图对象压盖显示的过滤选项
- overlapDisplayedOptions: null,
- //切片版本名称,cacheEnabled 为 true 时有效。
- tileversion: null,
- crs: null,
- format: 'png',
- //启用托管地址。
- tileProxy:null,
- attribution: Attributions.Common.attribution,
- subdomains: null
- },
- initialize: function (url, options) {
- this._url = url;
- L.TileLayer.prototype.initialize.apply(this, arguments);
- L.setOptions(this, options);
- L.stamp(this);
- //当前切片在切片集中的index
- this.tileSetsIndex = -1;
- this.tempIndex = -1;
- },
- /**
- * @private
- * @function L.supermap.tiledMapLayer.prototype.onAdd
- * @description 添加地图。
- * @param {L.Map} map - 待添加的影像地图参数。
- */
- onAdd: function (map) {
- this._crs = this.options.crs || map.options.crs;
- L.TileLayer.prototype.onAdd.call(this, map);
- },
- /**
- * @function L.supermap.tiledMapLayer.prototype.getTileUrl
- * @description 根据行列号获取瓦片地址。
- * @param {Object} coords - 行列号。
- * @returns {string} 瓦片地址。
- */
- getTileUrl: function (coords) {
- var scale = this.getScaleFromCoords(coords);
- var layerUrl = this._getLayerUrl();
- var tileUrl = layerUrl + "&scale=" + scale + "&x=" + coords.x + "&y=" + coords.y;
- //支持代理
- if (this.options.tileProxy) {
- tileUrl = this.options.tileProxy + encodeURIComponent(tileUrl);
- }
- if (!this.options.cacheEnabled) {
- tileUrl += "&_t=" + new Date().getTime();
- }
- if (this.options.subdomains) {
- tileUrl = L.Util.template(tileUrl, {s: this._getSubdomain(coords)});
- }
- return tileUrl;
- },
- /**
- * @function L.supermap.tiledMapLayer.prototype.getScale
- * @description 根据缩放级别获取比例尺。
- * @param {number} zoom - 缩放级别。
- * @returns {number} 比例尺。
- */
- getScale: function (zoom) {
- var me = this;
- //返回当前比例尺
- var z = zoom || me._map.getZoom();
- return me.scales[z];
- },
- /**
- * @function L.supermap.tiledMapLayer.prototype.getScaleFromCoords
- * @description 通过行列号获取比例尺。
- * @param {Object} coords - 行列号。
- * @returns {number} 比例尺。
- */
- getScaleFromCoords: function (coords) {
- var me = this,
- scale;
- if (me.scales && me.scales[coords.z]) {
- return me.scales[coords.z];
- }
- me.scales = me.scales || {};
- scale = me.getDefaultScale(coords);
- me.scales[coords.z] = scale;
- return scale;
- },
- /**
- * @private
- * @function L.supermap.tiledMapLayer.prototype.getDefaultScale
- * @description 获取默认比例尺信息。
- * @param {Object} coords - 坐标对象参数。
- */
- getDefaultScale: function (coords) {
- var me = this,
- crs = me._crs;
- if (crs.scales) {
- return crs.scales[coords.z];
- } else {
- var tileBounds = me._tileCoordsToBounds(coords);
- var ne = crs.project(tileBounds.getNorthEast());
- var sw = crs.project(tileBounds.getSouthWest());
- var tileSize = me.options.tileSize;
- var resolution = Math.max(
- Math.abs(ne.x - sw.x) / tileSize,
- Math.abs(ne.y - sw.y) / tileSize
- );
- var mapUnit = Unit.METER;
- if (crs.code) {
- var array = crs.code.split(':');
- if (array && array.length > 1) {
- var code = parseInt(array[1]);
- mapUnit = code && code >= 4000 && code <= 5000 ? Unit.DEGREE : Unit.METER;
- }
- }
- return Util.resolutionToScale(resolution, 96, mapUnit);
- }
- },
- /**
- * @function L.supermap.tiledMapLayer.prototype.setTileSetsInfo
- * @description 设置瓦片集信息。
- * @param {Object} tileSets - 瓦片对象集。
- */
- setTileSetsInfo: function (tileSets) {
- this.tileSets = tileSets;
- if (L.Util.isArray(this.tileSets)) {
- this.tileSets = this.tileSets[0];
- }
- if (!this.tileSets) {
- return;
- }
- /**
- * @event L.supermap.tiledMapLayer#tilesetsinfoloaded
- * @description 瓦片集信息设置完成后触发。
- * @property {Array.<Object>} tileVersions - 瓦片集信息。
- */
- this.fire('tilesetsinfoloaded', {
- tileVersions: this.tileSets.tileVersions
- });
- this.changeTilesVersion();
- },
- /**
- * @function L.supermap.tiledMapLayer.prototype.lastTilesVersion
- * @description 请求上一个版本切片,并重新绘制。
- */
- lastTilesVersion: function () {
- this.tempIndex = this.tileSetsIndex - 1;
- this.changeTilesVersion();
- },
- /**
- * @function L.supermap.tiledMapLayer.prototype.nextTilesVersion
- * @description 请求下一个版本切片,并重新绘制。
- */
- nextTilesVersion: function () {
- this.tempIndex = this.tileSetsIndex + 1;
- this.changeTilesVersion();
- },
- /**
- * @function L.supermap.tiledMapLayer.prototype.changeTilesVersion
- * @description 切换到某一版本的切片,并重绘。通过 this.tempIndex 保存需要切换的版本索引
- */
- changeTilesVersion: function () {
- var me = this;
- //切片版本集信息是否存在
- if (me.tileSets == null) {
- //版本信息为空,重新查询,查询成功继续跳转到相应的版本
- //me.getTileSetsInfo();
- return;
- }
- if (me.tempIndex === me.tileSetsIndex || this.tempIndex < 0) {
- return;
- }
- //检测index是否可用
- var tileVersions = me.tileSets.tileVersions;
- if (tileVersions && me.tempIndex < tileVersions.length && me.tempIndex >= 0) {
- var name = tileVersions[me.tempIndex].name;
- var result = me.mergeTileVersionParam(name);
- if (result) {
- me.tileSetsIndex = me.tempIndex;
- /**
- * @event L.supermap.tiledMapLayer#tileversionschanged
- * @description 切片的版本切换和重绘成功之后触发。
- * @property {Object} tileVersion - 该版本的切片。
- */
- me.fire('tileversionschanged', {
- tileVersion: tileVersions[me.tempIndex]
- });
- }
- }
- },
- /**
- * @function L.supermap.tiledMapLayer.prototype.updateCurrentTileSetsIndex
- * @description 手动设置当前切片集索引,目前主要提供给控件使用。
- * @param {number} index - 索引值。
- */
- updateCurrentTileSetsIndex: function (index) {
- this.tempIndex = index;
- },
- /**
- * @function L.supermap.tiledMapLayer.prototype.mergeTileVersionParam
- * @description 更改URL请求参数中的切片版本号,并重绘。
- * @param {string} version - 切片版本号。
- * @returns {boolean} 是否成功。
- */
- mergeTileVersionParam: function (version) {
- if (version) {
- this.requestParams["tileversion"] = version;
- this._paramsChanged = true;
- this.redraw();
- this._paramsChanged = false;
- return true;
- }
- return false;
- },
- _getLayerUrl: function () {
- if (this._paramsChanged) {
- this._layerUrl = this._createLayerUrl();
- }
- return this._layerUrl || this._createLayerUrl();
- },
- _createLayerUrl: function () {
- let layerUrl = CommonUtil.urlPathAppend(this._url, `tileImage.${this.options.format}`);
- this.requestParams = this.requestParams || this._getAllRequestParams();
- layerUrl = CommonUtil.urlAppend(layerUrl, LUtil.getParamString(this.requestParams));
- layerUrl = SecurityManager.appendCredential(layerUrl);
- this._layerUrl = layerUrl;
- return layerUrl;
- },
- _getAllRequestParams: function () {
- var me = this,
- options = me.options || {},
- params = {};
- var tileSize = this.options.tileSize;
- if (!(tileSize instanceof L.Point)) {
- tileSize = L.point(tileSize, tileSize);
- }
- params["width"] = tileSize.x;
- params["height"] = tileSize.y;
- params["redirect"] = options.redirect === true;
- params["transparent"] = options.transparent === true;
- params["cacheEnabled"] = !(options.cacheEnabled === false);
- if (options.prjCoordSys) {
- params["prjCoordSys"] = JSON.stringify(options.prjCoordSys);
- }
- if (options.layersID) {
- params["layersID"] = options.layersID.toString();
- }
- if (options.clipRegionEnabled && options.clipRegion) {
- options.clipRegion = ServerGeometry.fromGeometry(Util.toSuperMapGeometry(options.clipRegion));
- params["clipRegionEnabled"] = options.clipRegionEnabled;
- params["clipRegion"] = JSON.stringify(options.clipRegion);
- }
- //切片的起始参考点,默认为地图范围的左上角。
- var crs = me._crs;
- if (crs.options && crs.options.origin) {
- params["origin"] = JSON.stringify({
- x: crs.options.origin[0],
- y: crs.options.origin[1]
- });
- } else if (crs.projection && crs.projection.bounds) {
- var bounds = crs.projection.bounds;
- var tileOrigin = L.point(bounds.min.x, bounds.max.y);
- params["origin"] = JSON.stringify({
- x: tileOrigin.x,
- y: tileOrigin.y
- });
- }
- if (options.overlapDisplayed === false) {
- params["overlapDisplayed"] = false;
- if (options.overlapDisplayedOptions) {
- params["overlapDisplayedOptions"] = me.overlapDisplayedOptions.toString();
- }
- } else {
- params["overlapDisplayed"] = true;
- }
- if (params.cacheEnabled === true && options.tileversion) {
- params["tileversion"] = options.tileversion.toString();
- }
- if (options.rasterfunction) {
- params["rasterfunction"] = JSON.stringify(options.rasterfunction);
- }
- return params;
- }
- });
- export let tiledMapLayer = function (url, options) {
- return new TiledMapLayer(url, options);
- };
- //--------------------------------------------------------------
- //打点
- export function makePoint(map,markers){
- markers.forEach((index,item)=>{
- console.log(index,item)
- L.marker(item.latlon).addTo(map);
- })
- }
|