Echarts 3D地图 标记实现

本文介绍如何使用代码实现3D地图中的自定义图标,涉及视觉映射设置、数据点标注与问题解决方案,适合GIS开发者和前端工程师阅读。
摘要由CSDN通过智能技术生成

主要代码
3d地图实现

                const option = {
                    visualMap: {
                        show: false,
                        min: 0,
                        max: 1,
                        calculable: true,
                        realtime: false,
                        inRange: {
                            color: ['#ddd', '#0a59ca']
                        },
                        textStyle: {
                            color: '#ffffff'
                        }
                    },
                    geo3D: {
                        map: 'shanxi',
                        roam: true,
                        itemStyle: {
                            color: '#0a59ca',
                            opacity: 1,
                            borderWidth: 0.8,
                            borderColor: 'rgb(62,215,213)'
                        },
                        label: {
                            show: true,
                            distance: 0,
                            textStyle: {
                                color: '#ffffff', //地图初始化区域字体颜色
                                fontSize: 16,
                                opacity: 1,
                                backgroundColor: 'rgba(0,0,0,0)'
                                //backgroundColor: 'rgba(53,171,199,0)'
                            },
                        },
                        //shading: 'lambert',
                        light: { //光照阴影
                            main: {
                                color: '#fff', //光照颜色
                                intensity: 1.2, //光照强度
                                //shadowQuality: 'high', //阴影亮度
                                shadow: false, //是否显示阴影
                                alpha: 55,
                                beta: 10

                            },
                            ambient: {
                                intensity: 0.3
                            }
                        },
                        viewControl: {
                            panMouseButton: 'right',
                            panSensitivity: 1,
                            distance: 190,
                            center: [-15, -40, 0],
                            rotateMouseButton: 'left',
                            minDistance: 1,
                            beta: 0,
                            alpha: 45
                        },
                    },
                    series: seriesList,
                    animation: false
                };

类百度地图标记实现

                const data1 = dataList.map((item, index) => {
                    return {
                        name: item.title, value: [item.lng, item.lat, 0], id: item.relationid,
                        label: {
                            show: true,
                            position: "bottom",
                            distance: -57,
                            formatter(params) {
                                return " ";
                            },
                            textStyle: {
                                color: "transparent",
                                padding: [10, 13],
                                backgroundColor: {
                                    image: res[index],
                                },
                            },
                        },
                        emphasis: {
                            label: {
                                show: true,
                                position: "bottom",
                                distance: -57,
                                formatter(params) {
                                    return " ";
                                },
                                textStyle: {
                                    color: "transparent",
                                    padding: [10, 13],
                                    backgroundColor: {
                                        image: res[index],
                                    },
                                    radius:'100%'
                                },
                            }
                        }
                    }
                })
                seriesList.push({
                    name: "自定义图标",
                    type: "scatter3D",
                    coordinateSystem: "geo3D",
                    data: data1,
                    symbol: '',
                    symbolSize: [0, 50],
                    itemStyle: {
                        color: 'red',
                        borderColor:'transparent',
                        borderWidth:15
                    }
                })

补充一下图标的实现方法,使用canvas合成代码如下

import PositionBg from "./position.png";
export default function (URL) {
    // 假设你已经有了一个Image对象(例如从文件输入或网络加载) 
    return new Promise((resolve, reject) => {

        let img = new Image();
        let img1 = new Image();
        const url = URL ? URL: PositionBg;
        const width = 40
        const height = 50
        img1.src = PositionBg; // 替换为你的图片路径 
        img.crossOrigin = '*';
        // start
        // 创建一个Canvas元素  
        let canvas = document.createElement('canvas');
        let ctx = canvas.getContext('2d');

        // 设置Canvas的大小(这里假设与图片大小相同)  
        canvas.width = width;
        canvas.height = height;
        ctx.strokeStyle = "rgba(0,0,0,0)";
        ctx.strokeRect(0, 0, width, height);

        ctx.save()
        // 设置圆的半径  
        const radius = 15 + 2;
        // ctx.drawImage(img1, 0, 0, width, height);
        // 绘制圆形裁剪区域  
        ctx.beginPath();
        ctx.arc(width / 2, width / 2, radius, 0, Math.PI * 2);
        ctx.closePath();
        ctx.clip();
        // end
        img.onload = function () {
            ctx.drawImage(img, width / 2 - radius, width / 2 - radius, 2 * radius, 2 * radius);
            // 绘制图片  
            ctx.restore()
            setTimeout(()=>{
                ctx.drawImage(img1, 0, 0, width, height);
                // 使用toDataURL方法将Canvas内容转换为Data URL,并设置图片质量进行压缩  
                // 第二个参数是图片格式,第三个参数是图片质量(0.0到1.0之间,默认为1.0)  
                let dataUrl = canvas.toDataURL('image/png', 1); // 0.5为50%的质量   
                resolve(dataUrl)          
                console.log('--11--');      
            },1000)


        };
        img.onerror = err=>{
            console.log(err);
            ctx.restore()
            ctx.drawImage(img1, 0, 0, width, height);
            let dataUrl = canvas.toDataURL('image/png', 1); // 0.5为50%的质量   
            resolve(dataUrl)
        }
        img.src = url; // 替换为你的图片路径   
    })

}

这里有很多坑

  1. 点击事件无法执行(解决方案,我是添加了scatter3D的散点,然后设置成透明)
  2. scatter3D,标记的颜色(使用itemStyle.color)无法修改,解决方案(设置宽度为0,然后使用borderWidth来设置宽度)
  3. 标记点不贴地(解决方案在代码里,通过distance属性来一点点调整)
  4. 注意版本我的是v4.9.0,不同版本差异很大
  5. 还有很多坑,有需要完整代码的小伙伴欢迎联系我
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在ECharts实现3D地图上方下雨的特效,可以通过以下步骤来实现: 1. 准备数据:首先,你需要准备一个包含每个地区经纬度坐标和降雨量的数据集。可以使用JSON格式将这些数据存储。 2. 创建地图使用ECharts提供的地图组件创建一个3D地图。 ```javascript var chart = echarts.init(document.getElementById('chart-container')); chart.setOption({ backgroundColor: '#fff', geo3D: { map: 'world', //地图类型,可以根据需求更换 shading: 'lambert', light: { main: { intensity: 1.2, shadow: true, shadowQuality: 'high', }, }, viewControl: { autoRotate: true, }, itemStyle: { color: '#ddd', opacity: 1, borderWidth: 0.4, borderColor: '#444', }, emphasis: { label: { show: false, }, itemStyle: { color: '#f00', }, }, }, }); ``` 3. 添加特效:使用ECharts的graphic组件来添加下雨的特效。首先,定义一个包含下雨效果的graphic元素。 ```javascript var rainEffect = { type: 'group', children: [], }; ``` 然后,根据数据集中的经纬度和降雨量信息,在每个对应的地理坐标点上添加下雨特效。 ```javascript // 假设data是你准备的数据集 data.forEach(function (item) { rainEffect.children.push({ type: 'rain', shape: { x: item.longitude, y: item.latitude, z: 0, dx: 0, dy: -1, dz: 0, }, style: { lineStyle: { width: 1, color: '#00f', }, trailLength: 0.1, stroke: 'rgba(0,255,255,0.6)', }, size: 2, speed: 0.1, color: '#00f', }); }); ``` 最后,将定义好的下雨特效添加到图表中。 ```javascript chart.setOption({ graphic: rainEffect, }); ``` 4. 更新数据:如果需要实时更新降雨量数据,可以使用ECharts提供的API来动态更新数据。 ```javascript // 假设data是你准备的新数据集 rainEffect.children = []; data.forEach(function (item) { rainEffect.children.push({ // ... }); }); chart.setOption({ graphic: rainEffect, }); ``` 这样,就可以实现ECharts3D地图上方添加下雨特效。根据实际需求,可以调整下雨特效的样式、速度和颜色等参数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值