Vite+Vue+iClient for Leaflet引入并实现MapV/Eharts第三方可视化库示例

news2024/12/27 10:10:25

作者:gaogy

文章目录

  • 背景
  • 一、使用Vite构建Vue3+JavaScript项目
  • 二、搭建iClient for Leaflet开发环境
  • 三、第三方可视化库Echarts的使用
  • 四、第三方可视化库MapV的使用
  • 五、其他地图库

背景

最近很多小伙伴咨询关于基于Vue3框架搭建iClent开发环境并使用Echarts与MapV等第三方可视化库的问题。本文就以iClient for Leaflet为例,在新一代前端框架构建工具Vite与Vue3项目中,演示如何搭建iClent开发环境并使用Echarts与MapV等第三方可视化库。

本文所使用的依赖与配置项如下:

"@supermap/iclient-leaflet": "^11.0.1",
"vue": "^3.2.47",
"@vitejs/plugin-vue": "^4.1.0",
"vite": "^4.3.2"

一、使用Vite构建Vue3+JavaScript项目

1、运行创建项目命令

npm init vite

2、输入项目名称,选择前端框架为Vue,选择项目类型为JavaScript
在这里插入图片描述

3、执行cd leafletdemo、npm install 与 npm run dev命令
在这里插入图片描述

4、访问http://localhost:5174/,确认项目成功创建
在这里插入图片描述

二、搭建iClient for Leaflet开发环境

1、在命令行中输入以下命令安装 SuperMap iClient for Leaflet:

npm install @supermap/iclient-leaflet

2、在index.html文件的标签中引入 Leaflet CSS 文件和 iclient-leaflet CSS 文件,如下:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" />
    <link rel="stylesheet" href="https://iclient.supermap.io/dist/leaflet/iclient-leaflet.min.css" />
    <title>Vite + Vue + Leaflet</title>
  </head>
  <body>
    <div id="app"></div>
    <script type="module" src="/src/main.js"></script>
  </body>
</html>

3、在componets文件夹中新建一个Map组件,创建一个id为map的div标签,并设置其style样式;使用按需引入方式引入相应模块;然后在methods中写入初始化地图函数init,并在mouted中运行init函数。

<template>
  <div id="map"></div>
</template>

<script>
import L from 'leaflet'
import { TiledMapLayer } from '@supermap/iclient-leaflet'

export default {
  name: 'MapView',
  data() {
    return {
      map: {},
      mapUrl: 'https://iserver.supermap.io/iserver/services/map-china400/rest/maps/China'
    }
  },
  mounted() {
    this.init()
  },
  methods: {
    init() {
      this.map = L.map('map', {
        center: [40, 117],
        maxZoom: 18,
        zoom: 4
      })
      new TiledMapLayer(this.mapUrl).addTo(this.map)
    }
  }
}
</script>

<style>
#map {
  margin: 0;
  padding: 0;
  overflow: hidden;
  background: #fff;
  width: 100%;
  height: 100%;
  position: absolute;
}
</style>

4、在App.vue中引入我们刚才创建的Map组件

<script setup>
import Map from './components/Map.vue'
</script>

<template>
  <Map />
</template>

<style>
body {
  margin: 0;
  padding: 0;
}
</style>

5、使用npm run dev 命令运行项目,在浏览器中打开,发现控制台报如下错误:
在这里插入图片描述

产生原因与解决办法可以参考博客https://blog.csdn.net/supermapsupport/article/details/123569581。首先在package.json>devDependencies里增加

 "events": "^3.3.0",
 "util": "^0.12.4",

在这里插入图片描述

然后在vite.config.js ,增加define配置
在这里插入图片描述

最后ctrl+c结束运行项目,使用那npm install命令安装一下需要的模块后,再使用npm run dev命令运行项目如下:
在这里插入图片描述

至此,iClient for Leaflet开发环境搭建成功

三、第三方可视化库Echarts的使用

由于iclient-leaflet中已经包含了Echarts库,所以在搭建好iClient for Leaflet开发环境后不需要单独下载Echarts库,使用的时候只需要引入echarts模块就行

import echarts from 'echarts'

初始化Echarts实例对象

let div = L.DomUtil.create('div')
this.chart = echarts.init(div, '', {
  width: 600,
  height: 400
})

指定配置项和数据(option)

this.option = {
  title: {
    subtext: '数据纯属虚构'
  },
  tooltip: {
    trigger: 'axis'
  },
  legend: {
    //data:["最高气温"]
    data: ['最高气温', '最低气温']
  },
  toolbox: {
    show: true,
    feature: {
      dataZoom: {
        yAxisIndex: 'none'
      },
      magicType: { type: ['line', 'bar'] },
      restore: {},
      saveAsImage: {}
    }
  },
  xAxis: {
    type: 'category',
    boundaryGap: false,
    data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
  },
  yAxis: {
    type: 'value',
    axisLabel: {
      formatter: '{value} °C'
    }
  },
  series: [
    {
      name: '最高气温',
      type: 'line',
      data: [11, 11, 15, 13, 12, 13, 10],
      markPoint: {
        data: [
          { type: 'max', name: '最大值:' },
          { type: 'min', name: '最小值:' }
        ]
      },
      markLine: {
        data: [
          { type: 'average', name: '平均值' },
          [
            {
              symbol: 'none',
              x: '90%',
              yAxis: 'max'
            },
            {
              symbol: 'circle',
              label: {
                normal: {
                  position: 'start',
                  formatter: '最大值:'
                }
              },
              type: 'max',
              name: '最高点'
            }
          ]
        ]
      }
    },
    {
      name: '最低气温',
      type: 'line',
      data: [1, -2, 2, 5, 3, 2, 0],
      markPoint: {
        data: [
          { type: 'max', name: '最大值:' },
          { type: 'min', name: '最小值:' }
        ]
      },
      markLine: {
        data: [
          { type: 'average', name: '平均值' },
          [
            {
              symbol: 'none',
              x: '90%',
              yAxis: 'min'
            },
            {
              symbol: 'circle',
              label: {
                normal: {
                  position: 'start',
                  formatter: 'Z值范围 最小值:'
                }
              },
              type: 'min',
              name: '最低点'
            }
          ]
        ]
      }
    }
  ]
}
this.chart.setOption(this.option)

在这里使用地图服务查询省会城市,渲染到地图中,并且绑定popup

let param = new QueryBySQLParameters({
  queryParams: [
    {
      name: 'China_ProCenCity_pt@China',
      attributeFilter: '1 = 1'
    },
    {
      name: 'China_Capital_pt@China',
      attributeFilter: '1 = 1'
    }
  ]
})
new QueryService(this.mapChinaUrl).queryBySQL(param, serviceResult => {
  serviceResult.result.recordsets.map(record => {
    that.resultLayer = L.geoJSON(record.features, {
      coordsToLatLng: coords => {
        let latlng = L.CRS.EPSG3857.unproject(L.point(coords[0], coords[1]))
        latlng.alt = coords[2]
        return latlng
      }
    }).bindPopup(
      layer => {
        let city = layer.feature.properties.NAME
        that.chart.setOption({
          title: {
            text: city + '未来一周气温变化'
          },
          series: [
            {
              name: '最高气温',
              data: [10 + Math.ceil(Math.random() * 10), 10 + Math.ceil(Math.random() * 10), 10 + Math.ceil(Math.random() * 10), 10 + Math.ceil(Math.random() * 10), 10 + Math.ceil(Math.random() * 10), 10 + Math.ceil(Math.random() * 10), 10 + Math.ceil(Math.random() * 10)]
            },
            {
              name: '最低气温',
              data: [8 - Math.ceil(Math.random() * 10), 8 - Math.ceil(Math.random() * 10), 8 - Math.ceil(Math.random() * 10), 8 - Math.ceil(Math.random() * 10), 8 - Math.ceil(Math.random() * 10), 8 - Math.ceil(Math.random() * 10), 8 - Math.ceil(Math.random() * 10)]
            }
          ]
        })
        return that.chart.getDom()
      },
      { maxWidth: 700 }
    ).addTo(that.map)
  })
})

运行项目,查看效果如下:
在这里插入图片描述

四、第三方可视化库MapV的使用

由于iclient-leaflet中已经包含了MapV库,所以在搭建好iClient for Leaflet开发环境后不需要单独下载MapV库,使用的时候只需要引入相应模块就行。与Echarts不同的是,MapV的模块需要按需引入,或者使用以下方式全部引入

import * as mapv from 'mapv'

然后,按需引入MapVLayer

import { MapVLayer } from '@supermap/iclient-leaflet'

最后,我们随机构造一些数据作为蜂巢图的数据用于展示。

let randomCount = 1000
let data = []
// 构造数据
while (randomCount--) {
  let cityCenter = mapv.utilCityCenter.getCenterByCityName(this.citys[parseInt(Math.random() * this.citys.length)])
  data.push({
    geometry: {
      type: 'Point',
      coordinates: [cityCenter.lng - 2 + Math.random() * 4, cityCenter.lat - 2 + Math.random() * 4]
    },
    count: 30 * Math.random()
  })
}
let dataSet = new mapv.DataSet(data)
let options = {
  fillStyle: 'rgba(55, 50, 250, 0.8)',
  shadowColor: 'rgba(255, 250, 50, 1)',
  shadowBlur: 20,
  max: 100,
  size: 50,
  unit: 'px', // unit可选值['px', 'm'],默认值为'px'
  label: {
    show: true,
    fillStyle: 'white'
  },
  globalAlpha: 0.5,
  gradient: { 0.25: 'rgb(0,0,255)', 0.55: 'rgb(0,255,0)', 0.85: 'yellow', 1.0: 'rgb(255,0,0)' },
  draw: 'honeycomb'
}
new MapVLayer(dataSet, options).addTo(this.map) //创建MapV图层

运行项目,查看效果如下:
在这里插入图片描述

五、其他地图库

针对iClient for MapboxGL与iClient for OpenLayers引入方式与Leaflet相同,只需替换css、引入模块及初始化代码即可; iClient for Classic 引入地址,安装后按照module中的README进行使用。

完整Demo可参考下载资源,链接: Vite+Vue+iClient for Leaflet引入并实现MapV/Eharts第三方可视化库示例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/547101.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OPEN AI角色插件通道开放接入支持各种细分领域对话场景模型一键接入AI 智能

相信还是有很多伙伴不了解OPEN AI平台 &#xff0c;这里在细说一下 大家知道ChatGPT, 或者百度文心一言 阿里通意千问 包括各种其他的AI 聊天或者画图&#xff0c;等应用层出不穷。 但是我们要自己实现自己 语言大模型&#xff0c;或者说是人工智能应用能不能。 有实力当然可…

C++小项目之文本编辑器mynote(1.0.0版本)

2023年5月19日&#xff0c;周五晚上&#xff1a; 今天晚上突然想写一个运行在命令行上的文本编辑器&#xff0c;因为平时写文本时老是要创建新的文本文件&#xff0c;觉得太麻烦了。捣鼓了一个晚上&#xff0c;才选出一个我觉得比较满意的。我把这个程序添加到了系统环境变量中…

C语言指针学习笔记

1-二维数组指针 int a[3][4]a代表二维数组首元素的地址&#xff0c;此首元素不是一个简单的整形元素&#xff0c;而是由4个整形元素组成的一维数组&#xff0c;因此a代表的是首行&#xff08;序号为0的行&#xff09;的起始地址。a1代表序号为1的行的起始地址。a指向a[0], …

一个月50场面试,跑的慢就抢在别人前面!

300万字&#xff01;全网最全大数据学习面试社区等你来&#xff01; 今天的主人公也是一个应届生新人拿到满意offer的案例。 下面是一些聊天记录和面经&#xff0c;这名同学做的非常好的一个点&#xff0c;他把个人项目中的所用到的技术栈和项目具体的业务流程图以及用到的技术…

2年再见面

我和张哥是在两年前吃过饭&#xff0c;那时候我是在大学城上班。 两年前&#xff0c;张哥在微信上跟我说话&#xff0c;说要来深圳找我&#xff0c;问我什么时间方便&#xff0c;请我吃个便饭。两年前&#xff0c;公众号还比较火热。有挺多人找我做事情&#xff0c;找我做事情之…

桥梁安全监测,智能化桥梁结构健康监测方案

桥梁是现代城市交通网络中不可或缺的组成部分&#xff0c;但由于长期受到自然环境和人为因素的影响&#xff0c;桥梁的安全问题一直备受关注。传统的桥梁检测方式主要是靠人力进行巡查&#xff0c;这种方式效率低下、成本高&#xff0c;而且难以全面掌握桥梁结构的真实情况。随…

回顾 | Let's Learn .NET-通过 Semantic Kernel .NET SDK 管理你的 OpenAI 项目

点击蓝字 关注我们 编辑&#xff1a;Alan Wang 排版&#xff1a;Rani Sun Lets Learn .NET 系列 “Lets Learn .NET” 是面向全球的 .NET 初学者学习系列&#xff0c;旨在通过不同语言&#xff0c;帮助不同地区的开发者掌握最新的 .NET 开发知识与技能。 在 ChatGPT 与 OpenAI…

从零玩转设计模式之简单工厂设计模式-jiandangonchangmoshi

title: 从零玩转设计模式之简单工厂设计模式 date: 2022-12-08 11:31:19.472 updated: 2022-12-11 23:03:34.805 url: https://www.yby6.com/archives/jiandangonchangmoshi categories: - 设计模式 tags: - 设计模式 简单工厂模式是一种创建型设计模式&#xff0c;用于创建单…

Docker安装MinIO教程

本章教程&#xff0c;主要介绍一下&#xff0c;如何在Linux用Docker安装MinIO。 MinIO是一个高性能、分布式对象存储系统&#xff0c;支持S3 API&#xff0c;适用于云原生环境。MinIO可以在标准硬件上运行&#xff0c;并且具有低延迟、高吞吐量、高可用性和可扩展性等优势。Min…

C语言两百行代码实现简易扫雷

文章目录 前言一.代码实现二.设计思路main()函数搭建框架reset ( )函数dis_play( )函数setmine( )函数player_move( )函数 前言 扫雷应该是我们接触到的第一个电脑游戏&#xff0c;用c语言实现扫雷对初学者来说是一个不错的锻炼 编写扫雷只需要用到数组、函数和生成随机数的知…

Java文件与IO流

首先我们要清楚什么是流&#xff0c;正如其名&#xff0c;很形象&#xff0c;流就是像水一样的东西&#xff0c;具有方向性&#xff0c;在java中 &#xff0c;流大概就是类 接下来&#xff0c;我们要对输入输出流有一个基本认识&#xff0c;什么是输入输出流呢&#xff1f; 输入…

漏斗分析、 python学习路径地图、数据科学技能书知识地图、数据安全治理解决方案、AIGC发展研究、经营的本质…| 本周精华...

▲点击上方卡片关注我&#xff0c;回复“8”&#xff0c;加入数据分析领地&#xff0c;一起学习数据分析&#xff0c;持续更新数据分析学习路径相关资料~&#xff08;精彩数据观点、学习资料、数据课程分享、读书会、分享会等你一起来乘风破浪~&#xff09;回复“小飞象”&…

【计算机组成原理】(四)原码补码的加减乘除

各种码的作用&#xff1a; 模运算的性质&#xff1a; -3&#xff08;-1&#xff09;*129 90*129 211*129 332*129 -15&#xff08;-2&#xff09;*129 我们发现等号右边都是9&#xff0c;相当于等号的左边的数除去12的余数都是9 那我们就说这几个等好左边的数&#xff0…

从零玩转设计模式之原型模式-yuanxingmoshi

title: 从零玩转设计模式之原型模式 date: 2022-12-11 20:05:35.488 updated: 2022-12-23 15:35:44.159 url: https://www.yby6.com/archives/yuanxingmoshi categories: - 设计模式 tags: - 设计模式 - 原型模式 什么是原型模式设计模式? 原型模式是一种软件设计模式&#…

【Rust 日报】2023-05-19 Bevy主分支添加了对WebGPU的支持

cascade-protocol Rust实现的 Cascade information reconciliation protocol for Quantum Key Distribution (QKD) 量子键分布&#xff1f;好像是密码学相关的。 隔行如隔山&#xff0c;小编也不懂这个具体是干啥的。感兴趣的同学可以前去研究。 https://github.com/gftea/casc…

SSR 应用与原 CSR 应用变更同步问题实践

在上一篇介绍《天猫汽车商详页的SSR改造实践》一文中提到过&#xff0c;为免影响线上应用&#xff0c;我们的一体化应用&#xff08;后面简称称 SSR 应用&#xff09;是在原 CSR 项目基础上另起的应用仓库。 背景 当商详业务有新需求迭代&#xff0c;CSR 仓库发生了变化&#x…

Java基础学习(18)反射、动态代理

Java基础学习 一、反射1.1 什么是反射1.2 获取class对象 二、综合练习2.1 保存信息2.2 文件的动态创建 三、动态代理3.1 什么是动态代理3.2 创建代理 一、反射 1.1 什么是反射 反射允许对封装类的字段&#xff0c;方法和构造函数的信息进行编程访问 个人理解&#xff1a; 就是…

【JVM】5. 本地方法接口和本地方法栈

文章目录 5.1. 什么是本地方法&#xff1f;5.2. 为什么使用Native Method&#xff1f;5.3. 本地方法栈 5.1. 什么是本地方法&#xff1f; 简单地讲&#xff0c;一个Native Method是一个Java调用非Java代码的接囗。一个Native Method是这样一个Java方法&#xff1a;该方法的实现…

【007】C++数据类型之原码、补码、反码

C数据类型之原码、补码、反码 引言一、原码、补码、反码的概述二、为什么要使用补码&#xff1f;三、对数据的存四、对数据的取总结 引言 &#x1f4a1; 作者简介&#xff1a;专注于C/C高性能程序设计和开发&#xff0c;理论与代码实践结合&#xff0c;让世界没有难学的技术。包…

KingbaseES V8R3 集群运维案例--sys_rewind恢复备库节点

​ 案例说明&#xff1a; 在KingbaseES V8R3集群执行failover切换后&#xff0c;原主库被人为误(未配置recovery.conf)启动&#xff1b;或者人为promote备库为主库后。需要将操作节点再重新加入集群&#xff0c;此时节点与主库的timeline将出现分叉&#xff0c;导致节点直接加入…