@mapgis/webclient-es6-mapboxgl
Version:
151 lines (143 loc) • 6.47 kB
JavaScript
//对于中地的瓦片数据,坐标系目前只支持3857测试都支持,只支持原点为4个角,
//这是因为leaf的瓦片序列在0级只支持2张瓦片,如果是任意点为原点,
//那么在0级的时候就有4张瓦片,不能一一对应
import {Zondy} from './mapboxBase';
//import {Zondy} from '../../service/common/Base';
import { newGuid, extend } from '../util/Util';
/**
* @author 基础平台/产品2部 龚跃健
* @class mapboxgl.Zondy.Map.MapTileLayer
* @classdesc mapboxgl瓦片地图加载类
* @param serverName - {String} 必选。地图服务名
* @param option - {Object} 属性键值对,地图属性字段。
* @param {String} [option.domain = ''] 【domain和(networkProtocol,ip,port)二选一】。域名,代理服务器不提供端口号时可采用传入domain的方式。例如:domain:`http://www.sgic.net.cn/CoCloud3`。
* @param {String} [option.networkProtocol = location.protocol.split(":")[0] || "http"] 【domain和(networkProtocol,ip,port)二选一】。网络协议
* @param {String} [option.ip = localhost] 【domain和(networkProtocol,ip,port)二选一】。地图服务ip
* @param {String} [option.port = 6163] 【domain和(networkProtocol,ip,port)二选一】。地图服务端口
*
* @param {String} [option.zoomOffset = 0] 可选。加载瓦片的0级与mapboxgl标准瓦片0级(墨卡托裁图标准)的差值
* @param {String} [option.origin = [-180, 90]] 可选。瓦片原点
* @param {String} [option.tileSize = 512] 可选。瓦片大小
* @param {String} [option.layerID] 可选。
* @param {String} [option.sourceID] 可选。
* @example
//地图容器
var map = new mapboxgl.Map({
container: 'map', // 容器id
crs: 'EPSG:4326',//mapboxgl原生只支持3857
center: [101.74721254733845, 32.5665352689922],
zoom: 3
});
//瓦片地图
new mapboxgl.Zondy.Map.MapTileLayer('CHINAXY_4', {
ip: 'localhost',
port: '6163',
zoomOffset: 2
}).addToMap(map);
*/
var MapTileLayer = function (serverName, option) {
var option = option ? option : {};
var domain = option && option.domain ? option.domain : '';
if (domain === '') {
this.networkProtocol = option.networkProtocol !== undefined ? option.networkProtocol : location.protocol.split(":")[0] || "http";
var ip = option && option.ip ? option.ip : 'localhost';
var port = option && option.port ? option.port : '6163';
this.url = this._url = encodeURI(this.networkProtocol + '://' + ip + ':' + port + '/igs/rest/mrms/tile/' + serverName);
} else {
this.url = this._url = encodeURI(domain + '/igs/rest/mrms/tile/' + serverName);
}
this.options = {
tileExtent: [-180, -90, 180, 90],
zoomOffset: 0,
yAxis: "down",
origin: [-180, 90],
tileSize: 512,//mapbox源码里和IGServer里都默认为512
attribution: "Zondy Map Tile Data"
};
this.layerID = option.layerID ? option.layerID : null;
this.sourceID = option.sourceID ? option.sourceID : null;
this.map = null;
extend(this.options, option);
};
/***
* @description 将地图加载到地图容器中
* @function mapboxgl.Zondy.Map.MapTileLayer.prototype.addToMap
* @param map 地图对象
* @returns {mapboxgl.Zondy.Map.MapTileLayer}
*/
MapTileLayer.prototype.addToMap = function (map) {
this.map = map;
this._initLayerUrl();
var zoomOffset = this.options.zoomOffset;
//已将下列逻辑下沉到了@mapgis/mapbox-gl中
//重写mapbox中CanonicalTileID的url类,以支持非标准裁剪的瓦片(这里的非标准不是指任意裁剪瓦片,而是当前瓦片的0级不是mapbox定义的瓦片的0级,中间相差zoomOffset级)
// let mapboxgl = window.mapboxgl;
// mapboxgl.CanonicalTileID.prototype.url = function (urls, scheme) {
// const bbox = this.getTileBBox();
// if (zoomOffset > this.z) {
// zoomOffset = 0;
// }
// const quadkey = getQuadkey(this.z - zoomOffset, this.x, this.y);
// return urls[(this.x + this.y) % urls.length]
// .replace('{prefix}', (this.x % 16).toString(16) + (this.y % 16).toString(16))
// .replace('{z}', String(this.z - zoomOffset))
// .replace('{x}', String(this.x))
// .replace('{y}', String(scheme === 'tms' ? (Math.pow(2, this.z) - this.y - 1) : this.y))
// .replace('{quadkey}', quadkey)
// .replace('{bbox-epsg-3857}', bbox);
// };
var sourceID = this.sourceID || "source_" + newGuid();
var layerID = this.layerID || "layer_" + newGuid();
var tile_source = {
'type': 'raster',//数据源类型,因为wms返回图片数据,因此为该类型
'tiles': [this._layerUrl],
'tileSize': this.options.tileSize || 512, //图片显示的大小,最好和上面大小保持一致
mapgisOffset: zoomOffset
};
var mLayer = {
'id': layerID,//图层ID
'type': 'raster',//图层类型
'source': sourceID
};
if (this.map.getStyle()) {
if (this.map.getSource(sourceID) === undefined) {
this.map.addSource(sourceID, tile_source);
this.sourceID = sourceID;
}
if (this.map.getLayer(layerID) === undefined) {
this.map.addLayer(mLayer);
this.layerID = layerID;
}
return this;
} else {
this.map.setStyle({
"version": 8,
"sources": {},
"layers": []
});
var me = this;
me.map.on('load', function () {
me.map.addSource(sourceID, tile_source);
me.sourceID = sourceID;
me.map.addLayer(mLayer);
me.layerID = layerID;
return me;
});
}
};
MapTileLayer.prototype._initLayerUrl = function () {
var me = this;
var layerUrl = me.url + "/{z}/{y}/{x}";
this._layerUrl = layerUrl;
};
// function getQuadkey(z, x, y) {
// let quadkey = '',
// mask;
// for (let i = z; i > 0; i--) {
// mask = 1 << (i - 1);
// quadkey += ((x & mask ? 1 : 0) + (y & mask ? 2 : 0));
// }
// return quadkey;
// }
export {MapTileLayer};
Zondy.Map.MapTileLayer = MapTileLayer;