116 lines
3.1 KiB
JavaScript
116 lines
3.1 KiB
JavaScript
/**
|
||
* T.D3Overlay借助D3.js强大的可视化功能,扩展天地图已有的覆盖物类 T.Overlay,
|
||
* 使天地图表达的可视化信息,不仅仅只有地理数据展示,也可以结合更丰富的图形(柱图,饼图)来描述、展现数据。
|
||
* 注:chrome、safari、IE9及以上浏览器。
|
||
*/
|
||
|
||
const d3= window.d3
|
||
T.D3Overlay = T.Overlay.extend({
|
||
|
||
initialize: function (init, redraw, options) {
|
||
this.uid = new Date().getTime();
|
||
this.init = init;
|
||
this.redraw = redraw;
|
||
if (options)
|
||
this.options = options;
|
||
try {
|
||
d3.select("head") .append("style").attr("type", "text/css")
|
||
} catch (error) {
|
||
console.log(error);
|
||
}
|
||
|
||
},
|
||
|
||
/**
|
||
* 地图缩放触发的函数
|
||
* @private
|
||
*/
|
||
_zoomChange: function () {
|
||
if (!this.redraw)
|
||
this.init(this.selection, this.transform);
|
||
else
|
||
this.redraw(this.selection, this.transform);
|
||
},
|
||
|
||
onAdd: function (map) {
|
||
this.map = map;
|
||
var self = this;
|
||
//增加svg容器
|
||
this._svg = new T.SVG();
|
||
map.addLayer(this._svg);
|
||
//根节点
|
||
this._rootGroup = d3.select(this._svg._rootGroup).classed("d3-overlay", true);
|
||
this.selection = this._rootGroup;
|
||
//一些转换参数
|
||
this.transform = {
|
||
//坐标转容器像素坐标。
|
||
LngLatToD3Point: function (a, b) {
|
||
var _lnglat = a instanceof T.LngLat ? a : new T.LngLat(a, b);
|
||
var point = self.map.lngLatToLayerPoint(_lnglat);
|
||
this.stream.point(point.x, point.y);
|
||
},
|
||
//换算一米转多少像素
|
||
unitsPerMeter: function () {
|
||
return 256 * Math.pow(2, map.getZoom()) / 40075017
|
||
},
|
||
map: self.map,
|
||
layer: self
|
||
|
||
};
|
||
this.transform.pathFromGeojson =
|
||
// d3.geo.path().projection(d3.geo.transform({
|
||
// point: this.transform.LngLatToD3Point
|
||
// }));
|
||
//D3绘制
|
||
this.init(this.selection, this.transform);
|
||
//用于确定坐标的
|
||
if (this.redraw)
|
||
this.redraw(this.selection, this.transform);
|
||
|
||
map.addEventListener("zoomend", this._zoomChange, this);
|
||
|
||
|
||
},
|
||
|
||
|
||
onRemove: function (map) {
|
||
map.removeEventListener("zoomend", this._zoomChange, this);
|
||
this._rootGroup.remove();
|
||
map.removeOverLay(this._svg)
|
||
},
|
||
|
||
/**
|
||
* 图层移动到最上层
|
||
* @returns {T.D3Overlay}
|
||
*/
|
||
bringToFront: function () {
|
||
if (this._svg && this._svg._rootGroup) {
|
||
var el = this._svg._rootGroup.parentNode;
|
||
el.parentNode.appendChild(el);
|
||
|
||
}
|
||
return this;
|
||
},
|
||
|
||
|
||
/**
|
||
* 图层移动到最底层。
|
||
* @returns {T.D3Overlay}
|
||
*/
|
||
bringToBack: function () {
|
||
if (this._svg && this._svg._rootGroup) {
|
||
var el = this._svg._rootGroup.parentNode;
|
||
var parent = el.parentNode;
|
||
parent.insertBefore(el, parent.firstChild);
|
||
|
||
}
|
||
return this;
|
||
},
|
||
|
||
|
||
})
|
||
;
|
||
|
||
|
||
|