美文网首页web数据可视化
基于Echarts的超高自定义地图(设计稿转地图)

基于Echarts的超高自定义地图(设计稿转地图)

作者: 阿秃 | 来源:发表于2019-11-28 19:30 被阅读0次

    需求描述

    我想自己做一个室内地图但是并没有地图数据(Geojson),因为各大平台只提供了像全国地图、世界地图这种通用地图数据 。这篇文章告诉你怎么将一个矢量图纸转成地图数据,并结合echarts的线图、点图、关系图做出丰富的地图图表!

    最终效果

    模拟商场人流效果.gif
    这里只为介绍如何实现效果,echarts、highcharts、G2官网都有提供丰富的图表

    底图准备

    • 通常情况下设计师会将绘制好的地图给开发员,这里要求设计稿必须为矢量图,有一点需要注意的是为了方便后期开发,作图的时候需要将每个图形和你需要表示的东西关联起来,譬如在我的业务中,这里的每一个图形代表一个商铺,所以在下图左侧可以看到我将图形命名为商铺名称+位置。


      设计稿.png
    • 接着我将整个图导出来,格式选择SVG;来看一下导出的文件;可以看到我给图形的命名就是这个图形的id,这样我们就可以在生成geojson的时候用图形的id来标识图形。


      导出svg图.png

    图形转数据(SVG转Geojson)

    网络上有一些svgtogeojson的库,经过我的挑选之后,找到一个非常好用的但仍然不符合我需求的库,地址是这个 https://github.com/Phrogz/svg2geojson ,这个库可以说相当不错了,唯一的缺点是,它不会读取图形的id信息,它导出的geojson不能区分每一个图形,所以在它的基础上做了修改,这个修改是将id里的信息检索出来放在geojson的properties属性中,修改后的代码地址:https://github.com/lastcaveman/svg2geojson

    • 根据我的业务修改的主要代码如下:将商铺的名称和位置检索出来
    image.png
    • 你可以根据自己的需要在原作者的基础上做修改
    • 具体的导出方法 原作者的github上已经说了

    将geojson导出,来看一下数据格式:


    image.png

    它是这样的json数据,properties里是我们想要的标识图形的属性,coordinates存放的是构成图形的点的坐标集。

    绘制地图

    以上是数据准备,最后效果的代码地址在这里:https://github.com/ZhenhuaChen/customizeMap/blob/master/mall_map.html

    图表库可以选择G2 也可以选择echarts,这里介绍Echarts。

    $.getJSON('http://testcdn.zhimatech.com/map.json',function(value) {
        echarts.registerMap('mallMap',value);
    })
    

    echarts 提供自定义地图的api,registerMap('地图名称',地图数据),这里为了方便我读取数据我将geojson的后缀改为json,使用上是一样的。
    接下来就是地图的样式部分,我们知道echarts中绘制地图可以选择geo也可以选择series的type为map,如果你要在地图上绘制别的图表,譬如线图、点图那么这里你需要将地图以Echarts中的geo方式呈现

     geo: {
            map: 'mallMap',
            roam:true,
            ...
        },
    

    这样地图就有了


    image.png

    画图表

    如果你使用echarts绘制线图,还需要知道每个图形的中心点;这里就需要借助G2的Dataset:

     // value为地图的json数据
    var shop_center_point_arr  = {}
     var worldMap = ds.createView().source(value, {
            type: 'GeoJSON'
        }).transform({
            type: 'map',
            callback: function callback(row) {
                let t_key = row.name
                let obj = {};
                shop_center_point_arr[t_key] = [row.centroidX,row.centroidY]
                return row;
            }
        })
    // shop_center_point_arr:{'汉堡王',[x,y]}
    

    shop_center_point_arr 就存储了图形的名称和对应中心点坐标
    这时候就可以绘制线图了(lines) ,具体绘制方法可以参考echarts官网,或者去https://github.com/ZhenhuaChen/customizeMap/blob/master/mall_map.html查看我写的小示例!

    完成地图的绘制后echarts官网上所有有关地图的图表就都可以搬到你自己的地图上实现啦!帮到你的话点赞吧!

    相关文章

      网友评论

        本文标题:基于Echarts的超高自定义地图(设计稿转地图)

        本文链接:https://www.haomeiwen.com/subject/rxrewctx.html