/* eslint-disable */
/**
* @class L.supermap.echartsLayer
* @classdesc 百度ECharts图层类。
* @category Visualization ECharts
* @extends L.Layer{@linkdoc-leaflet/#layer}
* @param echartsOptions - {Object} 图表参数
* @param options - {Object} 可选图层参数。
* attribution - {string} 版权信息。
* loadWhileAnimating - {boolean} 是否在移动时实时绘制。默认为false。
*/
var EchartsLayer = L.Layer.extend({
includes: [],
_echartsContainer: null,
_map: null,
_ec: null,
_echartsOptions: null,
options: {
attribution: "© 2017 百度 ECharts",
loadWhileAnimating: false
},
initialize: function initialize(echartsOptions, options) {
L.Util.setOptions(this, options);
this.setOption(echartsOptions);
},
/**
* @function L.supermap.echartsLayer.prototype.setOption
* @description 设置图表地图参数
* @param echartsOptions - {Object} 图表参数
* @param notMerge - {boolean} 是否合并参数
* @param lazyUpdate - {string} 后台自动更新
*/
setOption: function setOption(echartsOptions, notMerge, lazyUpdate) {
var baseOption = echartsOptions.baseOption || echartsOptions;
baseOption.LeafletMap = baseOption.LeafletMap || {
roam: true
};
baseOption.animation = baseOption.animation === true;
this._echartsOptions = echartsOptions;
this._ec && this._ec.setOption(echartsOptions, notMerge, lazyUpdate);
},
getEcharts: function getEcharts() {
return this._ec;
},
_disableEchartsContainer: function _disableEchartsContainer() {
this._echartsContainer.style.visibility = "hidden";
},
_enableEchartsContainer: function _enableEchartsContainer() {
this._echartsContainer.style.visibility = "visible";
},
/**
* @private
* @function L.supermap.echartsLayer.prototype.onAdd
* @description 添加地图
* @param map - {L.map} 待添加的地图
*/
onAdd: function onAdd(map) {
this._map = map;
this._initEchartsContainer();
this._ec = echarts.init(this._echartsContainer);
echarts.leafletMap = map;
var me = this;
map.on("zoomstart", function () {
me._disableEchartsContainer();
});
!me.options.loadWhileAnimating && map.on("movestart", function () {
me._disableEchartsContainer();
});
echarts.registerAction({
type: 'LeafletMapLayout',
event: 'LeafletMapLayout',
update: 'updateLayout'
}, function (payload, ecModel) {// eslint-disable-line no-unused-vars
});
echarts.registerCoordinateSystem('leaflet', LeafletMapCoordSys);
echarts.extendComponentModel({
type: 'LeafletMap',
getBMap: function getBMap() {
return this.__LeafletMap;
},
defaultOption: {
roam: false
}
});
echarts.extendComponentView({
type: 'LeafletMap',
render: function render(LeafletMapModel, ecModel, api) {
var rendering = true;
var leafletMap = echarts.leafletMap;
var viewportRoot = api.getZr().painter.getViewportRoot();
var animated = leafletMap.options.zoomAnimation && L.Browser.any3d;
viewportRoot.className = ' leaflet-layer leaflet-zoom-' + (animated ? 'animated' : 'hide') + ' echarts-layer';
var originProp = L.DomUtil.testProp(['transformOrigin', 'WebkitTransformOrigin', 'msTransformOrigin']);
viewportRoot.style[originProp] = '50% 50%';
var coordSys = LeafletMapModel.coordinateSystem;
var ecLayers = api.getZr().painter.getLayers();
var moveHandler = function moveHandler() {
if (rendering) {
return;
}
var offset = me._map.containerPointToLayerPoint([0, 0]);
var mapOffset = [offset.x || 0, offset.y || 0];
viewportRoot.style.left = mapOffset[0] + 'px';
viewportRoot.style.top = mapOffset[1] + 'px';
for (var item in ecLayers) {
if (!ecLayers.hasOwnProperty(item)) {
continue;
}
ecLayers[item] && clearContext(ecLayers[item].ctx);
}
if (!me.options.loadWhileAnimating) {
me._enableEchartsContainer();
}
coordSys.setMapOffset(mapOffset);
LeafletMapModel.__mapOffset = mapOffset;
api.dispatchAction({
type: 'LeafletMapLayout'
});
};
function clearContext(context) {
context && context.clearRect && context.clearRect(0, 0, context.canvas.width, context.canvas.height);
}
function zoomEndHandler() {
if (rendering) {
return;
}
api.dispatchAction({
type: 'LeafletMapLayout'
});
me._enableEchartsContainer();
}
if (this._oldMoveHandler) {
leafletMap.off(me.options.loadWhileAnimating ? 'move' : 'moveend', this._oldMoveHandler);
}
if (this._oldZoomEndHandler) {
leafletMap.off('zoomend', this._oldZoomEndHandler);
}
leafletMap.on(me.options.loadWhileAnimating ? 'move' : 'moveend', moveHandler);
leafletMap.on('zoomend', zoomEndHandler);
this._oldMoveHandler = moveHandler;
this._oldZoomEndHandler = zoomEndHandler;
rendering = false;
}
});
this._ec.setOption(this._echartsOptions);
},
onRemove: function onRemove() {
// 销毁echarts实例
this._ec.dispose();
},
_initEchartsContainer: function _initEchartsContainer() {
var size = this._map.getSize();
var _div = document.createElement('div');
_div.style.position = 'absolute';
_div.style.height = size.y + 'px';
_div.style.width = size.x + 'px';
_div.style.zIndex = 10;
this._echartsContainer = _div;
this._map.getPanes().overlayPane.appendChild(this._echartsContainer);
var me = this;
this._map.on('resize', function (e) {
var size = e.newSize;
me._echartsContainer.style.width = size.x + 'px';
me._echartsContainer.style.height = size.y + 'px';
me._ec.resize();
});
}
});
/**
* @class L.supermap.LeafletMapCoordSys
* @private
* @classdesc 地图坐标系统类
* @param leafletMap - {L.map} 地图
* @param api - {Object} 接口
*/
function LeafletMapCoordSys(leafletMap) {
this._LeafletMap = leafletMap;
this.dimensions = ['lng', 'lat'];
this._mapOffset = [0, 0];
}
LeafletMapCoordSys.prototype.dimensions = ['lng', 'lat'];
LeafletMapCoordSys.prototype.setMapOffset = function (mapOffset) {
this._mapOffset = mapOffset;
};
LeafletMapCoordSys.prototype.getBMap = function () {
return this._LeafletMap;
};
LeafletMapCoordSys.prototype.prepareCustoms = function () {
var zrUtil = echarts.util;
var rect = this.getViewRect();
return {
coordSys: {
// The name exposed to user is always 'cartesian2d' but not 'grid'.
type: 'leaflet',
x: rect.x,
y: rect.y,
width: rect.width,
height: rect.height
},
api: {
coord: zrUtil.bind(this.dataToPoint, this),
size: zrUtil.bind(dataToCoordSize, this)
}
};
function dataToCoordSize(dataSize, dataItem) {
dataItem = dataItem || [0, 0];
return zrUtil.map([0, 1], function (dimIdx) {
var val = dataItem[dimIdx];
var halfSize = dataSize[dimIdx] / 2;
var p1 = [];
var p2 = [];
p1[dimIdx] = val - halfSize;
p2[dimIdx] = val + halfSize;
p1[1 - dimIdx] = p2[1 - dimIdx] = dataItem[1 - dimIdx];
return Math.abs(this.dataToPoint(p1)[dimIdx] - this.dataToPoint(p2)[dimIdx]);
}, this);
}
};
LeafletMapCoordSys.prototype.dataToPoint = function (data) {
//处理数据中的null值
if (data[1] === null) {
data[1] = L.CRS.EPSG3857.projection.MAX_LATITUDE;
}
data[1] = this.fixLat(data[1]);
var px = this._LeafletMap.latLngToLayerPoint([data[1], data[0]]);
var mapOffset = this._mapOffset;
return [px.x - mapOffset[0], px.y - mapOffset[1]];
};
LeafletMapCoordSys.prototype.fixLat = function (lat) {
if (lat >= 90) {
return 89.99999999999999;
}
if (lat <= -90) {
return -89.99999999999999;
}
return lat;
};
LeafletMapCoordSys.prototype.pointToData = function (pt) {
var mapOffset = this._mapOffset;
var point = this._LeafletMap.layerPointToLatLng([pt[0] + mapOffset[0], pt[1] + mapOffset[1]]);
return [point.lng, point.lat];
};
LeafletMapCoordSys.prototype.getViewRect = function () {
var size = this._LeafletMap.getSize();
return new echarts.graphic.BoundingRect(0, 0, size.x, size.y);
};
LeafletMapCoordSys.prototype.getRoamTransform = function () {
return echarts.matrix.create();
};
LeafletMapCoordSys.dimensions = LeafletMapCoordSys.prototype.dimensions;
LeafletMapCoordSys.create = function (ecModel) {
var coordSys = void 0;
ecModel.eachComponent('LeafletMap', function (leafletMapModel) {
if (!coordSys) {
coordSys = new LeafletMapCoordSys(echarts.leafletMap);
}
leafletMapModel.coordinateSystem = coordSys;
leafletMapModel.coordinateSystem.setMapOffset(leafletMapModel.__mapOffset || [0, 0]);
});
ecModel.eachSeries(function (seriesModel) {
if (!seriesModel.get('coordinateSystem') || seriesModel.get('coordinateSystem') === 'leaflet') {
if (!coordSys) {
coordSys = new LeafletMapCoordSys(echarts.leafletMap);
}
seriesModel.coordinateSystem = coordSys;
seriesModel.animation = seriesModel.animation === true;
}
});
};
var echartsLayer = function echartsLayer(echartsOptions, options) {
return new EchartsLayer(echartsOptions, options);
};
L.echartsLayer = echartsLayer;