话不多说,看设计图就知道,需要实现地图打点,并且实时弹出警情信息弹框,看echarts API都知道地图打点很容易实现,问题是实现多个弹框,本来准备使用label加载动态dom标签实现,看API发现label的formatter并不支持html标签,当然,自带的rich也可以实现上图样式,但是关键label没法点击,于是就想使用toolip实现,然后发现toolip只能实现一个弹框,而且位置也没法准确定位到maker上。
经过上边的思考,我突发奇想,把地理坐标转换成屏幕坐标,再动态创建标签定位过去怎么样,事实证明,是可行,于是开始我们的搬砖之路。
多余的话就不说了,这里的重点主要是实现echarts地理坐标转换成屏幕坐标,这里的屏幕的坐标是从地图的父元素开始计算的。
经纬度坐标与屏幕坐标转换:
convertMain(Lng,lat){
let getModel = this.myChart.getModel().getSeries()[1];
let seriesModel = this.myChart.getModel().getSeriesByIndex(0)
let coordSys = seriesModel.coordinateSystem;
let point = coordSys.dataToPoint([Lng, lat]);
return point;
},
顺便奉上个echarts屏幕自适应的函数:
FontSize(res) {
let docEl = document.documentElement,
clientWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
if (!clientWidth) return;
let fontSize = 100 * (clientWidth / 1920);
return res * fontSize;
},
使用方法:
this.option.series[0].label.normal.fontSize = this.FontSize(0.1);
这里传值需要除以100;字号是10就写
this.FontSize(0.1);
亲自测试这里的图表(适应所有图表,谁用谁知道)屏幕自适应兼容到800*600问题不大。
另外上述的设计弹框直接自己html写好就可以,然后通过获取的屏幕坐标相对父元素进行定位即可。
事实证明,位置对应还是相当准的。当然,如果各位道友有更好的方法,也可以一起分享一下。