Echart - 地图散点图(服务网点图)的实现

Echart是百度开发的一个javascript图表库,可以流程运行于pc和移动端,底层依赖轻量级的 Canvas 类库 ZRender

ECharts 提供了常规的折线图,柱状图,散点图,饼图,K线图,用于统计的盒形图,用于地理数据可视化的地图,热力图,线图,用于关系数据可视化的关系图,treemap,多维数据可视化的平行坐标,还有用于 BI 的漏斗图,仪表盘,并且支持图与图之间的混搭。

支持:

多个坐标系:直角坐标系,极坐标系,地理坐标系;

移动端的优化:可以按需打包,支持移动端手指缩放;

数据的深度交互;

大量数据的展现:基于微博签到的100K条数据展现;

多维数据以及丰富的视觉效果;

动态数据和绚丽特效;

上手Echart(官网案例):

国际惯例,引入js文件,这里还是要先引入jquery。

<!DOCTYPE html>
<html>
<header>
    <meta charset="utf-8">
    <!-- 引入 ECharts 文件 -->
    <script src="echarts.min.js"></script>
</header>
</html>

准备一个容器作为画布:

<body>
    <!-- 为 ECharts 准备一个具备大小(宽高)的 DOM -->
    <div id="main" style="width: 600px;height:400px;"></div>
</body>

写js代码(这里的部分写法与highchart的写法很类似,以至于我曾经一直在highchart的api里面找echart的效果...):

<script type="text/javascript">
        // 基于准备好的dom,初始化echarts实例
        var myChart = echarts.init(document.getElementById(‘main‘));
        // 指定图表的配置项和数据
        var option = {
            //标题
            title: {
                text: ‘ECharts 入门示例‘
            },
            tooltip: {},
            //图例
            legend: {
                data:[‘销量‘]
            },
            //横坐标
            xAxis: {
                data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
            },
            //纵坐标
            yAxis: {},
            //数据列
            series: [{
                name: ‘销量‘,
                type: ‘bar‘,
                data: [5, 20, 36, 10, 10, 20]
            }]
        };
        // 使用刚指定的配置项和数据显示图表。
        myChart.setOption(option);
    </script>

下面还是通过自己的一个例子来简单说明一下:写法可能不止一种。

数据是之前通过jsoup解析中通网页,将地址存到数据库里,然后根据地址查询百度地图api,获得经纬度信息再update到数据库里。(过程这里贴不下,以后整理一下再贴出来)

数据获取.......

List<Loc2> dat = testChartService.selectLoc();
        Map all=new HashMap();
        for(Loc2 loc2:dat){
            List list = new ArrayList();
            list.add(loc2.getLongitude());
            list.add(loc2.getLatitude());
            all.put(loc2.getAddress(),list);
        }
        System.out.println(all.toString());
        writeJson(response, all);

// 以json格式输出
    public void writeJson(HttpServletResponse response, Object obj) {
        PrintWriter writer = null;
        try {
            response.setContentType("application/json" + ";charset=utf-8");
            writer = response.getWriter();

            Object jsonObject = null;
            if (obj instanceof List) {
                jsonObject = JSONArray.toJSON(obj);
            } else {
                jsonObject = JSONObject.toJSON(obj);
            }
            writer.print(jsonObject.toString());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (writer != null) {
                writer.close();
            }
        }
    }
//这是数据格式:
loc:{
白玉路346号=[121.423744, 31.23829],
新民路城南工商所对面巷子( 南苑菜市旁边 )=[106.577573, 31.082472],
长江路26号,苏展工业坊b栋1层=[118.328064, 33.949859]
}
//数据是之前做的,此处只是给个例子,可参考例子,写自己的地址和经纬度。
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>散点图</title>
    <!-- 先引入jquery,再引入echart -->
    <script src="../js/jquery-2.1.4.min.js"></script>
    <script src="../js/bootstrap.js"></script>
    <script src="../js/echart/echarts.min.js"></script>
    <script type="text/javascript">
        $(function () {
            //通过ajax请求来获取后台数据
            $.ajax({
                type: ‘post‘,
                //bashPath是jsp里面,获取的项目路径
                url: ‘<%=basePath%>loc‘,
                async: true,
                cache: false,
                dataType: ‘json‘,
                success: function (data) {
                    //把数据转化一下
                    data=eval(data);
                    //res是数据,要传到api里面的
                    var res = [];
                    //官方案例中,每个点还有一个value值,这里不需要,所以要改造一下。这里参考案例生成的数据格式,自己重新封装了一下
                    for(var key in data)
                    {
                        console.log(key+"");
                        res.push({
                            name: key+"",
                            value: data[key].concat(1)   //这里concat后面的值就是value,这里统一设置成1。
                        });
                    }
                    //这里需要下载中国地图的json文件,因为要创建地图需要初始化地图,至于怎么初始化的,json里面的数据也看不懂。
                    $.get(‘../js/echart/china.json‘, function (chinaJson) {
                        echarts.registerMap(‘china‘, chinaJson);  //注册地图名
                        var chart = echarts.init(document.getElementById(‘main‘));   //这里是主体的初始化echart方法,与上面的简单demo类似。
                        chart.setOption({
                            backgroundColor: ‘#404a59‘,
                            title: {
                                text: ‘中通快递全国网点分布‘,
                                subtext: ‘data from 中通快递‘,
                                sublink: ‘http://www.zto.com/‘,
                                x: ‘center‘,
                                textStyle: {
                                    color: ‘#fff‘
                                }
                            },
                            legend: {
                                orient: ‘vertical‘,
                                y: ‘bottom‘,
                                x: ‘right‘,
                                data: [‘服务网点‘],
                                textStyle: {
                                    color: ‘#fff‘
                                }
                            },
                            //地图坐标系必备的配置,具体的含义可以参考api,索性都是中文的,没有什么阅读障碍。
                            geo: {
                                silent:false,
                                map: ‘china‘,
                                label: {
                                    emphasis: {
                                        show: false
                                    }
                                },
                                itemStyle: {
                                    hoverAnimation:false,
                                    normal: {
                                        areaColor: ‘#323c48‘,
                                        borderColor: ‘#000‘
                                    },
                                    emphasis: {
                                        areaColor: ‘#2a333d‘,
                                        opacity:0
                                    }
                                }
                            },
                            series: [
                                {
                                    name: ‘服务网点‘,
                                    type: ‘scatter‘,
                                    coordinateSystem: ‘geo‘,    //参照系:之前设置的geo。
                                    //这里是api数据接受的的地方
                                    data:res,
                                    symbolSize: 3,    //散点半径
                                    label: {
                                        normal: {
                                            show: false
                                        },
                                        emphasis: {
                                            show: false
                                        }
                                    },
                                    hoverAnimation:false,
                                    silent:false,
                                    animation:false,
                                    z:3
                                }
                            ]
                        });
                    });
                }
            });
        });
    </script>
</head>
<body>
<!--  长宽必须指定,否则可能无法显示图像 -->
<div id="main" class="main" style="width: 1000px;height:800px;">
</div>
</body>
</html>

echart内部是高度封装的了,配置起来非常简单,地图这样看起来很复杂的东西配置也不是很困难。

遇到过一个小问题,就是底图和数据点都有鼠标hover效果,导致图上常常闪烁有时是地图的hover有时是点的hover,尤其是比较密集的地区。

后来通过opacity 属性为0,使hover不显示任何特效解决。(其实我配置了许多的内容,包括禁用鼠标事件/禁用动画/设置z值等,不知道具体是哪个生效了,但是问题确实解决了。)

本案例参考了官网中的散点图案例,但是去掉了许多内容,图没有美化过,只是作为一个demo案例而已。

附上官网例子,对比看看api接受的是什么格式的数据,我们就拼什么格式的数据。

var geoCoordMap = {
    "海门":[121.15,31.89],
    "鄂尔多斯":[109.781327,39.608266],
    "招远":[120.38,37.35],
    "舟山":[122.207216,29.985295],
    "齐齐哈尔":[123.97,47.33],
    "盐城":[120.13,33.38],
    "赤峰":[118.87,42.28],
    "青岛":[120.33,36.07],
    "乳山":[121.52,36.89],
    "金昌":[102.188043,38.520089],
    "泉州":[118.58,24.93],
    "莱西":[120.53,36.86],
    "日照":[119.46,35.42],
    "胶南":[119.97,35.88],
    "南通":[121.05,32.08],
    "拉萨":[91.11,29.97]
};
//这里是生成series的数据,将经纬度和value值映射起来,我根据这个方法,最后自己写了一个方法,生成同样格式的数据,实现了对value的屏蔽。
var convertData = function (data) {
    var res = [];
    for (var i = 0; i < data.length; i++) {
        var geoCoord = geoCoordMap[data[i].name];
        if (geoCoord) {
            res.push({
                name: data[i].name,
                value: geoCoord.concat(data[i].value)
            });
        }
    }
    return res;
};
option = {
    backgroundColor: ‘#404a59‘,
    title: {
        text: ‘全国主要城市空气质量‘,
        subtext: ‘data from PM25.in‘,
        sublink: ‘http://www.pm25.in‘,
        x:‘center‘,
        textStyle: {
            color: ‘#fff‘
        }
    },
    tooltip: {
        trigger: ‘item‘,
        formatter: function (params) {
            return params.name + ‘ : ‘ + params.value[2];
        }
    },
    legend: {
        orient: ‘vertical‘,
        y: ‘bottom‘,
        x:‘right‘,
        data:[‘pm2.5‘],
        textStyle: {
            color: ‘#fff‘
        }
    },
    visualMap: {
        min: 0,
        max: 200,
        calculable: true,
        inRange: {
            color: [‘#50a3ba‘, ‘#eac736‘, ‘#d94e5d‘]
        },
        textStyle: {
            color: ‘#fff‘
        }
    },
    geo: {
        map: ‘china‘,
        label: {
            emphasis: {
                show: false
            }
        },
        itemStyle: {
            normal: {
                areaColor: ‘#323c48‘,
                borderColor: ‘#111‘
            },
            emphasis: {
                areaColor: ‘#2a333d‘
            }
        }
    },
    series: [
        {
            name: ‘pm2.5‘,
            type: ‘scatter‘,
            coordinateSystem: ‘geo‘,
            data: convertData([
                {name: "海门", value: 9},
                {name: "鄂尔多斯", value: 12},
                {name: "招远", value: 12},
                {name: "舟山", value: 12},
                {name: "齐齐哈尔", value: 14},
                {name: "盐城", value: 15},
                {name: "赤峰", value: 16},
                {name: "青岛", value: 18},
                {name: "乳山", value: 18},
                {name: "金昌", value: 19},
                {name: "泉州", value: 21},
                {name: "莱西", value: 21},
                {name: "日照", value: 21},
                {name: "胶南", value: 22},
                {name: "南通", value: 23},
                {name: "拉萨", value: 24}
            ]),
            symbolSize: 12,
            label: {
                normal: {
                    show: false
                },
                emphasis: {
                    show: false
                }
            },
            itemStyle: {
                emphasis: {
                    borderColor: ‘#fff‘,
                    borderWidth: 1
                }
            }
        }
    ]
}

参考资料:

http://echarts.baidu.com/option.html#polar

http://echarts.baidu.com/api.html#echarts

时间: 2024-07-28 17:18:44

Echart - 地图散点图(服务网点图)的实现的相关文章

echart地图+散点图表,点击散点触发BootstrapDialog弹框

echart地图和散点图结合,点击散点触发BootstrapDialog弹框. 需要引入文件jquery.bootstrap.bootstrap-dialog.min.js.echarts.min.js.echart地图用的china.js function repCityStrategy(rsData){//触发echart地图的,rsData是传给echart的数据 var mapType = $('#selectCityPrev').find('option:selected').val(

【高德地图API】从零开始学高德JS API(一)地图展现——仙剑地图,麻点图,街景,室内图

下面是基于KWIC 的关键字匹配算法(管道+过滤器模式下实现) 关键部分的管道+过滤器 软件体系下的实现, 在很多的关键字搜索平台都使用了这一 循环移位+排序输出的 关键字匹配算法: 具体需求如下: 1.使用管道-过滤器风格: 每个过滤器处理数据,然后将结果送至下一个过滤器,.要有数据传入,过滤器即开始工作.过滤器之间的数据共享被严格限制在管道传输 四个过滤器: 输入(Input filter): 从数据源读取输入文件,解析格式,将行写入输出管道 移位(CircularShifter filte

Echart地图城市用json返回格式

用Echarts中,使用地图的series部分中展示城市如果用json返回数据的话,js不能直接用字符串使用.需要处理一下. php中的部分 json返回的数据 js中获取json信息 用ajax实现调用 因为Echarts图表map中的展示城市需要的格式是[{name:'北京'},{name:'天津'}] 先是数组然后是对象形式的,但是js中不支持字符串格式的数据,所以我们就用js中的array()和Object()处理一下.最后push()一下. 然后我们console.log一下 如果出现

echart 地图

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getS

EChart系列:在echart3中使用百度地图扩展之后,如何获取到百度地图对象

最近做项目想要在百度地图上叠加显示echart的散点图,然后根据地图的缩放等级和区域范围要显示不同的散点图,这中间折腾了好久.功能要求包括: (1)底图使用百度地图: (2)可以在地图上叠加显示echart的散点图: (3)鼠标移动到散点图上面之后,可以浮动显示相关信息: (4)能够获取当前显示区域地图的经纬度范围: (5)能够响应地图的拖拽和缩放事件: 这里有两种选择: 1. 使用echart2的百度地图扩展,1, 3, 4, 5 都可以满足,就是2满足不了,他的一个series的所有图标样式

百度地图API和高德地图API资料集锦

[高德地图API]从零开始学高德JS API(五)路线规划--驾车|公交|步行 [高德地图API]从零开始学高德JS API(四)搜索服务--POI搜索|自动完成|输入提示|行政区域|交叉路口|自有数据检索 [高德地图API]从零开始学高德JS API(三)覆盖物--标注|折线|多边形|信息窗口|聚合marker|麻点图|图片覆盖物 [高德地图API]从零开始学高德JS API(二)地图控件与插件--测距.圆形编辑器.鼠标工具.地图类型切换.鹰眼鱼骨 [高德地图API]从零开始学高德JS API

echarts 专题

todo:缩放 5 分钟上手 ECharts 获取 ECharts 你可以通过以下几种方式获取 ECharts. 从官网下载界面选择你需要的版本下载,根据开发者功能和体积上的需求,我们提供了不同打包的下载,如果你在体积上没有要求,可以直接下载完整版本.开发环境建议下载源代码版本,包含了常见的错误提示和警告. 在 ECharts 的 GitHub 上下载最新的 release 版本,解压出来的文件夹里的 dist 目录里可以找到最新版本的 echarts 库. 通过 npm 获取 echarts,

Minitab软件是现代质量管理统计的领先者,全球六西格玛实施的共同语言,以无可比拟的强大功能和简易的可视化操作深受广大质量学者和统计专家的青睐。

MINITAB 功能菜单包括: 基础和高级统计工具: 假设检验 (参数检验和非参数检验) 回归分析(一元回归和多元回归.线性回归和非线性回归) 方差分析(单因子.多因子.一般线性模型等) 时间序列分析 图表(散点图.点图.矩阵图.直方图.茎叶图.箱线图.概率图.概率分布图.边际图.矩阵图.单值图.饼图.区间图.Pareto.Fishbone.运行图等) 蒙特卡罗模拟和仿真 分布分析 灵活的数据导入.导出和时时监控 SPC (Statistical Process Control -统计过程控制)

处理对象中的数据

在用echart地图时,看到地图坐标数据,数据的格式是这样的{"徐州":[lng,lat],....},一时不知道咋处理,数组的话还有点头绪,一看对象顿时懵了.不说废话,先上代码 var person ={}; var strArr=["a","b"]; person['abc'] = "aasdf"; for (var index = 0; index <= strArr.length; index++) { pers