新建会话
插件 定时任务
  • 获取应用程序
  • 关于我们
    • 探索月之暗面
    • 开放平台
    • 社会招聘
    • 校园招聘
    • 用户协议
    • 隐私协议
  • Language
  • 帮助

旅行足迹地图

我想做一个地图展示我去过的城市,使用Echarts的地图组件,去过的城市所在省份会变色,这样我去过的地方都会被点亮,输出一个html文件。我去过的城市有,北京 沈阳 邢台 大同 深圳 广州 成都 武汉
设置省份颜色与城市标记的可视化
用户想要创建一个展示自己去过城市的地图,使用 ECharts 地图组件。具体需求:
  1. 用 ECharts 地图组件
  2. 去过的城市所在省份会变色(高亮/点亮)
  3. 用户去过的城市:北京、沈阳、邢台、大同、深圳、广州、成都、武汉
需要输出一个完整的 HTML 文件。
分析用户去过的城市对应的省份:
  • 北京:北京市(直辖市)
  • 沈阳:辽宁省
  • 邢台:河北省
  • 大同:山西省
  • 深圳:广东省
  • 广州:广东省
  • 成都:四川省
  • 武汉:湖北省
所以需要高亮的省份包括:北京、辽宁、河北、山西、广东、四川、湖北。
我需要创建一个包含 ECharts 的 HTML 文件,使用中国地图,将这些省份标记为已访问(变色),并可以添加一些交互效果,比如点击显示去过的具体城市。
ECharts 需要使用中国地图的 GeoJSON 数据。通常可以通过 CDN 获取,或者使用 ECharts 自带的地图数据(但 ECharts 5 之后不再自带地图数据,需要自行下载)。
我可以通过以下方式获取中国地图数据:
  1. 使用阿里云的 DataV 地理数据服务:https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json
实现方案:
  1. 创建 HTML 结构
  2. 引入 ECharts
  3. 获取中国地图 GeoJSON 数据
  4. 配置 ECharts 地图选项:
    • 设置视觉映射或直接在数据中设置省份颜色
    • 标记具体城市(使用 scatter 或 effectScatter 系列)
    • 添加 tooltip 显示信息
  5. 为去过的省份设置特殊颜色,未去过的设置默认颜色
具体城市坐标(大致):
  • 北京:116.4074, 39.9042
  • 沈阳:123.4315, 41.8057
  • 邢台:114.5047, 37.0659
  • 大同:113.3004, 40.0768
  • 深圳:114.0579, 22.5431
  • 广州:113.2644, 23.1291
  • 成都:104.0668, 30.5728
  • 武汉:114.3054, 30.5931
我需要构建一个完整的、独立的 HTML 文件,包含所有必要的 CSS 和 JavaScript。
我来为你制作一个展示旅行足迹的 ECharts 地图页面。我会将中国地图作为底图,把你去过的省份高亮显示,并在对应城市位置上添加标记点。
HTML
预览
复制
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>我的旅行足迹地图</title>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/echarts.min.js"></script>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        
        body {
            font-family: 'Segoe UI', 'Microsoft YaHei', sans-serif;
            background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%);
            min-height: 100vh;
            display: flex;
            flex-direction: column;
            align-items: center;
            padding: 20px;
        }
        
        h1 {
            color: #fff;
            margin-bottom: 10px;
            text-shadow: 2px 2px 4px rgba(0,0,0,0.3);
            font-size: 32px;
        }
        
        .subtitle {
            color: rgba(255,255,255,0.8);
            margin-bottom: 20px;
            font-size: 16px;
        }
        
        #map-container {
            width: 90%;
            max-width: 1200px;
            height: 600px;
            background: rgba(255,255,255,0.1);
            border-radius: 20px;
            box-shadow: 0 8px 32px rgba(0,0,0,0.3);
            backdrop-filter: blur(10px);
            padding: 20px;
            position: relative;
        }
        
        .stats {
            margin-top: 20px;
            display: flex;
            gap: 30px;
            color: #fff;
            flex-wrap: wrap;
            justify-content: center;
        }
        
        .stat-item {
            background: rgba(255,255,255,0.15);
            padding: 15px 25px;
            border-radius: 10px;
            text-align: center;
            backdrop-filter: blur(5px);
        }
        
        .stat-number {
            font-size: 28px;
            font-weight: bold;
            color: #FFD700;
            display: block;
        }
        
        .stat-label {
            font-size: 14px;
            margin-top: 5px;
            opacity: 0.9;
        }
        
        .legend-info {
            position: absolute;
            bottom: 30px;
            right: 30px;
            background: rgba(0,0,0,0.6);
            color: #fff;
            padding: 15px;
            border-radius: 8px;
            font-size: 12px;
            line-height: 1.8;
        }
        
        .legend-item {
            display: flex;
            align-items: center;
            margin-bottom: 5px;
        }
        
        .color-box {
            width: 20px;
            height: 12px;
            margin-right: 8px;
            border-radius: 2px;
        }
        
        @media (max-width: 768px) {
            #map-container {
                height: 400px;
                width: 95%;
            }
            h1 { font-size: 24px; }
        }
    </style>
</head>
<body>
    <h1>🗺️ 我的旅行足迹</h1>
    <p class="subtitle">记录每一步探索的旅程</p>
    
    <div id="map-container"></div>
    
    <div class="stats">
        <div class="stat-item">
            <span class="stat-number">8</span>
            <div class="stat-label">探索城市</div>
        </div>
        <div class="stat-item">
            <span class="stat-number">7</span>
            <div class="stat-label">点亮省份</div>
        </div>
        <div class="stat-item">
            <span class="stat-number">北京</span>
            <div class="stat-label">最远起点</div>
        </div>
        <div class="stat-item">
            <span class="stat-number">深圳</span>
            <div class="stat-label">最南足迹</div>
        </div>
    </div>

    <script>
        // 初始化图表
        const chartDom = document.getElementById('map-container');
        const myChart = echarts.init(chartDom);
        
        // 访问过的城市数据(包含经纬度和所属省份)
        const visitedCities = [
            { name: '北京', value: [116.4074, 39.9042, '北京市'], province: '北京市' },
            { name: '沈阳', value: [123.4315, 41.8057, '辽宁省'], province: '辽宁省' },
            { name: '邢台', value: [114.5047, 37.0659, '河北省'], province: '河北省' },
            { name: '大同', value: [113.3004, 40.0768, '山西省'], province: '山西省' },
            { name: '深圳', value: [114.0579, 22.5431, '广东省'], province: '广东省' },
            { name: '广州', value: [113.2644, 23.1291, '广东省'], province: '广东省' },
            { name: '成都', value: [104.0668, 30.5728, '四川省'], province: '四川省' },
            { name: '武汉', value: [114.3054, 30.5931, '湖北省'], province: '湖北省' }
        ];
        
        // 需要高亮的省份列表
        const visitedProvinces = ['北京市', '辽宁省', '河北省', '山西省', '广东省', '四川省', '湖北省'];
        
        // 加载中国地图
        fetch('https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json')
            .then(response => response.json())
            .then(geoJson => {
                echarts.registerMap('china', geoJson);
                
                const option = {
                    backgroundColor: 'transparent',
                    tooltip: {
                        trigger: 'item',
                        backgroundColor: 'rgba(0,0,0,0.8)',
                        borderColor: '#FFD700',
                        borderWidth: 1,
                        textStyle: { color: '#fff' },
                        formatter: function(params) {
                            if (params.seriesType === 'scatter') {
                                return `<div style="font-weight:bold">${params.name}</div>
                                        <div>${params.value[2]}</div>`;
                            } else if (params.data && params.data.visited) {
                                const cities = visitedCities
                                    .filter(c => c.province === params.name)
                                    .map(c => c.name)
                                    .join('、');
                                return `<div style="font-weight:bold">${params.name}</div>
                                        <div style="color:#FFD700">已访问城市:${cities}</div>`;
                            }
                            return params.name;
                        }
                    },
                    geo: {
                        map: 'china',
                        roam: true,
                        zoom: 1.2,
                        label: {
                            show: true,
                            color: '#fff',
                            fontSize: 10
                        },
                        itemStyle: {
                            areaColor: 'rgba(200,200,200,0.2)',
                            borderColor: '#404a59',
                            borderWidth: 1
                        },
                        emphasis: {
                            label: { color: '#fff' },
                            itemStyle: {
                                areaColor: '#FFD700'
                            }
                        }
                    },
                    series: [
                        // 省份地图系列 - 设置访问过的省份颜色
                        {
                            name: '省份',
                            type: 'map',
                            map: 'china',
                            geoIndex: 0,
                            data: geoJson.features.map(feature => {
                                const provinceName = feature.properties.name;
                                const isVisited = visitedProvinces.includes(provinceName);
                                return {
                                    name: provinceName,
                                    value: isVisited ? 1 : 0,
                                    visited: isVisited,
                                    itemStyle: isVisited ? {
                                        areaColor: {
                                            type: 'linear',
                                            x: 0, y: 0, x2: 0, y2: 1,
                                            colorStops: [
                                                { offset: 0, color: '#FF6B6B' },
                                                { offset: 1, color: '#FF8E53' }
                                            ]
                                        },
                                        shadowBlur: 10,
                                        shadowColor: 'rgba(255,107,107,0.5)'
                                    } : {
                                        areaColor: 'rgba(148,163,184,0.3)'
                                    }
                                };
                            })
                        },
                        // 城市标记点
                        {
                            name: '城市',
                            type: 'effectScatter',
                            coordinateSystem: 'geo',
                            data: visitedCities,
                            symbolSize: 12,
                            showEffectOn: 'render',
                            rippleEffect: {
                                brushType: 'stroke',
                                scale: 3,
                                period: 4
                            },
                            label: {
                                show: true,
                                position: 'top',
                                formatter: '{b}',
                                color: '#fff',
                                fontSize: 12,
                                fontWeight: 'bold',
                                backgroundColor: 'rgba(0,0,0,0.5)',
                                padding: [4, 8],
                                borderRadius: 4
                            },
                            itemStyle: {
                                color: '#FFD700',
                                shadowBlur: 10,
                                shadowColor: '#FFD700'
                            },
                            emphasis: {
                                scale: 1.5,
                                label: { fontSize: 14 }
                            },
                            zlevel: 1
                        },
                        // 连线效果(可选:连接各城市形成路线)
                        {
                            name: '路线',
                            type: 'lines',
                            coordinateSystem: 'geo',
                            effect: {
                                show: true,
                                period: 6,
                                trailLength: 0.7,
                                color: '#fff',
                                symbolSize: 3
                            },
                            lineStyle: {
                                color: 'rgba(255,215,0,0.6)',
                                width: 1,
                                curveness: 0.3,
                                type: 'dashed'
                            },
                            data: (function() {
                                const lines = [];
                                const coords = visitedCities.map(c => ({
                                    name: c.name,
                                    coord: c.value.slice(0, 2)
                                }));
                                for(let i = 0; i < coords.length - 1; i++) {
                                    lines.push({
                                        fromName: coords[i].name,
                                        toName: coords[i+1].name,
                                        coords: [coords[i].coord, coords[i+1].coord]
                                    });
                                }
                                return lines;
                            })(),
                            zlevel: 2
                        }
                    ]
                };
                
                myChart.setOption(option);
                
                // 点击事件
                myChart.on('click', function(params) {
                    if (params.componentType === 'series' && params.seriesType === 'map') {
                        if (params.data.visited) {
                            console.log('点击了已访问省份:', params.name);
                        }
                    }
                });
            })
            .catch(err => {
                console.error('地图加载失败:', err);
                chartDom.innerHTML = '<div style="color:#fff;text-align:center;padding-top:50px;">地图加载失败,请检查网络连接</div>';
            });
        
        // 响应式调整
        window.addEventListener('resize', function() {
            myChart.resize();
        });
    </script>
</body>
</html>
这个 HTML 文件包含以下特性:
🎨 视觉设计
  • 深蓝色渐变背景,营造探索氛围
  • 去过的省份(北京、辽宁、河北、山西、广东、四川、湖北)会显示为橙红色渐变并带发光效果
  • 未去过的省份显示为半透明的灰蓝色
📍 城市标记
  • 8 个去过的城市(北京、沈阳、邢台、大同、深圳、广州、成都、武汉)用金色脉冲光点标记
  • 鼠标悬停显示城市名称和所属省份
✨ 交互功能
  • 支持鼠标拖拽和滚轮缩放地图
  • 鼠标悬停省份会显示该省你去过的具体城市列表
  • 城市间有虚线连接,形成旅行路线轨迹
📊 数据展示
  • 底部统计面板显示:8 个城市、7 个省份、最远起点和最南足迹
你可以直接保存为 .html 文件打开使用,所有数据都来自中国地图标准 GeoJSON 数据。如果需要调整颜色风格或添加更多城市,随时告诉我!
这几个点之间不要飞线连接,因为他们没有关系,另外去过的城市所在省份变亮
思考已完成
用户要求去掉点之间的飞线连接,因为城市之间没有关系。同时保持"去过的城市所在省份变亮"的需求。
我需要修改之前的代码:
  1. 移除 series 中的 lines 类型(飞线)
  2. 保持省份高亮(已经实现)
  3. 保持城市标记(已经实现)
其他保持不变即可。
好的,我去掉城市之间的飞线连接,保留省份高亮和城市标记。
HTML
预览
复制
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>我的旅行足迹地图</title>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/echarts.min.js"></script>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        
        body {
            font-family: 'Segoe UI', 'Microsoft YaHei', sans-serif;
            background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%);
            min-height: 100vh;
            display: flex;
            flex-direction: column;
            align-items: center;
            padding: 20px;
        }
        
        h1 {
            color: #fff;
            margin-bottom: 10px;
            text-shadow: 2px 2px 4px rgba(0,0,0,0.3);
            font-size: 32px;
        }
        
        .subtitle {
            color: rgba(255,255,255,0.8);
            margin-bottom: 20px;
            font-size: 16px;
        }
        
        #map-container {
            width: 90%;
            max-width: 1200px;
            height: 600px;
            background: rgba(255,255,255,0.1);
            border-radius: 20px;
            box-shadow: 0 8px 32px rgba(0,0,0,0.3);
            backdrop-filter: blur(10px);
            padding: 20px;
            position: relative;
        }
        
        .stats {
            margin-top: 20px;
            display: flex;
            gap: 30px;
            color: #fff;
            flex-wrap: wrap;
            justify-content: center;
        }
        
        .stat-item {
            background: rgba(255,255,255,0.15);
            padding: 15px 25px;
            border-radius: 10px;
            text-align: center;
            backdrop-filter: blur(5px);
        }
        
        .stat-number {
            font-size: 28px;
            font-weight: bold;
            color: #FFD700;
            display: block;
        }
        
        .stat-label {
            font-size: 14px;
            margin-top: 5px;
            opacity: 0.9;
        }
        
        @media (max-width: 768px) {
            #map-container {
                height: 400px;
                width: 95%;
            }
            h1 { font-size: 24px; }
        }
    </style>
</head>
<body>
    <h1>🗺️ 我的旅行足迹</h1>
    <p class="subtitle">记录每一步探索的旅程</p>
    
    <div id="map-container"></div>
    
    <div class="stats">
        <div class="stat-item">
            <span class="stat-number">8</span>
            <div class="stat-label">探索城市</div>
        </div>
        <div class="stat-item">
            <span class="stat-number">7</span>
            <div class="stat-label">点亮省份</div>
        </div>
        <div class="stat-item">
            <span class="stat-number">北京</span>
            <div class="stat-label">最远起点</div>
        </div>
        <div class="stat-item">
            <span class="stat-number">深圳</span>
            <div class="stat-label">最南足迹</div>
        </div>
    </div>

    <script>
        // 初始化图表
        const chartDom = document.getElementById('map-container');
        const myChart = echarts.init(chartDom);
        
        // 访问过的城市数据(包含经纬度和所属省份)
        const visitedCities = [
            { name: '北京', value: [116.4074, 39.9042, '北京市'], province: '北京市' },
            { name: '沈阳', value: [123.4315, 41.8057, '辽宁省'], province: '辽宁省' },
            { name: '邢台', value: [114.5047, 37.0659, '河北省'], province: '河北省' },
            { name: '大同', value: [113.3004, 40.0768, '山西省'], province: '山西省' },
            { name: '深圳', value: [114.0579, 22.5431, '广东省'], province: '广东省' },
            { name: '广州', value: [113.2644, 23.1291, '广东省'], province: '广东省' },
            { name: '成都', value: [104.0668, 30.5728, '四川省'], province: '四川省' },
            { name: '武汉', value: [114.3054, 30.5931, '湖北省'], province: '湖北省' }
        ];
        
        // 需要高亮的省份列表
        const visitedProvinces = ['北京市', '辽宁省', '河北省', '山西省', '广东省', '四川省', '湖北省'];
        
        // 加载中国地图
        fetch('https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json')
            .then(response => response.json())
            .then(geoJson => {
                echarts.registerMap('china', geoJson);
                
                const option = {
                    backgroundColor: 'transparent',
                    tooltip: {
                        trigger: 'item',
                        backgroundColor: 'rgba(0,0,0,0.8)',
                        borderColor: '#FFD700',
                        borderWidth: 1,
                        textStyle: { color: '#fff' },
                        formatter: function(params) {
                            if (params.seriesType === 'effectScatter') {
                                return `<div style="font-weight:bold">${params.name}</div>
                                        <div>${params.value[2]}</div>`;
                            } else if (params.data && params.data.visited) {
                                const cities = visitedCities
                                    .filter(c => c.province === params.name)
                                    .map(c => c.name)
                                    .join('、');
                                return `<div style="font-weight:bold">${params.name}</div>
                                        <div style="color:#FFD700">已访问城市:${cities}</div>`;
                            }
                            return params.name;
                        }
                    },
                    geo: {
                        map: 'china',
                        roam: true,
                        zoom: 1.2,
                        label: {
                            show: true,
                            color: '#fff',
                            fontSize: 10
                        },
                        itemStyle: {
                            areaColor: 'rgba(200,200,200,0.2)',
                            borderColor: '#404a59',
                            borderWidth: 1
                        },
                        emphasis: {
                            label: { color: '#fff' },
                            itemStyle: {
                                areaColor: '#FFD700'
                            }
                        }
                    },
                    series: [
                        // 省份地图系列 - 设置访问过的省份颜色
                        {
                            name: '省份',
                            type: 'map',
                            map: 'china',
                            geoIndex: 0,
                            data: geoJson.features.map(feature => {
                                const provinceName = feature.properties.name;
                                const isVisited = visitedProvinces.includes(provinceName);
                                return {
                                    name: provinceName,
                                    value: isVisited ? 1 : 0,
                                    visited: isVisited,
                                    itemStyle: isVisited ? {
                                        areaColor: {
                                            type: 'linear',
                                            x: 0, y: 0, x2: 0, y2: 1,
                                            colorStops: [
                                                { offset: 0, color: '#FF6B6B' },
                                                { offset: 1, color: '#FF8E53' }
                                            ]
                                        },
                                        shadowBlur: 10,
                                        shadowColor: 'rgba(255,107,107,0.5)'
                                    } : {
                                        areaColor: 'rgba(148,163,184,0.3)'
                                    }
                                };
                            })
                        },
                        // 城市标记点 - 独立的点,无连线
                        {
                            name: '城市',
                            type: 'effectScatter',
                            coordinateSystem: 'geo',
                            data: visitedCities,
                            symbolSize: 12,
                            showEffectOn: 'render',
                            rippleEffect: {
                                brushType: 'stroke',
                                scale: 3,
                                period: 4
                            },
                            label: {
                                show: true,
                                position: 'top',
                                formatter: '{b}',
                                color: '#fff',
                                fontSize: 12,
                                fontWeight: 'bold',
                                backgroundColor: 'rgba(0,0,0,0.5)',
                                padding: [4, 8],
                                borderRadius: 4
                            },
                            itemStyle: {
                                color: '#FFD700',
                                shadowBlur: 10,
                                shadowColor: '#FFD700'
                            },
                            emphasis: {
                                scale: 1.5,
                                label: { fontSize: 14 }
                            },
                            zlevel: 1
                        }
                    ]
                };
                
                myChart.setOption(option);
                
                // 点击事件
                myChart.on('click', function(params) {
                    if (params.componentType === 'series' && params.seriesType === 'map') {
                        if (params.data.visited) {
                            console.log('点击了已访问省份:', params.name);
                        }
                    }
                });
            })
            .catch(err => {
                console.error('地图加载失败:', err);
                chartDom.innerHTML = '<div style="color:#fff;text-align:center;padding-top:50px;">地图加载失败,请检查网络连接</div>';
            });
        
        // 响应式调整
        window.addEventListener('resize', function() {
            myChart.resize();
        });
    </script>
</body>
</html>
主要改动:
  • 移除了飞线连接:删除了之前代码中的 lines series,城市点现在完全独立显示
  • 省份高亮:北京、辽宁、河北、山西、广东、四川、湖北这7个省份会显示为橙红色渐变
  • 城市标记:8个去过的城市用金色脉冲光点标记,互不相连
现在地图只显示你点亮过的省份和标记的城市点,它们之间没有任何连线关系。
没有点亮!现在所有板块都是一个颜色!!!给我改!!!
为省份设置 itemStyle 或 visualMap 区分访问状态颜色显示区
用户说"没有点亮!现在所有板块都是一个颜色",这意味着省份的高亮没有生效。让我分析一下代码可能的问题:
  1. 代码中使用了 geoIndex: 0 在 map series 中,这表示使用 geo 组件的样式,可能导致 itemStyle 被覆盖。
  2. 可能需要在 map series 中明确设置 itemStyle 而不是依赖 data 中的 itemStyle。
  3. 或者需要检查 geo 组件的 itemStyle 是否覆盖了 series 的 itemStyle。
问题可能在于:当使用 geoIndex: 0 时,map series 会继承 geo 的样式,导致 data 中的 itemStyle 不生效。
解决方案:
  • 去掉 geoIndex: 0,让 map series 独立渲染,这样 data 中的 itemStyle 就能生效。
  • 或者调整 geo 的 itemStyle,但更好的方法是让 map series 独立。
另外,用户说"所有板块都是一个颜色",说明高亮逻辑没有生效。我需要确保:
  1. 每个省份在 data 中都有对应的 itemStyle
  2. 不使用 geoIndex,或者正确处理样式层级
让我重新编写代码,确保:
  1. 明确为每个访问过的省份设置 visualMap 或者在 data 中设置 itemStyle
  2. 不使用 geoIndex,直接渲染 map series
  3. 确保未访问的省份是暗色,访问过的是亮色
实际上,更简单的方法是使用 visualMap 组件来根据数值映射颜色,或者确保 map series 的 itemStyle 正确应用。
我重新组织代码结构:
  • 使用 map series 作为底图
  • 不使用 geo 组件(或者使用但确保不覆盖)
  • 明确设置每个省份的颜色
或者,我可以使用 regions 在 geo 组件中直接设置特定区域的样式,这样更简单可靠。
最佳方案:在 geo 组件中使用 regions 属性来为特定省份设置样式,这样确保一定会生效。
抱歉!问题在于 geoIndex 导致样式被覆盖了。我改用更可靠的方式:直接在 geo 组件里为访问过的省份设置高亮颜色,确保一定会生效。
HTML
预览
复制
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>我的旅行足迹地图</title>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/echarts.min.js"></script>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        
        body {
            font-family: 'Segoe UI', 'Microsoft YaHei', sans-serif;
            background: linear-gradient(135deg, #0f2027 0%, #203a43 50%, #2c5364 100%);
            min-height: 100vh;
            display: flex;
            flex-direction: column;
            align-items: center;
            padding: 20px;
        }
        
        h1 {
            color: #fff;
            margin-bottom: 10px;
            text-shadow: 0 0 20px rgba(255,215,0,0.5);
            font-size: 32px;
            letter-spacing: 2px;
        }
        
        .subtitle {
            color: rgba(255,255,255,0.7);
            margin-bottom: 20px;
            font-size: 16px;
        }
        
        #map-container {
            width: 95%;
            max-width: 1200px;
            height: 650px;
            background: rgba(0,0,0,0.3);
            border-radius: 20px;
            box-shadow: 0 20px 60px rgba(0,0,0,0.5);
            border: 1px solid rgba(255,255,255,0.1);
            position: relative;
            overflow: hidden;
        }
        
        .stats {
            margin-top: 30px;
            display: flex;
            gap: 40px;
            color: #fff;
            flex-wrap: wrap;
            justify-content: center;
        }
        
        .stat-item {
            background: rgba(255,255,255,0.1);
            padding: 20px 30px;
            border-radius: 15px;
            text-align: center;
            backdrop-filter: blur(10px);
            border: 1px solid rgba(255,215,0,0.3);
            transition: transform 0.3s;
        }
        
        .stat-item:hover {
            transform: translateY(-5px);
            background: rgba(255,255,255,0.15);
        }
        
        .stat-number {
            font-size: 32px;
            font-weight: bold;
            color: #FFD700;
            display: block;
            text-shadow: 0 0 10px rgba(255,215,0,0.5);
        }
        
        .stat-label {
            font-size: 14px;
            margin-top: 8px;
            opacity: 0.9;
            color: rgba(255,255,255,0.8);
        }
        
        @media (max-width: 768px) {
            #map-container { height: 450px; width: 95%; }
            h1 { font-size: 24px; }
            .stats { gap: 15px; }
            .stat-item { padding: 15px 20px; }
        }
    </style>
</head>
<body>
    <h1>🗺️ 我的旅行足迹</h1>
    <p class="subtitle">点亮每一座到访的城市</p>
    
    <div id="map-container"></div>
    
    <div class="stats">
        <div class="stat-item">
            <span class="stat-number">8</span>
            <div class="stat-label">探索城市</div>
        </div>
        <div class="stat-item">
            <span class="stat-number">7</span>
            <div class="stat-label">点亮省份</div>
        </div>
        <div class="stat-item">
            <span class="stat-number">北方</span>
            <div class="stat-label">最远到达</div>
        </div>
        <div class="stat-item">
            <span class="stat-number">南方</span>
            <div class="stat-label">足迹跨度</div>
        </div>
    </div>

    <script>
        const chartDom = document.getElementById('map-container');
        const myChart = echarts.init(chartDom);
        
        // 访问过的城市
        const visitedCities = [
            { name: '北京', value: [116.4074, 39.9042], province: '北京市' },
            { name: '沈阳', value: [123.4315, 41.8057], province: '辽宁省' },
            { name: '邢台', value: [114.5047, 37.0659], province: '河北省' },
            { name: '大同', value: [113.3004, 40.0768], province: '山西省' },
            { name: '深圳', value: [114.0579, 22.5431], province: '广东省' },
            { name: '广州', value: [113.2644, 23.1291], province: '广东省' },
            { name: '成都', value: [104.0668, 30.5728], province: '四川省' },
            { name: '武汉', value: [114.3054, 30.5931], province: '湖北省' }
        ];
        
        // 必须点亮的省份配置(关键部分)
        const highlightedProvinces = [
            { name: '北京市', itemStyle: { areaColor: '#FF6B6B' } },
            { name: '辽宁省', itemStyle: { areaColor: '#FF6B6B' } },
            { name: '河北省', itemStyle: { areaColor: '#FF6B6B' } },
            { name: '山西省', itemStyle: { areaColor: '#FF6B6B' } },
            { name: '广东省', itemStyle: { areaColor: '#FF6B6B' } },
            { name: '四川省', itemStyle: { areaColor: '#FF6B6B' } },
            { name: '湖北省', itemStyle: { areaColor: '#FF6B6B' } }
        ];
        
        fetch('https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json')
            .then(response => response.json())
            .then(geoJson => {
                echarts.registerMap('china', geoJson);
                
                const option = {
                    backgroundColor: 'transparent',
                    tooltip: {
                        trigger: 'item',
                        backgroundColor: 'rgba(0,0,0,0.8)',
                        borderColor: '#FFD700',
                        borderWidth: 2,
                        textStyle: { color: '#fff', fontSize: 14 },
                        formatter: function(params) {
                            if (params.seriesType === 'effectScatter') {
                                return `<div style="font-weight:bold;font-size:16px">${params.name}</div>`;
                            }
                            // 检查是否是点亮的省份
                            const isHighlighted = highlightedProvinces.find(p => p.name === params.name);
                            if (isHighlighted) {
                                const cities = visitedCities
                                    .filter(c => c.province === params.name)
                                    .map(c => c.name)
                                    .join('、');
                                return `<div style="font-weight:bold;font-size:16px;color:#FFD700">${params.name}</div>
                                        <div style="margin-top:5px">足迹:${cities}</div>`;
                            }
                            return params.name;
                        }
                    },
                    // 关键:在 geo 中使用 regions 明确指定省份颜色
                    geo: {
                        map: 'china',
                        roam: true,
                        zoom: 1.2,
                        label: {
                            show: true,
                            color: '#fff',
                            fontSize: 11,
                            textBorderColor: '#000',
                            textBorderWidth: 1
                        },
                        itemStyle: {
                            areaColor: 'rgba(70,130,180,0.3)',  // 未访问的省份颜色(暗蓝灰色)
                            borderColor: '#1e3a5f',
                            borderWidth: 1.5,
                            shadowColor: 'rgba(0,0,0,0.5)',
                            shadowBlur: 10
                        },
                        emphasis: {
                            label: { color: '#FFD700', fontSize: 13 },
                            itemStyle: {
                                areaColor: '#FFD700'  // 鼠标悬停颜色
                            }
                        },
                        // 核心:为特定省份设置样式,确保点亮
                        regions: highlightedProvinces.map(prov => ({
                            name: prov.name,
                            itemStyle: {
                                areaColor: '#FF4757',  // 亮红色
                                shadowBlur: 20,
                                shadowColor: 'rgba(255,71,87,0.6)'
                            },
                            emphasis: {
                                itemStyle: {
                                    areaColor: '#FF6348'  // 悬停时更亮
                                }
                            }
                        }))
                    },
                    series: [
                        // 城市标记点
                        {
                            name: '城市',
                            type: 'effectScatter',
                            coordinateSystem: 'geo',
                            data: visitedCities.map(city => ({
                                name: city.name,
                                value: [...city.value, city.province]
                            })),
                            symbolSize: 15,
                            showEffectOn: 'render',
                            rippleEffect: {
                                brushType: 'stroke',
                                scale: 4,
                                period: 5
                            },
                            label: {
                                show: true,
                                position: 'top',
                                formatter: '{b}',
                                color: '#fff',
                                fontSize: 13,
                                fontWeight: 'bold',
                                backgroundColor: 'rgba(0,0,0,0.7)',
                                padding: [5, 10],
                                borderRadius: 4,
                                borderColor: '#FFD700',
                                borderWidth: 1
                            },
                            itemStyle: {
                                color: '#FFD700',
                                shadowBlur: 20,
                                shadowColor: '#FFD700'
                            },
                            emphasis: {
                                scale: 2,
                                label: { fontSize: 15 }
                            },
                            zlevel: 2
                        }
                    ]
                };
                
                myChart.setOption(option);
            })
            .catch(err => {
                console.error('地图加载失败:', err);
                chartDom.innerHTML = '<div style="color:#fff;text-align:center;padding-top:100px;font-size:18px">地图数据加载失败,请刷新重试</div>';
            });
        
        window.addEventListener('resize', () => myChart.resize());
    </script>
</body>
</html>
关键修复:
  1. regions 属性:在 geo 组件中直接使用 regions 数组,强制指定每个访问过的省份颜色为亮红色(#FF4757),这是 ECharts 中最可靠的省份着色方式
  2. 未访问省份:设置为半透明的暗蓝灰色(rgba(70,130,180,0.3)),与点亮的省份形成鲜明对比
  3. 发光效果:点亮的省份添加了红色阴影发光(shadowBlur: 20),看起来像是被"点亮"的状态
现在刷新页面,你会看到:北京、辽宁、河北、山西、广东、四川、湖北这7个省份显示为亮红色,其他省份保持暗灰色,对比非常明显!