echarts 地图3d+地图下钻

效果图

内蒙古地图
锡林郭勒盟地图

原理

使用geo下移叠加地图的阴影效果,通过点击地图获取当前点击的城市编码动态切换地json

// 地图数据 (用来标记地图名称的散点图及弹窗数据)
        let dataset = [
            {
                name: '阿拉善盟',
                wheat: 128,
                corn: 100,
                potato: 28,
                soybeans: 234,
                number: 152900,
                coordinate: [102.42556, 40.532392]
            },
            {
                name: '巴彦淖尔市',
                wheat: 128,
                corn: 100,
                potato: 28,
                soybeans: 234,
                number: 150800,
                coordinate: [107.575749, 41.673305]
            },
            {
                name: '鄂尔多斯市',
                wheat: 128,
                corn: 100,
                potato: 28,
                soybeans: 234,
                number: 150600,
                coordinate: [108.63741, 39.765314]
            },
            {
                name: '呼和浩特市',
                wheat: 128,
                corn: 100,
                potato: 28,
                soybeans: 234,
                number: 150100,
                coordinate: [111.50328, 40.797159]
            },
            {
                name: '乌兰察布市',
                wheat: 128,
                corn: 100,
                potato: 28,
                soybeans: 234,
                number: 150900,
                coordinate: [112.443087, 41.506874]
            },
            {
                name: '锡林郭勒盟',
                wheat: 128,
                corn: 100,
                potato: 28,
                soybeans: 234,
                number: 152500,
                coordinate: [115.46632, 43.942965]
            },
            {
                name: '赤峰市',
                wheat: 128,
                corn: 100,
                potato: 28,
                soybeans: 234,
                number: 150400,
                coordinate: [118.878285, 43.039277]
            },
            {
                name: '通辽市',
                wheat: 128,
                corn: 100,
                potato: 28,
                soybeans: 234,
                number: 150500,
                coordinate: [121.569548, 43.834485]
            },
            {
                name: '兴安盟',
                wheat: 128,
                corn: 100,
                potato: 28,
                soybeans: 234,
                number: 152200,
                coordinate: [121.341355, 46.241397]
            },
            {
                name: '包头市',
                wheat: 128,
                corn: 100,
                potato: 28,
                soybeans: 234,
                number: 150200,
                coordinate: [110.266038, 41.789669]
            },
            {
                name: '呼伦贝尔市',
                wheat: 128,
                corn: 100,
                potato: 28,
                soybeans: 234,
                number: 150700,
                coordinate: [120.906868, 49.635235]
            }
        ]
        // 处理scatter散点图数据
        function resetData(data) {
            return data.map((item) => {
                return {
                    name: item.name,
                    value: item.coordinate //坐标点
                }
            })
        }
        function initEachart(geoJson, name, chart) {
            echarts.registerMap(name, geoJson);
            let option2 = {
                tooltip: {
                    trigger: 'item',
                    backgroundColor: 'rgba(0,0,0,0)',
                    borderColor: 'rgba(0,0,0,0)',
                    extraCssText: 'box-shadow: 0 0 0px rgba(0, 0, 0, 0);',
                    formatter: function (params) {
                    	//调整tooltip的样式
                        let html = '<div style="width: 3.5rem;transform: rotate(-17deg);background: url(../image/pop-bg.png) no-repeat center;background-size: 100% 100%; padding: 0.2rem 0.25rem;">' +
                            '<div style="font-size: 0.26rem;color: #fff;font-weight: 600;padding-bottom: 5px;">' + params.name + '</div>' +
                            '<ul>' +
                            '<li style="padding: 0.1rem 0;border-bottom: 1px solid #fff;display: flex;align-items: center;justify-content: space-between;">' +
                            '<div>' +
                            '<img style="width: 0.2rem;float: left;margin-right: 5px;margin-top: 0.08rem;" src="../image/wheat.png" alt=""><span style="float: left;margin-right: 5px;margin-top: 0.08rem;color:#fff;font-size:0.2rem">小麦</span>' +
                            '</div>' +
                            '<div style="color: #59bff0;"><span style="font-size: 0.26rem;font-weight: 600;padding-right: 5px;">12</span><span>万亩</span></div>' +
                            '</li>' +
                            '<li style="padding: 0.1rem 0;border-bottom: 1px solid #fff;display: flex;align-items: center;justify-content: space-between;">' +
                            '<div><img style="width: 0.2rem;float: left;margin-right: 5px;margin-top: 0.08rem;" src="../image/corn.png" alt=""><span style="float: left;margin-right: 5px;margin-top: 0.08rem;color:#fff;font-size:0.2rem">玉米</span></div>' +
                            '<div style="color: #59bff0;"><span style="font-size: 0.26rem;font-weight: 600;padding-right: 5px;">14</span><span>万亩</span></div>' +
                            '</li>' +
                            '<li style="padding: 0.1rem 0;border-bottom: 1px solid #fff;display: flex;align-items: center;justify-content: space-between;">' +
                            '<div><img src="../image/potato.png" alt="" style="width: 0.2rem;float: left;margin-right: 5px;margin-top: 0.08rem;"><span style="float: left;margin-right: 5px;margin-top: 0.08rem;color:#fff;font-size:0.2rem">马铃薯</span></div>' +
                            '<div style="color: #59bff0;"><span style="font-size: 0.26rem;font-weight: 600;padding-right: 5px;">16</span><span>万亩</span></div>' +
                            '</li>' +
                            '<li style="padding: 0.1rem 0;border-bottom: 1px solid #fff;display: flex;align-items: center;justify-content: space-between;">' +
                            '<div><img src="../image/soybeans.png" alt="" style="width: 0.2rem;float: left;margin-right: 5px;margin-top: 0.08rem;"><span style="float: left;margin-right: 5px;margin-top: 0.08rem;color:#fff;font-size:0.2rem">大豆</span></div>' +
                            '<div style="color: #59bff0;"><span style="font-size: 0.26rem;font-weight: 600;padding-right: 5px;">22</span><span>万亩</span></div>' +
                            '</li>' +
                            '</ul>' +
                            '</div>'
                        return html
                    }
                },
                geo: {
                    show: true,
                    map: name,
                    zoom: 1.2,
                    itemStyle: {
                        areaColor: '#1a346f',
                        borderColor: '#59bff0',
                        borderWidth: 4,
                        shadowColor: 'rgba(74,172,224, 0.8)',
                        shadowBlur: 0,
                        shadowOffsetX: 0,
                        shadowOffsetY: 16 //设置地图阴影
                    }
                },
                series: [
                    {
                        type: 'map',
                        zoom: 1.2,
                        mapType: name, // 自定义扩展图表类型
                        label: {
                            show: true,
                            color: '#0AFF3F',
                            fontSize: '0.17rem',
                            fontWeight: 'bold'
                        },
                        geoIndex: 1,
                        itemStyle: {
                            areaColor: '#1a346f',
                            borderColor: '#59bff0',
                            borderWidth: 4,
                        },
                        zlevel: 0
                    },
                    {
                        type: 'scatter',
                        coordinateSystem: 'geo',
                        data: resetData(dataset),
                        symbolSize: function (val) {
                            return 9;
                        },
                        seriesIndex: 22,
                        encode: {
                            value: 2
                        },
                        showEffectOn: 'render',
                        rippleEffect: {
                            brushType: 'stroke',
                            color: '#ffc600',
                        },
                        hoverAnimation: true,
                        label: {
                            show: false,
                            position: 'top',
                            color: '#0AFF3F',
                            fontWeight: 'bold',
                            fontSize: '0.2rem',
                            formatter: function (data) {
                                return data.name
                            }
                        },
                        itemStyle: {
                            shadowBlur: 10,
                            shadowColor: '#ffc600',
                            color: '#ffc600',
                            borderColor: '#ffc600'
                        },
                        emphasis: {
                            label: {
                                color: "#0AFF3F"
                            },
                            itemStyle: {
                                areaColor: '#ffc600'
                            }
                        },
                        zlevel: 333
                    }
                ]
            }
            chart.setOption(option2)
            chart.off('click')
            chart.on('click', function (params) {
                // 接触地图点击高亮选中
                chart.dispatchAction({
                    type: 'unselect',
                    seriesIndex: 0,
                    name: params.name
                });
                let index = dataset.map(item => item.name).indexOf(params.name)
                if (index !== -1) {
                    getGeoJson('../js/' + dataset[index].number + '.json')
                        .then(regionGeoJson => {
                            dataset = []
                            // 展示返回按钮,返回内蒙古地图
                            $('.go-back-btn').show()
                            initEachart(regionGeoJson, params.name, chart)
                        }).catch(err => {
                            getGeoJson('../js/NeiMengGu.json', 'NMG', chart)
                        })
                }
            })
            $(window).resize(function () {
                chart.resize()
            });
        }
        async function getGeoJson(jsonName) {
            return await $.get(jsonName)
        }
        async function initChart() {
            let chart = echarts.init(document.getElementById('mapCon'));
            let json = await getGeoJson('../js/NeiMengGu.json')
            initEachart(json, 'NMG', chart)
        }
<div id="mapCon" style="height: 6.2rem;margin-top: 0.2rem;"></div>
<script>
 $(function () {
            // 地图
            initChart()
            // 点击返回内蒙古地图
            $('.go-back-btn').on('click', function () {
             	dataset = ... // 散点图数据及tooltip数据需要重新获取
			  	initChart()
                $(this).hide()
	     	}
 })
 </script>
ECharts3D 是百度开发的一个基于 WebGL 技术的数据可视化库,支持 3D 数据展示。在 ECharts3D 中,地图是一个内置的组件,可以通过配置数据来展示不同区域的数据分布。下功能指的是点击地图上的区域,可以进入该区域的更详细的数据展示页面。 实现 ECharts3D 地图的关键在于对数据的处理和配置。具体实现步骤如下: 1. 准备地图数据:ECharts3D 内置了一些地图数据,也可以从外部加载地图数据。可以通过 GeoJSON 格式的数据来描述地图边界和区域信息。 2. 准备下数据:点击地图上的区域后,需要进入该区域的更详细数据展示页面。因此需要准备好该区域的详细数据,并在点击事件中进行处理。 3. 配置 ECharts3D 地图组件:通过 ECharts3D 的配置项,设置地图的样式、坐标系、区域颜色等属性。并将准备好的地图数据和下数据绑定到地图组件上。 4. 监听点击事件:通过 ECharts3D 提供的事件监听机制,在地图上监听用户的点击事件。当用户点击某个区域时,根据该区域的数据信息进行下操作,并展示该区域的详细数据。 下面是一个简单的示例代码,演示如何实现 ECharts3D 地图: ```javascript // 引入 ECharts3D 库 import echarts from 'echarts'; import 'echarts-gl'; // 准备地图数据 const mapData = [ {name: '北京', value: 100}, {name: '上海', value: 200}, {name: '广州', value: 300}, {name: '深圳', value: 400}, // ... 其他区域数据 ]; // 准备下数据 const detailData = [ {name: '北京区域1', value: 50}, {name: '北京区域2', value: 50}, // ... 其他区域数据 ]; // 配置地图组件 const option = { geo3D: { map: 'china', // 使用中国地图 itemStyle: { areaColor: '#fff', // 区域背景颜色 opacity: 1, // 区域透明度 borderWidth: 1, // 区域边框宽度 borderColor: '#000', // 区域边框颜色 }, label: { show: true, // 是否显示区域标签 textStyle: { color: '#000', // 标签文字颜色 fontSize: 12, // 标签文字大小 }, }, regions: mapData, // 绑定地图数据 }, series: [{ type: 'bar3D', data: detailData, // 绑定下数据 }], }; // 监听点击事件 echarts.init(document.getElementById('chart')).on('geo3DClick', function(params) { const name = params.name; // 根据区域名称查询对应的下数据 const data = detailData.filter(item => item.name.startsWith(name)); // 更新下数据并重新渲染 option.series[0].data = data; echarts.init(document.getElementById('chart')).setOption(option); }); ``` 在上面的示例代码中,我们通过配置 ECharts3D 的 `geo3D` 组件来展示地图,并将准备好的地图数据绑定到组件上。在 `series` 中,我们配置了一个 3D 柱状图,用于展示下数据。在监听 `geo3DClick` 事件时,我们根据点击的区域名称查询对应的下数据,并更新 `series` 中的数据,最后重新渲染图表即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值