今天应用户要求,要调增以前echarts做的一个地图专题图,把默认文字标注改为数据数字标注,然后设置一下样式。本来这是一个很简单的事情,至少我以为是这样的,毕竟echarts的接口都很规范,只要添加一下就可以了,而且我又深入地看了一下文档,学会了采用直接setOption的方式更新地图设置项。不过,不如意事常八九,内容很好改,字体颜色和大小也都很顺利,但是遇到了边线和颜色的时候,发现死活也改不了。找了找官方例子,竟然没有在geo设置的例子,自己写一个demo又觉得麻烦。开始怀疑是不是bug,于是下载定制的4.x版本,完全版和源码版本,发现样式倒是都顺利了,但内容(通过label的formatter进行定制)又不变了。我快要疯了,原本计划的事情只好往后推。样式设置那部分是在没有头绪,formatter这个还算简单,于是用4.x的源码版本开始跟踪调试,跟踪到src/coord/geo/GeoModel.js的149行
getFormattedLabel: function (name, status) { var regionModel = this.getRegionModel(name); var formatter = regionModel.get('label.' + status + '.formatter'); var params = { name: name }; if (typeof formatter === 'function') { params.status = status; return formatter(params); } else if (typeof formatter === 'string') { return formatter.replace('{a}', name != null ? name : ''); } },
发现var formatter这一行写得很硬,在3.x版本下,配置属性geo.label下分为normal和emphasis,进行分别的样式设置,到了4.x下,normal被提上去了一级,跟在了lable下,而emphasis被整体提了一级,合并了itemStyle和label。但这里的代码显示,在读取的时候仍旧带着这个status,最终的结果只能是formatter不会被找到。尽管get方法后面带有参数可以访问父对象的属性,但因为这里的字符串拼接硬编码导致根本找不到formatter。
我摘这里做了一点修改:
var formatter = regionModel.get('label.' + status + '.formatter')|| regionModel.get('label.formatter',true);
当找不到的时候,就去找这个没有状态的名称(没办法,即使设置项是按照旧的方式给的,在其合并选项的时候也会按照新的结构赋值,但读取方式没哟更新),然后,我在每个region中分别加入(其实真没必要,因为这个回调还获取不到数据,得用全局变量)这个选项属性,好在区域不多,速度还可以忍受。
问题解决了,不打算深究是因为太过庞大发展过快来不及测试还是因为我下载并非稳定版本。我想后面要是再实现这类功能,我可能会用openlayers+geoserver+sld。sld貌似很强大。
话说有人知道svg怎么存emf么?