vue使用vue-mapvgl实现烟台市各区县行政区绘制、三维柱状图

news/2024/7/9 23:59:35 标签: 前端, vue, 可视化, mapvgl

一、效果展示

在这里插入图片描述

vuemapvgl_3">二、地图组件: vue-mapvgl

https://docs.guyixi.cn/vue-mapvgl/#/

三、代码

main.js

//vue-mapvGL
import VueBMap from 'vue-bmap-gl';
import 'vue-bmap-gl/dist/style.css'
import VueMapvgl  from 'vue-mapvgl';
Vue.use(VueBMap);
Vue.use(VueMapvgl);
VueBMap.initBMapApiLoader({
  ak: ak,
  v: '1.0'
});

yantaiMap.vue

<template>

    <div class="globalLayout">
		<el-bmap vid="bmapDemo" ref="bmapDemo" :mapStyleV2="mapStyle" :tilt="60" :heading="0" 		:zoom="zoom" :center="center" class="bmap-View">
            <el-bmapv-view>
              <el-bmapv-bar-layer 
                :data="barData" 
                :edge-count="50" 
                :size = "200">
                </el-bmapv-bar-layer>
                <el-bmapv-ripple-layer 
                  :data="rippleData"
                  >
                </el-bmapv-ripple-layer>
                <el-bmapv-polygon-layer  v-for="(item,index) in yantaiGeometry"
                  :key="'yantai'+index"
                  :enablePicked="true"
                  selectedColor="rgba(42, 109, 249, 1)"
                  line-join="miter" 
                  line-color="rgba(137, 227, 250, 1)" 
                  fillColor="rgba(26, 72, 224, .7)" 
                  :line-width="2" 
                  :data="item"
                  >
                </el-bmapv-polygon-layer>
            </el-bmapv-view>
          </el-bmap>

    </div>
  </template>

  <script>
  //百度个性定制https://lbsyun.baidu.com/apiconsole/custommap
  import styleJson from '../../assets/baiduMap/mapStyle.json'
  //烟台地图geoJson
  //https://geo.datav.aliyun.com/areas_v3/bound/370600_full.json
  import yantaiJson from '../../assets/baiduMap/yantai.json'

    export default {
      name: 'bmap-page',
      computed:{
        mapStyle:function(){
          let style = {
            styleJson:styleJson
          }
          return style;
        }
        yantaiGeometry:function(){
          let arr = yantaiJson.features;
          let mapArr = []
          arr.forEach((item,index) => {
            let regionName = item.properties.name;
            let geometry = item.geometry;
            let mapItem = [{
              regionName,
              geometry,
              properties:{
                height:5
              }
            }]
            mapArr.push(mapItem);
          });
          return mapArr;
        },
        lineData:function(){
           let line = [{
              geometry:yantaiJson.features[0].geometry ,
              properties: {
                  height: 500
              }
          }]
          return line;
        }
      },
      data() {

        return {
          boxBackgroundColor:'rgba(0, 11, 41, .7)',
          count: 1,
          zoom: 10,
          center: [120.786975, 36.943199],
          barData:[
            {
              geometry: {
                  type: 'Point',
                  coordinates: [121.05863804, 37.34544754],
              },
              value: [100,150,150,80],
              height: function (value, index, array) {
                  return value * 100;
              },
              size: 2 * 1000,
              color: ['rgba(9, 244, 162, 1)', 'rgba(253, 230, 84, 1)',  'rgba(255, 143, 28, 1)','rgba(251, 70, 41, 1)']
            },
            {
              geometry: {
                  type: 'Point',
                  coordinates: [120.70863804, 37.00544754],
              },
              value: [50,100,50,50],
              height: function (value, index, array) {
                  return value * 100;
              },
              size: 2 * 1000,
              color: ['rgba(9, 244, 162, 1)', 'rgba(253, 230, 84, 1)',  'rgba(255, 143, 28, 1)','rgba(251, 70, 41, 1)']
            },
            {
              geometry: {
                  type: 'Point',
                  coordinates: [121.35863804, 37.34544754],
              },
              value: [100,100,50,20],
              height: function (value, index, array) {
                  return value * 100;
              },
              size: 2 * 1000,
              color: ['rgba(9, 244, 162, 1)', 'rgba(253, 230, 84, 1)',  'rgba(255, 143, 28, 1)','rgba(251, 70, 41, 1)']
            },
          ],
          sparkHeight(data){
            return data.properties.height;
          },
          rippleData: [
              {
                geometry: {
                    type: 'Point',
                    coordinates: [120.84443667, 37.29848811],
                },
                properties: {
                  size: 100,
                  color: '#ffeb3b'
                }
              },
            ]

        };
      },
      mounted(){
        console.log(this.yantaiGeometry)
      },
      methods: {
      }
    };
</script>

四、心路历程

搞了两天终于出来比较满意的效果。下面讲讲我的试错历程:

最开始使用vue-baidu-map,vue-baidu-map使用的百度api是2.0版本,地图渲染采用的是瓦片图,使用map.setMapStyle个性定制地图是总会出现瓦片图片加载失败的情况,体验感不好。在网上搜解决方案是使用3.0版本,map.setMapStyleV2,3.0版本使用webGl渲染图片。3.0没有瓦片加载失败的问题,但是当按住鼠标拖拽是页面会有重影,这个问题不知如何解决。使用3.0还有一个问题就是使用new BMap.Boundary()绘制行政区域回报错,可能是api升级方法改了?没有时间做研究着急要效果,在网上搜到了vue-mapvgl这个地图组件库。于是舍弃之前的方法,尝试使用vue-mapvgl

vue-baidu-map api改为3.0版本参考文章:
https://www.cnblogs.com/raonet/p/14898367.html

最终,使用vue-mapvgl的平面图层el-bmapv-polygon-layer实现行政区域绘制,这里讲一下思路。
vue-mapvgl官网给出的el-bmapv-polygon-layer绘制平面图层所需的数据格式

 //vue-mapvgl官网给出的el-bmapv-polygon-layer绘制平面图层所需的数据格式
 data: [{
       geometry: {
           type: 'Polygon',
           coordinates: [
             [
                 [121.5273285, 31.21515044],
                 [121.5373285, 31.21515044],
                 [121.5373285, 31.22515044],
                 [121.5273285, 31.22515044]
             ]
           ],
       },
       properties: {
           height: 0
       }
   }]

烟台geoJson的数据,这里推荐一个json可视化工具,很好用。https://altearius.github.io/tools/json/index.html
在这里插入图片描述

绘制区域只需要geoJson中的geometry数据即可,烟台地图geoJson里有每个区的geometry,所以只需要把这些数据拿出来就可以了;

yantaiGeometry:function(){
          let arr = yantaiJson.features;
          let mapArr = []
          arr.forEach((item,index) => {
            let regionName = item.properties.name;
            let geometry = item.geometry;
            let mapItem = [{
              regionName,//区县的名称
              geometry,//绘制平面图层需要的数据
              properties:{
                height:5
              }
            }]
            mapArr.push(mapItem);
          });
          return mapArr;
        },

以上实现了烟台市各区县行政区绘制,但是有一个问题截止到2023–04-21,从各个平台找的geoJson都没有高新区,为了解决这个问题,我打算使用阿里云的数据可视化地图边界生成器,大致画一下高新区,在使用得到的GeoJson绘制高新区。因为我们的项目对具体的地理位置要求不严格,只是做一个地图的可视化展示,所以地图上有高新区的大致位置就可以了。
http://datav.aliyun.com/portal/school/atlas/area_generator#10.04/121.482587/37.461168
在这里插入图片描述


http://www.niftyadmin.cn/n/248250.html

相关文章

KMP算法原理原来这么简单

我觉得这句话说的很好&#xff1a; kmp算法关键在于&#xff1a;在当前对文本串和模式串检索的过程中&#xff0c;若出现了不匹配&#xff0c;如何充分利用已经匹配的部分&#xff0c;来继续接下来的检索。 暴力解决字符串匹配 暴力解法就是两层for循环,每次都一对一的匹配&…

day18_集合

今日内容 零、 复习昨日 一、集合框架体系 二、Collection 三、泛型 四、迭代 五、List 六、ArrayList 七、LinkedList 零、 复习昨日 晨考 一、集合框架体系 数组: 是一个容器,用来存放数据的 定长只能存储同一种数据类型的数据int[] 可以存储int值,Student[] 可以存储引用类型…

Shell基础之Bash变量

一、用户自定义变量 1、什么是变量 变量是计算机程序中的一种基本概念&#xff0c;用于保存和处理数据。在程序中&#xff0c;我们可以将变量看作一种“容器”或“盒子”&#xff0c;它们用来存储各种类型的值&#xff0c;并且可以随时修改和访问。在Shell中&#xff0c;变量…

链表方式实现栈和队列(C语言)

目录 栈 队列 栈 栈&#xff08;Stack&#xff09;是一种常见的数据结构&#xff0c;它是一种线性数据结构&#xff0c;具有后进先出&#xff08;Last In First Out, LIFO&#xff09;的特点。栈可以看作是一个容器&#xff0c;只能在容器的一端进行插入和删除操作&#xff0c…

# 生成器

生成器 生成器是什么&#xff1f; 生成器&#xff08;generator&#xff09;是一种用来生成数据的对象。它们是普通函数的一种特殊形式&#xff0c;可以用来控制数据的生成过程。 生成器有什么优势&#xff1f; 使用生成器的优势在于它们可以在生成数据的同时控制数据的生成过程…

【12 Filter 学习笔记】

Filter 笔记记录 1. Filter 过滤器2. Filter介绍3. FilterChain3. Filter 过滤器的使用4. 过滤器使用细节5. Filter的声明周期6. FilterConfig7. 过滤器五种拦截行为 1. Filter 过滤器 2. Filter介绍 3. FilterChain 3. Filter 过滤器的使用 import javax.servlet.ServletExcep…

某医院访问医保系统慢流量分析案例

背景 我们已将NetInside流量分析系统部署到某市人民医院的机房内&#xff0c;使用流量分析系统提供实时和历史原始流量。本次分析重点针对访问外网医保系统性能进行分析&#xff0c;以供安全取证、性能分析、网络质量监测以及深层网络分析。 分析时间 报告分析时间范围为&am…

用C++实现生成树协议

实现STP协议的C程序涉及许多方面&#xff0c;包括数据结构设计、消息传递、算法等。在此&#xff0c;我将简要概述一个基本的STP实现框架&#xff0c;包括所需的数据结构和关键算法。您可以根据需求在此基础上进行拓展。 首先&#xff0c;定义表示桥接器和端口的数据结构&…