当前位置:   article > 正文

基于大数据的房价分析--3.echart+百度地图实现数据可视化_百度地图开发聚合房子价格

百度地图开发聚合房子价格

要实现的是在百度地图中画出房屋散点图,能进行区域选择,动态刷新显示该区域的房价数据雷达图,具体效果如下
这里写图片描述

1.在echarts中集成百度地图

要使用百度地图,必须要有开发者AK和百度地图js包

<script src="http://api.map.baidu.com/api?v=2.0&ak=你的AK"></script>
<script src="/Plug-in/echarts-master/dist/extension/bmap.min.js"></script>
  • 1
  • 2
引入之后在option中加入如下设置
  • 1
bmap: {
       // 百度地图中心经纬度
       center: [114.314129, 30.550339],
       // 百度地图缩放(即地图范围)
       zoom: 12,
       // 是否开启拖拽缩放,可以只设置 'scale(只能缩放)' 或者 'move(只能移动)'
       roam: 'true',
       // 百度地图的自定义样式
       mapStyle: {
            'styleJson': [
                        {
                            'featureType': 'water',
                            'elementType': 'all',
                            'stylers': {
                                'color': '#031628'
                            }
                        },
                        {
                            'featureType': 'land',
                            'elementType': 'geometry',
                            'stylers': {
                                'color': '#000102'
                            }
                        },
                        {
                            'featureType': 'highway',
                            'elementType': 'all',
                            'stylers': {
                                'visibility': 'off'
                            }
                        },
                        {
                            'featureType': 'arterial',
                            'elementType': 'geometry.fill',
                            'stylers': {
                                'color': '#000000'
                            }
                        },
                        {
                            'featureType': 'arterial',
                            'elementType': 'geometry.stroke',
                            'stylers': {
                                'color': '#0b3d51'
                            }
                        },
                        {
                            'featureType': 'local',
                            'elementType': 'geometry',
                            'stylers': {
                                'color': '#000000'
                            }
                        },
                        {
                            'featureType': 'railway',
                            'elementType': 'geometry.fill',
                            'stylers': {
                                'color': '#000000'
                            }
                        },
                        {
                            'featureType': 'railway',
                            'elementType': 'geometry.stroke',
                            'stylers': {
                                'color': '#08304b'
                            }
                        },
                        {
                            'featureType': 'subway',
                            'elementType': 'geometry',
                            'stylers': {
                                'lightness': -70
                            }
                        },
                        {
                            'featureType': 'building',
                            'elementType': 'geometry.fill',
                            'stylers': {
                                'color': '#000000'
                            }
                        },
                        {
                            'featureType': 'all',
                            'elementType': 'labels.text.fill',
                            'stylers': {
                                'color': '#857f7f'
                            }
                        },
                        {
                            'featureType': 'all',
                            'elementType': 'labels.text.stroke',
                            'stylers': {
                                'color': '#000000'
                            }
                        },
                        {
                            'featureType': 'building',
                            'elementType': 'geometry',
                            'stylers': {
                                'color': '#022338'
                            }
                        },
                        {
                            'featureType': 'green',
                            'elementType': 'geometry',
                            'stylers': {
                                'color': '#062032'
                            }
                        },
                        {
                            'featureType': 'boundary',
                            'elementType': 'all',
                            'stylers': {
                                'color': '#465b6c'
                            }
                        },
                        {
                            'featureType': 'manmade',
                            'elementType': 'all',
                            'stylers': {
                                'color': '#022338'
                            }
                        },
                        {
                            'featureType': 'label',
                            'elementType': 'all',
                            'stylers': {
                                'visibility': 'on'
                            }
                        }
                    ]        
       ,
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
在散点图的series中指定坐标系为百度地图
  • 1
coordinateSystem: 'bmap',
  • 1
2.区域刷选
1.添加区域刷选工具栏
 在option中加入如下设置
  • 1
brush: {
    //工具栏外观
   brushStyle: {
       borderWidth: 2,
       color: 'rgba(0,0,0,0.2)',
       borderColor: 'green',
       },
    //设定刷选类型,停止后刷选还是一定频率刷选
   throttleType: 'debounce',
    //停止多久后刷选
   throttleDelay: 300,
    //未被选择的区域外观
   outOfBrush: {

   }
},
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
2.刷选函数
//动态渲染雷达图
function renderBrushed(params){
            this.setOption({
                //进行区域选择时,关闭百度地图的移动选项,否则会冲突
                bmap: {
                    roam: 'scale'
                }
            })
            var mainSeries = params.batch[0].selected[0];
            var allSum = 0;
            var count = 0;
            var max = 0;
            var min = null;
            for (var i = 0; i < mainSeries.dataIndex.length; i++) {
                var rawIndex = mainSeries.dataIndex[i];
                var dataItem = data[rawIndex];
                val = dataItem.value[2];
                allSum += val
                if(!min||val < min){
                    min = val;
                }
                if(val > max){
                    max = val;
                }
                count += 1;
            }
            var unitPrice = allSum / count;
            this.setOption({
                series:{
                    title:'区域雷达图',
                    //此处id为series中雷达图id
                    id:"radarBrush",
                    data:[[unitPrice,max,min]]
                }
            })
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
3.绑定事件
mapChart.on('brushselected',renderBrushed);
  • 1
3.刷选完毕后重置百度地图移动
在刷选时必须关闭百度地图的移动功能,否则刷选框会无法移动,刷选完毕后通过自定义一个开启移动按钮来开启百度地图移动
  • 1
toolbox: {
      feature: {
         myTool1: {
             show: true,
             title:"开启百度地图移动",
             icon: "image://http://localhost:8000/Image/icon/移动2.png",
             onclick: function (a) {
                   mapChart.setOption({
                   //手动开启百度地图的移动选项
                         bmap: {
                             roam: 'true'
                         }
                   })
              }
         }
},
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
4.优化
以上的设置在一般情况下已经能用了,但是在数据量非常大的时候,页面会非常卡顿,有两种方法可以优化这个问题
  • 1
  • 1.使用echarts-gl加速,将series中图表type改为scatterGL,但是目前区域刷选不支持scatterGL,开启后无法进行数据刷选,而且很坑的就是目前百度官网上给的echarts版本与给出的echartsgl版本是不匹配的,必须选择历史版本的ecahrts-gl,点这里下载

  • 2.在series中加入large:True选项,然后使用largeThreshold属性设定阈值,在达到阈值时开启绘制优化,这种方式也有个问题就是开启绘制优化后无法为每个点单独设置样式,也就是说每个点的颜色大小都会变得相同,visualMap会失效

    源码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>坐标转换</title>
    <style>
        html, body, #main {
            width: 100%;
            height: 100%;
            margin: 0;
        }
    </style>
</head>
<body>
<div id="main"></div>
<script src="/Plug-in/jquery/jquery-3.2.1.js"></script>
<script src="http://api.map.baidu.com/api?v=2.0&ak=xxxxxxxx"></script>
<script src="/Plug-in/echart/echarts.js"></script>
<script src="http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js"></script>
<script src="/Plug-in/echarts-master/dist/extension/bmap.min.js"></script>
<script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/map/js/china.js"></script>
<script>
    $(function() {
        //雷达图渲染
        function renderBrushed(params){
            this.setOption({
                //进行区域选择时,关闭百度地图的移动选项
                bmap: {
                    roam: 'scale'
                }
            })
            var mainSeries = params.batch[0].selected[0];
            var allSum = 0;
            var count = 0;
            var max = 0;
            var min = null;
            for (var i = 0; i < mainSeries.dataIndex.length; i++) {
                var rawIndex = mainSeries.dataIndex[i];
                var dataItem = data[rawIndex];
                val = dataItem.value[2];
                allSum += val
                if(!min||val < min){
                    min = val;
                }
                if(val > max){
                    max = val;
                }
                count += 1;
            }
            var unitPrice = allSum / count;
            this.setOption({
                series:{
                    title:'区域雷达图',
                    id:"radarBrush",
                    data:[[unitPrice,max,min]]
                }
            })
        }
        //时间戳转换函数
        function getTime(timeStamp){
            return new Date(parseInt(timeStamp) * 1000).toLocaleString().replace(/:\d{1,2}$/,' ');
        }
        //房价数据构造函数
        function loadDatas(url,chart) {
            data = [];
            chart.showLoading()
            $.ajax({
                type:'post',
                url:url,
                data:paramters,
                dataType:'json',
                success:function (datas) {
                    for (var i in datas) {
                        data.push({name:{"address":datas[i]['address'],"sumPrice":datas[i]['sumPrice'],"city":datas[i]['city'],"size":datas[i]['size'],"roomNum":datas[i]['roomNum'],"orient":datas[i]['orient'],"time":getTime(datas[i]['time'])},value:[datas[i]['ln'],datas[i]['lat'],parseInt(datas[i]['unitPrice'])]});
                    }
                    chart.setOption({
                        series:[{
                            data: data
                        }]
                    })
                    chart.hideLoading()
                }
            })
        }
        function loadDatasFromJson(url,chart){
            data = []
            $.getJSON(url,function(datas){
                for (var i in datas) {
                    data.push({name:{"address":datas[i]['address'],"sumPrice":datas[i]['sumPrice'],"city":datas[i]['city'],"size":datas[i]['size'],"roomNum":datas[i]['roomNum'],"orient":datas[i]['orient'],"time":getTime(datas[i]['time'])},value:[datas[i]['ln'],datas[i]['lat'],parseInt(datas[i]['unitPrice'])]});
                }
                chart.setOption({
                    series:[{
                        data: data
                    }]
                })
                chart.hideLoading()
            })
        }

        //echart加载设置
        var option = {
            /*
             geo: {
             map: 'china',
             label: {
             emphasis: {
             show: false
             }
             },
             itemStyle: {
             normal: {
             areaColor: '#323c48',
             borderColor: '#111'
             },
             emphasis: {
             areaColor: '#2a333d'
             }
             }
             },
             */
            //加载百度地图组件
            bmap: {
                // 百度地图中心经纬度
                center: [114.314129, 30.550339],
                // 百度地图缩放(即地图范围)
                zoom: 12,
                // 是否开启拖拽缩放,可以只设置 'scale' 或者 'move'
                roam: 'true',
                // 百度地图的自定义样式
                mapStyle: {
                    'styleJson': [
                        {
                            'featureType': 'water',
                            'elementType': 'all',
                            'stylers': {
                                'color': '#031628'
                            }
                        },
                        {
                            'featureType': 'land',
                            'elementType': 'geometry',
                            'stylers': {
                                'color': '#000102'
                            }
                        },
                        {
                            'featureType': 'highway',
                            'elementType': 'all',
                            'stylers': {
                                'visibility': 'off'
                            }
                        },
                        {
                            'featureType': 'arterial',
                            'elementType': 'geometry.fill',
                            'stylers': {
                                'color': '#000000'
                            }
                        },
                        {
                            'featureType': 'arterial',
                            'elementType': 'geometry.stroke',
                            'stylers': {
                                'color': '#0b3d51'
                            }
                        },
                        {
                            'featureType': 'local',
                            'elementType': 'geometry',
                            'stylers': {
                                'color': '#000000'
                            }
                        },
                        {
                            'featureType': 'railway',
                            'elementType': 'geometry.fill',
                            'stylers': {
                                'color': '#000000'
                            }
                        },
                        {
                            'featureType': 'railway',
                            'elementType': 'geometry.stroke',
                            'stylers': {
                                'color': '#08304b'
                            }
                        },
                        {
                            'featureType': 'subway',
                            'elementType': 'geometry',
                            'stylers': {
                                'lightness': -70
                            }
                        },
                        {
                            'featureType': 'building',
                            'elementType': 'geometry.fill',
                            'stylers': {
                                'color': '#000000'
                            }
                        },
                        {
                            'featureType': 'all',
                            'elementType': 'labels.text.fill',
                            'stylers': {
                                'color': '#857f7f'
                            }
                        },
                        {
                            'featureType': 'all',
                            'elementType': 'labels.text.stroke',
                            'stylers': {
                                'color': '#000000'
                            }
                        },
                        {
                            'featureType': 'building',
                            'elementType': 'geometry',
                            'stylers': {
                                'color': '#022338'
                            }
                        },
                        {
                            'featureType': 'green',
                            'elementType': 'geometry',
                            'stylers': {
                                'color': '#062032'
                            }
                        },
                        {
                            'featureType': 'boundary',
                            'elementType': 'all',
                            'stylers': {
                                'color': '#465b6c'
                            }
                        },
                        {
                            'featureType': 'manmade',
                            'elementType': 'all',
                            'stylers': {
                                'color': '#022338'
                            }
                        },
                        {
                            'featureType': 'label',
                            'elementType': 'all',
                            'stylers': {
                                'visibility': 'on'
                            }
                        }
                    ]
                }
            },
            //提示框
            tooltip:{
                trigger:'item',
                enterable:true,
                formatter:function(content){
                    var message =  content['data']['name'];
                    var value = content['data']['value'];
                    return '<div class="tooltip" >详细地址:'+message['address']+
                        '<br>总价格:'+message['sumPrice']+'万<br>均价'+
                        value[2]+"<br>面积:"+message['size']+'㎡ <br>'+
                        '房型:'+message['roomNum']+
                        "</div>";
                },
            },
            //数据映射
            visualMap:{
                type: 'continuous',
                min: 5000,
                max: 40000,
                calculable: true,
                color: ['red','yellow','lightskyblue']
            },
            //工具栏外观
            toolbox: {
                feature: {
                    myTool1: {
                        show: true,
                        title:"开启百度地图移动",
                        icon: "image://http://localhost:8000/Image/icon/移动2.png",
                        onclick: function (a) {
                            mapChart.setOption({
                                //手动开启百度地图的移动选项
                                bmap: {
                                    roam: 'true'
                                }
                            })
                        }
                    }
                },
                iconStyle: {
                    normal: {
                        borderColor: '#fff'
                    },
                    emphasis: {
                        borderColor: '#b1e4ff'
                    }
                }
            },
            //区域选择工具栏
            brush: {
                brushStyle: {
                    borderWidth: 2,
                    color: 'rgba(0,0,0,0.2)',
                    borderColor: 'green',
                },
                throttleType: 'debounce',
                throttleDelay: 300,
                outOfBrush: {

                }
            },
            //雷达图
            radar: {
                radius:'20%',
                center:['90%','25%'],
                shape:'circle',
                indicator: [
                    {name: '平均价格', max: 30000},
                    {name: '最高价格', max: 30000},
                    {name: '最低价格', max: 30000},
                ],
                splitNumber: 3,
                name: {
                    textStyle: {
                        color: '#fff',
                        backgroundColor: '#999',
                        borderRadius: 1,
                        padding: [3, 5]
                    }
                },
            },
            series: [{
                id:'main',
                type: 'scatter',
                // 使用百度地图坐标系
                //large:true,
                coordinateSystem: 'bmap',
                // 数据格式跟在 geo 坐标系上一样,每一项都是 [经度,纬度,数值大小,其它维度...]

                data: [],
                symbolSize:4,
                itemStyle: {
                    normal: {
                        color: 'rgba(37, 140, 249, 0.8)'
                    }
                },
            },{
                id:"radarBrush",
                name: '武汉',
                type: 'radar',
                tooltip:{
                    formatter:function(ret){
                        return "该区域平均价格为:"+parseInt(ret['data'][0])+"<br>" +
                            "最高价格为:"+ret['data'][1]+"<br>"+
                            "最低价格为:"+ret['data'][2]+"<br>";
                    }
                },
            }]
        }
        var paramters = {
            "city":"湖北武汉",
            "number":1000,
            "isDataLimit":1
        };
        var mapChart = echarts.init($("#main")[0]);
        mapChart.setOption(option);
        mapChart.on('brushselected',renderBrushed);
        var init = function(){
            loadDatas("http://localhost:8000/house/datas.do",mapChart);
        }
        init();
    })
</script>
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • 312
  • 313
  • 314
  • 315
  • 316
  • 317
  • 318
  • 319
  • 320
  • 321
  • 322
  • 323
  • 324
  • 325
  • 326
  • 327
  • 328
  • 329
  • 330
  • 331
  • 332
  • 333
  • 334
  • 335
  • 336
  • 337
  • 338
  • 339
  • 340
  • 341
  • 342
  • 343
  • 344
  • 345
  • 346
  • 347
  • 348
  • 349
  • 350
  • 351
  • 352
  • 353
  • 354
  • 355
  • 356
  • 357
  • 358
  • 359
  • 360
  • 361
  • 362
  • 363
  • 364
  • 365
  • 366
  • 367
  • 368
  • 369
  • 370
  • 371
  • 372
  • 373
  • 374
  • 375
  • 376
  • 377
  • 378
  • 379

后端api的编写参照另一篇博客即可,我怕取的216W条解析过地址的房价信息可以在这里下载

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/760947
推荐阅读
相关标签
  

闽ICP备14008679号