微软BI Datazen之地图显示中文乱码

浏览: 3227

前言

前段时间在用Datazen做一个项目,深深的体会到什么叫十步一坑五步一雷,什么叫做孤立无援。不过还好一步一步的挺过来了。而现在新的需求又来了,限时上地图!Oh My Gad!!!近一段时间整个小Team都在Datazen地图的龙潭虎穴中苦苦挣扎。截止到现在发贴仍有一个坑在静静的等着我去踩……

在Datazen的官方文档中是这样描述的:Datazen地理地图被称为ESRI形状文件的格式定义。最初由一家私营公司设计的,这是现在在GIS中的很大一部分用于广泛的半开放的格式。Datazen要求地图时要按照这种格式提供两个文件:一个.SHP几何形状文件和一个.dbf的元数据的文件。要求两个文件的名称必须一致。

制作shape地图文件,可以使用ArcGIS、MAPublisher plug-in for Adobe Illustrator、QuantumGIS (free)、Manco ShapeFile Editor等。上述几个工具,QGIS是免费的。

自制地图

Datazen虽然内置了很多的地图,但是对于我们来说没有丁点的意义。没有现成的自然只能自己造了,于是从网上各种的找资料。于是找到了这样一个救命稻草:

http://www.barmartland.com/creating-a-custom-map-for-datazen/

制作过程虽然业余,制作效果虽然粗糙,至少是让我们这些地图门外汉看到了希望。跟着一路操作下来,上传到Datazen CustomMap居然也可以出效果,开兴坏了。不过开心的确实有点早。

文件太大

由于我的需求里需要很多的点,所以按照上述的方式,导出来的Shap文件特别的大,而Datazen对地图文件的大小是有限制的,既然勉强可以上传,文件太大的时候加载也会特别的慢。后来工作需要还是联系了第三方的地图厂商,果然还是行家。同样的点数,Shp文件1K,Dbf4K,这恐怕就是要各司其职的原因吧。跨界真的没有那么容易。

乱码

阳光总在风雨后,看来我经历的风雨还是太少。当觉得万事具备的时候,开始套用正式数据做个演示Demo,猛然间发现地图DBF设置中文名称的时候,导到地图是居然是乱码。作为有多年开发经验的程序员来说,这都不是事,肯定是编码问题呗。估计不是UTF-8呗。于是在QGIS里迅速的去找能改编码的地方。然后发布测试。再改再发布测试。几次之后,觉得没有那么简单。在网上查了好些方案,都没有用。最后有一个说,西方地图通常会选择ISO8559-1作为地图数据的编码,而ISO8559-1本身并不支持中文。我觉得这个有道理,因为其他的我试不出来嘛……后来技术群里有人说这是Datazen的一个CASE,呵呵……

尝试

既然地图文件上解决不了乱码的问题,只能是想其他招了。比如在绑定数据的时候,比如在前端生成数据的时候。先是想,Datazen能不能像下拉一样设置key和value,结论是我高估它了。地图数据的key作为和数据关联的主键,同时也作为了显示时的标题。这也可能是人家西方不存在这种code和name影射的事情。接着就是想到了动JS文件,因为动JS比动DLL可行性要高。JS替换并不影响什么,DLL肯定是有数字签名之类的限制的。于是找遍了Datazen安装目录下的JS,然而并没有找到能注入自己业务逻辑的地方,恨透这个webviewer.js了。最后,被逼无奈选择了反编译DLL去看逻辑,只恨自己学艺不精,看了半宿,硬是没搞明白这个js文件是怎么生成出来的。

方案

最后在同事的帮忙下找到了地图鼠标悬停弹出提示层的JS事件。但是由于没有找到源文件,不能直接修改原逻辑。只能是采用JS覆盖的形式,替换原有的逻辑。我们的方案是在这个弹层事件中,捕获要显示的值,即code。然后通过一个code和name影射的json文件来转换成name值,替换render到页面上的html值。

  1. 将附件中的popuprevise.js文件复制到Datazen安装目录下Viewer>Content>Scripts下。
  2. 在Scripts目录下,找到Telemetry文件夹,打开该文件夹找到telemetry.min.js文件。
  3. 打开telemetry.min.js文件,并在首行添加如下代码:
if(location.pathname == "viewer/dashboard"){
var script = document.createElement('script');
script.src = 'content/scripts/popuprevise.js';
document.body.appendChild(script);
}


推荐 7
本文由 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

4 个评论

很好的整理,现在datazen用的好像不多了
嗯 被微软当后儿子养了,估计得夭折
大神,这句话少了些东西 if(location.pathname == "iewer/dashboard"){ 应该是 if(location.pathname == "/viewer/dashboard"){
多谢提醒

要回复文章请先登录注册