echarts使用3d地图,解决塌陷

3 篇文章 0 订阅
3 篇文章 0 订阅

echarts使用3d地图打点

先上图
在这里插入图片描述
1、要提前准备好 茂名市.json文件,在使用的时候使用axios异步加载,如果是加载3d省级或者省以上可以参考这篇的引入方式

2、还要安装一些依赖包

1.依赖包:
npm install echarts -S
npm install echarts-gl -S
2、main.js:
import echarts from 'echarts'
import 'echarts-gl'
Vue.prototype.$echarts = echarts

下面直接粘代码吧,跟平常使用echarts 差不多

<template>
    <div id="mapinfo" ref="map" :style="{width: '100%', height: `${info_canvas}`}" />
</template>
<script>
export default {
	data(){
	   return{
      	 info_canvas: '56vh',
      }
	},
    mounted () {
      this.mapInit()
    },
	methods:{
	  mapInit () {
      const self = this
      this.$axios.$get('./json/maoming.json').then((data) => {
      //文件路径要写对我是放到static的文件夹中,看个人需求
        const d = []
        for (let i = 0; i < data.features.length; i++) {
          d.push({
            name: data.features[i].properties.name,
            value: Math.ceil(Math.random() * 10)
          })
        }
        self.$echarts.registerMap('maoming', data)
        this.glInit('maoming', d)
      })
    },
    glInit (map, d) {
      // const self = this
      const geoCoordMap = {
        '电白浪漫海岸': [111.142701, 21.463603],
        '茂名放鸡岛': [111.237028, 21.480818],
        '高州玉湖景区': [111.0208, 22.044275],
        '高州洗太庙': [110.857382, 21.916856],
        '茂名森林公园': [110.824607, 21.62663],
        '浮山岭': [111.105659, 21.78524],
        '水东湾第一滩': [111.052591, 21.455947],
        '西江温泉': [110.830265, 22.307987],
        '化州南山寺': [110.635421, 21.75426],
        '': [110.635421, 21.75426]
      }
      //最后的空的是给一个最小值这样打的点不会塌陷到地图里面。
      // eslint-disable-next-line no-unused-vars
      const convertData = function (data) {
        const res = []
        for (let i = 0; i < data.length; i++) {
          const geoCoord = geoCoordMap[data[i].name]
          if (geoCoord) {
            res.push({
              name: data[i].name,
              value: geoCoord.concat(data[i].value)
            })
          }
        }
        return res
      }
      const iconLD = 'path://M512 144.896c-141.312 0-256.512 115.2-256.512 256.512 0 178.688 164.864 372.224 227.328 445.44 9.728 11.776 15.872 18.944 18.432 22.528 2.56 3.584 6.656 5.632 10.752 5.632 3.584 0 7.168-1.536 9.728-4.096l1.024-1.024 0.512-1.024c2.048-3.072 7.68-9.728 18.944-23.04 61.952-73.728 226.816-268.8 226.816-444.416C768.512 260.096 653.312 144.896 512 144.896z m0 352.256c-52.736 0-95.744-43.008-95.744-95.744s43.008-95.744 95.744-95.744 95.744 43.008 95.744 95.744-43.008 95.744-95.744 95.744z'
      const mapOption = {
        title: {
          text: '',
          x: 'left',
          top: '10',
          textStyle: {
            color: '#000',
            fontSize: 14
          }
        },
        tooltip: {
          show: true
          // formatter:(params)=>{
          //   let data = "测试1:"+params.name + "<br/>"+"值:"+ params.value[2]+"<br/>"+"地理坐标:[" + params.value[0]+","+params.value[1] +"]";
          //   return data;
          // },
        },
        // 数据映射
        visualMap: [{
          show: true,
          type: 'piecewise',

          itemWidth: 20, // 图形的宽度,即长条的宽度。
          itemHeight: 40,
          // text: ['bar3D'],
          calculable: true,
          categories: ['4A', '3A', '其他'],
          textStyle: {
            color: '#fff'
          },
          inRange: {
            symbol: iconLD,
            color: ['#D65769', '#D9C124', '#32F597']
          },
          dimension: [
            [{ name: '4A' }],
            [{ name: '3A' }],
            [{ name: '其他' }]
          ], // 指定用数据的『哪个维度』,映射到视觉元素上。『数据』即 series.data。 可以把 series.data 理解成一个二维数组,其中每个列是一个维度,默认取 data 中最后一个维度
          seriesIndex: 3
        }],
        geo3D: {
          map,
          roam: true,
          boxDepth: 100, // 地图倾斜度
          regionHeight: 2, // 地图厚度
          label: {
            // show: true,
            textStyle: {
              color: '#fff', // 地图初始化区域字体颜色
              fontSize: 15,
              opacity: 1,
              backgroundColor: 'rgba(0,23,11,0)'
            }
          },
          itemStyle: {
            opacity: 1, // 透明度
            color: '#4575b4', // 地图颜色
            borderWidth: 1.5, // 分界线宽度
            borderColor: '#111C49' // 分界线颜色
          },
          emphasis: {
            label: {
              show: false, // 是否显示标签
              textStyle: {
                color: 'yellow', // 高亮文字颜色
                fontSize: 32,
                fontFamily: '微软雅黑'
              }
            }
          },
          viewControl: {
            distance: 140, // 地图视角 控制初始大小
            rotateSensitivity: 1, // 旋转
            zoomSensitivity: 1, // 缩放
            autoRotate: true,
            minBeta: -360,
            maxBeta: 360
          },
          light: { // 光照阴影
            main: {
              color: '#fff', // 光照颜色
              intensity: 1.2, // 光照强度
              shadowQuality: 'high', // 阴影亮度
              shadow: false, // 是否显示阴影
              alpha: 55,
              beta: 10
            },
            ambient: {
              intensity: 0.3
            }
          },
          shading: 'realistic',
          realisticMaterial: {
            detailTexture: '#fff', // 纹理贴图
            textureTiling: 1, // 纹理平铺,1是拉伸,数字表示纹理平铺次数
            roughness: 0, // 材质粗糙度,0完全光滑,1完全粗糙
            metalness: 0, // 0材质是非金属 ,1金属
            roughnessAdjust: 0
          },
          groundPlane: {
            show: false
          }
        },
        series: [
          {
            name: '4A',
            type: 'scatter3D',
            coordinateSystem: 'geo3D',
            minHeight: 3,
            symbol: `${iconLD}`,
            symbolSize: [20, 40],
            opacity: 1,
            label: {
              show: true,
              formatter: '{b}'
            },
            itemStyle: {
              color: '#D65769'
            },
            data: convertData([{
              name: '电白浪漫海岸',
              value: ((Math.random() * 100) + 100).toFixed(2)
            }, {
              name: '茂名放鸡岛',
              value: ((Math.random() * 100) + 100).toFixed(2)
            }, {
              name: '高州玉湖景区',
              value: ((Math.random() * 100) + 100).toFixed(2)
            }])
          }, {
            name: '3A',
            type: 'scatter3D',
            coordinateSystem: 'geo3D',
            // symbol: 'pin',
            minHeight: 3,
            symbol: `${iconLD}`,
            symbolSize: [20, 40],
            opacity: 1,
            label: {
              show: true,
              formatter: '{b}'
            },
            itemStyle: {
              color: '#D9C124'
              // borderWidth: 0.5,
              // borderColor: '#fff'
            },
            data: convertData([{
              name: '高州洗太庙',
              value: ((Math.random() * 100) + 100).toFixed(2)
            }, {
              name: '茂名森林公园',
              value: ((Math.random() * 100) + 100).toFixed(2)
            }, {
              name: '浮山岭',
              value: ((Math.random() * 100) + 100).toFixed(2)
            }])
          }, {
            name: '其他',
            type: 'scatter3D',
            coordinateSystem: 'geo3D',
            // symbol: 'pin',
            symbolSize: [20, 40],
            opacity: 1,
            minHeight: 3,
            symbol: `${iconLD}`,
            // symbol: 'pin',
            label: {
              show: true,
              formatter: '{b}'
            },
            itemStyle: {
              color: '#32F597'
            },
            data: convertData([{
              name: '水东湾第一滩',
              value: ((Math.random() * 100) + 100).toFixed(2)
            }, {
              name: '西江温泉',
              value: ((Math.random() * 100) + 100).toFixed(2)
            }, {
              name: '化州南山寺',
              value: ((Math.random() * 100) + 100).toFixed(2)
            }])
          }, {

            type: 'scatter3D',
            coordinateSystem: 'geo3D',
            // symbol: 'pin',
            symbolSize: [0, 0],
            opacity: 0,
            minHeight: 0,
            symbol: `${iconLD}`,
            // symbol: 'pin',
            label: {
              show: true,
              formatter: '{b}'
            },
            itemStyle: {
              color: '#32F597'
            },
            data: convertData([{
              name: '',
              value: 0
            }])
          }
        ]
      }
      console.log(mapOption)
      const myChart = this.$echarts.init(this.$refs.map)
      myChart.setOption(mapOption)
    },
	}
}
</script>

参考链接中国地图的3d渲染

使用 echarts 实现 3D 地图加热力图效果,可以按照以下步骤进行: 1. 准备地图数据:需要准备一个包含地理信息的数据集,比如 GeoJSON 格式的数据,用来绘制地图。 2. 准备热力数据:需要准备一个包含每个地理位置的热力值的数据集,可以是一个数组,也可以是一个对象数组。 3. 配置 echarts 的 option:需要在 option 中配置地图类型、地图数据、热力数据、热力图颜色等相关信息。 4. 渲染 echarts 图表:将配置好的 option 传入 echarts 实例的 setOption 方法中,即可渲染出 3D 地图加热力图效果。 以下是一个简单的示例代码: ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>3D 地图加热力图效果</title> <script src="https://cdn.jsdelivr.net/npm/echarts@5.1.0/dist/echarts.min.js"></script> </head> <body> <div id="map" style="width: 800px; height: 600px;"></div> <script> // 准备地图数据 var geoCoordMap = { "北京": [116.46, 39.92], "上海": [121.48, 31.22], "广州": [113.23, 23.16], "深圳": [114.07, 22.62], "成都": [104.06, 30.67], // 其他城市... }; var geoData = Object.keys(geoCoordMap).map(function (name) { return { name: name, value: geoCoordMap[name].concat(Math.random() * 100) } }); // 准备热力数据 var heatData = geoData.map(function (item) { return { name: item.name, value: item.value[2] } }); // 配置 echarts 的 option var option = { tooltip: {}, geo3D: { map: 'china', roam: true, itemStyle: { areaColor: '#1B1B1B', borderColor: '#404a59' }, light: { main: { intensity: 1, shadow: true }, ambient: { intensity: 0.3 } } }, series: [{ type: 'scatter3D', coordinateSystem: 'geo3D', symbolSize: 10, label: { show: false }, itemStyle: { color: '#ddb926' }, data: geoData }, { type: 'heatmap', coordinateSystem: 'geo3D', data: heatData, itemStyle: { color: 'red' } }] }; // 渲染 echarts 图表 var chart = echarts.init(document.getElementById('map')); chart.setOption(option); </script> </body> </html> ``` 需要注意的是,这里使用的是 echarts 5.x 版本,其中的 geo3D 组件是 3D 地图组件,heatmap 组件是热力图组件。在配置 option 时,需要将它们分别配置好,并指定 coordinateSystem 为 geo3D
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值