故事背景
最近有个Power BI的项目有个功能点,颇令我头痛,说来话长,先捋一下需求:
1, 中国地图(包含港澳台)
2, 可以下钻到省市级,而且是中国->Region->Area->城市,客户需求里面,‘省’这个概念可以淡化,由excel里面的Region(例如,中区,东区)和Area(例如东区下面的‘江苏安徽’组)等把各城市关系串联起来。
3, 中国周围不能有颜色,用纯黑代替(也就是说必应地图不行)
地图选型
好了,看了这需求后,我开始上网搜索比较接近需求的地图了(以前做的地图项目,级基本都是机带必应地图就可以搞定了,所以没怎么用过其他地图的经验)。通过搜索,发现了下面几种网上常用的地图,可是,都各有优缺点。
i. 必应
优点:可以下钻,可以关联到具体城市。
缺点:Bing地图是唯一没有替代底图的背景(可以离线)
ii. 上北
优点:可以下钻,可以关联到具体城市,可离线
缺点:收费(否则有水印),省份的颜色不能根据region来定义,是根据每个省份的例如销售额,然后从浅到深显示。如果要改成和客户需求一样,还需要另外购买,而且机器也只能指定某几台。
iii. Drilldwon Choropleth
优点:可以下钻,去到具体城市
缺点:在线json文件,目前找到的文件没有中国的港澳台地区
iv. Synoptic Panel
优点:支持离线地图,有全中国地区,周边也是可以用背景色代替
缺点:不可以下钻,如果要下钻,就必须通过下拉文本框选择对应省份或者城市。
iv. shape map
要网络版power bi(黄色图标)那个才可以使用,而且不可以下钻,要自己独立选jason地图。
如果作为普通演示,问题不大。
解决方案
综合了以上考虑,最接近客户需求的,只能是’Drilldown Choropleth’这种了,这里的关于控件的前期安装,基本机制,我就不说了,因为我也是参考Power BI里面一位博主叫‘罗叔’的文章的,老实说,他这篇文章给了我很大的帮助,让我对这个控件也多了很多认识,这里要感谢一下罗叔。
https://cloud.tencent.com/developer/article/1586638
但是,然而,罗叔也是调皮了一下,留了个小作业,就是给出的Json文件里面,中国地图里面是没有了港澳台。这怎么行啊?这是原则问题啊。后来,我自己再深深思考了一下,干脆自己把Json重做,所以本文的精髓,在于分享一下我对于重做Json文件的一些心得,和遇到的困难以及解决办法。所以我相信,接下来的分享,在目前互联网上的对应中文心得,我是首创,希望对大家有更多的帮助。
接下来关于材料,我要再次提醒下两个重要的工具网站。
http://datav.aliyun.com/tools/atlas/#&lat=33.50475906922609&lng=104.2822265625&zoom=4
地图选择器,里面有中国地图,省-市-区三个级别的Json生成文件,大家可以从这里下载相应的Json文件,不过这里要提醒一下,这里下载的,是GeoJson,而PowerBI里面drilldown那个控件,要求的是TopoJson,关于这两个文件类型有什么不同,我这里就不说了,大家自行百度。(敲黑板,记住我们要用的是TopoJson)后面简称Geo和Topo
好了,对于我们手上已经下载的Geo,我们需要转换啊,于是大家要用到第二个工具了
https://mapshaper.org/
这个是可以根据输入的Geo转换成Topo。但目前发现,如果要全部省市份弄出来一个Json的话,还是需要有点耐心。因为地图选择器里面,去到省市级的话,是要逐个导出的,例如下图,我要导河南和广东。必须一次拖两个Json进去。
当然了,这个例子是为了说明具体做法而用了两个位置距离比较远的城市,大家就苦力一点把省份全部导出呗。反正我觉得地图选择器的中国地图比较良心的,还有南海诸岛,很炫。
好了,第一层(全国省),第二层(全国市)都准备好了之后,就可以把地图放上一个公网了。这里要说一下,就是drilldown控件,指支持http的URL,我还准备做一个私服把这两个文件弄上去,因为每次都要联网的话,有点慢,如果在Load过程中,出现Invalid Json File,大家千万不要慌,未必是Json文件有问题,可能是load不出而已。
接下来,我要把文件,暂时放到Github上去了,这个过程也不多说了,因为相信大部分人,都用过GitHub。
有了两张地图,其实还不够,因为这样的话,第一层和第二层,还没有关联起来的,只是形成一种‘各玩各’的状态,也就是说,你在powerbi里面,放‘省’的值时,它就出现‘省’,放‘市’的值时它就显示市,那么我们怎么关联起来呢?这里,就开始另一个比较复杂的工作量了,我们要在Json文件里,加Flag。
原生Json是没有name_connect这个值的,只有name,但如果去到‘市’那个文件,name就变成市了,没有了‘省’的名。所以,在第一层里面,我们要加上一个flag,是和第二层名字一样的,那么这个name_connect,也需要出现在第二层里。
第一层文件的截图:
第二层文件的截图:
因为默认是name会与数据源表里面的字段匹配,如果怕容易造成混乱,也可以在控件的ID里面指定:
所以接下来,如果有像我这种特殊Region,Area需求的同学,只需要在每层文件里面加上需要的一些标识,基本就可以搞定这个地图了,下面是一些截图。
当点击两个省其中一个(因为现在两个省是形成一组area),它就会去到里面的两个省共有的城市,点击之前一定要标黑下钻小箭头,不然不能下钻的。
后续:
1, 依然是回归到上面Json文件的摆放位置,考虑到Github由于是外国网站,读取的时候对网络条件还是有点要求,如果因为有时的卡顿,就会认不到,所以,如果在国内连接外网的话,我会推荐上去一个叫‘七牛云存储’的网站,这个网站是我试过的最稳定的又可以外放json文件供软件读取的网站,其他什么百度之类,全都是要验证的。
2, 如果RS服务器,想搭配到本地,IIS又在本地的话,那就更方便了。关于IIS的http文件服务器快速搭建,可以参考下面这个网站:
https://www.cnblogs.com/wuy401120html/p/9219255.html
但是,其实这样还不够,如果按照上面搭配好的网站,充其量你可以在网页里面打得开,就像这样:
但其实power bi还是不能读取的,为什么呢,因为跨域问题。所以还要在IIS里面的web.config文件里面,加上下面这句:
<httpProtocol><customHeaders><remove name="X-Powered-By" /><add name="Access-Control-Allow-Origin" value="*" /><add name="Access-Control-Allow-Headers" value="*" /><add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE" /></customHeaders></httpProtocol>
这样才能真正解决IIS本地部署的问题。
3, 关于一些控件不能与地图联动的问题,其实主要是如果下钻到最底层的话,要把下钻小箭头标白,便可以做到了。
好了,今天的分享先到这里,如果大家有什么问题,可以随时留言,我们一起交流,共同进步。