Vue 3 + 天地图 + D3.js 绘制行政区划

​🌈个人主页:前端青山
🔥系列专栏:组件封装篇
🔖人终将被年少不可得之物困其一生

依旧青山,本期给大家带来组件封装篇专栏内容:组件封装-天地图

目录

引入天地图 API

初始化地图

引入 D3.js

加载行政区划数据

添加文本标注

vue+天地图+d3.js绘制行政区划

大家好,依旧青山,天地图提供了与可视化库D3.js的快速集成,方便于我们进行开发

以下是我的效果,以天津市滨海新区为例

那么在vue项目中,我们该如何使用,下面以Vue3+Ts项目为例

引入天地图 API
  • index.html 文件中引入天地图 API 4.0 版本。

  • 获取天地图 API 密钥并将其添加到脚本源中。

<script src="http://api.tianditu.gov.cn/api?v=4.0&tk=你的秘钥" type="text/javascript"></script>
初始化地图
  • 创建一个名为 mapDiv 的容器,并设置样式。

  • 在 Vue 组件中使用 onMounted 生命周期钩子初始化天地图实例。

  • 设置地图类型为矢量图,并设置中心点和缩放级别。

然后在页面中渲染天地图

<template><div id="mapDiv" :style="Style"></div>
</template>
<script setup lang="ts">import { ref, onMounted, nextTick, defineProps, defineExpose, defineEmits } from "vue";let map: any = null;let T: any = (window as any).T;const d3 = (window as any).d3const TMAP_VECTOR_MAP = (window as any).TMAP_VECTOR_MAPlet countriesOverlay = new T.D3Overlay(inits,redraw);//初始化地图const initTiandituMap = () => {map = new T.Map("mapDiv");map.setMapType(TMAP_VECTOR_MAP);map.centerAndZoom(new T.LngLat(117.711000,39.003101), 10);map.setStyle('block')};onMounted(() => {nextTick(()=> {initTiandituMap()})})
</script>
<style scoped lang="scss">
::v-deep(.tdt-label){background: none;border: none;color: #fff;-webkit-box-shadow: none;box-shadow: none;padding: 0;line-height: 0.6vw;font-size: 0.6vw;
}
</style>

这样就可以渲染出天地图了

那我们要进行行政区划呢,就需要用到d3.js绘制图形了,官网也是有示例的

首先,我们要拿到各自区域的地图json,如没有可去

DataV.GeoAtlas地理小工具系列

进行取点区域信息等。

引入 D3.js
  • index.html 文件中引入 D3.js 库及其扩展 D3SvgOverlay.js

    <script src="/src/utils/d3/d3.js" charset="utf-8"></script><script src="/src/utils/d3/D3SvgOverlay.js"></script>

点击下方链接进入下载d3.js和 D3SvgOverlay.js

https://download.csdn.net/download/2302_76329106/89651918?spm=1001.2014.3001.5503icon-default.png?t=N7T8https://download.csdn.net/download/2302_76329106/89651918?spm=1001.2014.3001.5503
加载行政区划数据
  • 从外部文件导入滨海新区的 GeoJSON 数据。

  • 使用 D3.js 的 D3Overlay 组件来绘制行政区划。

  • 定义 inits 函数来初始化路径元素,并设置样式。

  • 定义 redraw 函数来更新路径元素的位置。

<template><div id="mapDiv" :style="Style"></div>
</template>
<script setup lang="ts">import mapJson from '@/utils/tjbhJson';import { ref, onMounted, nextTick, defineProps, defineExpose, defineEmits } from "vue";let map: any = null;let T: any = (window as any).T;const d3 = (window as any).d3const TMAP_VECTOR_MAP = (window as any).TMAP_VECTOR_MAPlet countries: any = [];let countriesColor: any = [320,498,178,598,420,320,120,120];const inits = (sel: any, transform: any) => {let upd = sel.selectAll('path.geojson').data(countries);upd.enter().append('path').attr("class", "geojson").attr('stroke', '#05CEE5')//边界线颜色.attr('stroke-width', '2')//边界线宽度.attr('fill', function (d: any, i: any) {return d3.hsl(countriesColor[i], 0.9, 0.5)})//区域填充.attr('fill-opacity', '0.3')//区域填充透明度}const redraw = (sel: any, transform: any) => {sel.selectAll('path.geojson').each(function (this: any, i: any) {d3.select(this).attr('d', transform.pathFromGeojson)})}let countriesOverlay = new T.D3Overlay(inits,redraw);//初始化地图const initTiandituMap = () => {map = new T.Map("mapDiv");map.setMapType(TMAP_VECTOR_MAP);map.centerAndZoom(new T.LngLat(117.711000,39.003101), 10);
​map.setStyle('block')disProvince()};//添加滨海新区图层const disProvince = () => {countries = mapJson.features;map.addOverLay(countriesOverlay)countriesOverlay.bringToBack();textJson.forEach((item: any) => {let coord: any = item.coord.split(",")let LngLat = new T.LngLat(coord[0], coord[1])})}onMounted(() => {nextTick(()=> {initTiandituMap()})})
</script>
<style scoped lang="scss">
::v-deep(.tdt-label){background: none;border: none;color: #fff;-webkit-box-shadow: none;box-shadow: none;padding: 0;line-height: 0.6vw;font-size: 0.6vw;
}
</style>

添加文本标注
  • 遍历文本坐标数据,并使用天地图的 Label 对象添加文本标注到地图上。

   const disProvince = () => {countries = mapJson.features;map.addOverLay(countriesOverlay)countriesOverlay.bringToBack();textJson.forEach((item: any) => {let coord: any = item.coord.split(",")let LngLat = new T.LngLat(coord[0], coord[1])//添加3d文字var label = new T.Label({text: `<div>${item.text}</div>`, position: LngLat})map.addOverLay(label);})}

通过以上步骤,你可以成功地在 Vue 3 项目中集成天地图和 D3.js,实现行政区划的绘制及文本标注功能。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql聚合函数和分组

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

小五金加工:细节决定产品质量与性能

在小五金加工领域&#xff0c;细节往往决定着最终产品的质量、性能以及市场竞争力。看似微不足道的细微之处&#xff0c;实际上蕴含着巨大的影响。时利和将介绍小五金加工中细节的重要性。 首先&#xff0c;细节关乎产品的精度。小五金零件通常尺寸较小&#xff0c;但对精度的要…

TorchChat:Ollama的潜在对手

PyTorch最近发布TorchChat&#xff0c;TorchChat允许在本地台式机、笔记本电脑或移动设备上下载和运行大型语言模型。会不会让你想到什么&#xff0c;没错就是Ollama。TorchChat是一个适应性强的框架&#xff0c;旨在提高各种硬件平台的LLMs效率&#xff0c;有助于在各种设备上…

怎样使用sudo的时候不需要输入密码?

在Ubuntu等Linux系统下&#xff0c;经常要在个人账户使用sudo命令来执行一些需要root权限的命令&#xff0c;但是需要输入该账户的密码&#xff0c;有时候显得很繁琐&#xff0c; 那么怎样使用sudo的时候不需要输入密码呢&#xff1f; 有如下两种方法&#xff1a; 常规方法1…

解决 Swift 6 全局变量不能满足并发安全(concurrency-safe)读写的问题

概述 WWDC 24 终于在 Swift 十岁生日发布了全新的 Swift 6。这不仅意味着 Swift 进入了全新的“大”版本时代&#xff0c;而且 Swift 编译器终于做到了并发代码执行的“绝对安全”。 不过&#xff0c;从 Swift 5 一步迈入“新时代”的小伙伴们可能对新的并发检查有些许“水土不…

迭代器失效

一、什么是迭代器失效 迭代器的主要作用就是让算法能够不用关心底层数据结构&#xff0c;其底层实际就是一个指针&#xff0c;或者是对指针进行了封装&#xff0c;比如&#xff1a;vector的迭代器就是原生态指针T* 。因此迭代器失效&#xff0c;实际就是迭代器底层对应指针所指…

使用Virtio Driver实现一个计算阶乘的小程序——QEMU平台

目录 一、概述 二、代码部分 1、Virtio 前端 (1) User Space (2) Kernel Space 2、Virtio 后端 三、运行 QEMU Version&#xff1a;qemu-7.2.0 Linux Version&#xff1a;linux-5.4.239 一、概述 本篇文章的主要内容是使用Virtio前后端数据传输的机制实现一个计算阶乘的…

【RabbitMQ】 相关概念 + 工作模式

本文将介绍一些MQ中常见的概念&#xff0c;同时也会简单实现一下RabbitMQ的工作流程。 MQ概念 Message Queue消息队列。是用来存储消息的队列&#xff0c;多用于分布式系统之间的通信。 系统间调用通常有&#xff1a;同步通信和异步通信。MQ就是在异步通信的时候使用的。 同…

萝卜快跑和端到端的自动驾驶(1)

先看一篇论文 2311.18636 (arxiv.org) 这篇论文里有一个非常好的图 比较了一下模块化任务(级联任务)和端到端自动驾驶的区别 首先什么叫模块化任务(级联) 如上图所示&#xff0c;左边的方块中的子方块&#xff0c;是展示了自动驾驶获取数据的途径&#xff0c;这里包括&…

Java之文件操作和IO

目录 File类 属性 构造方法 方法 文件内容的读写 InputStream OutputStream File类 属性 修饰符及类型属性说明static StringpathSeparator依赖于系统的路径分隔符&#xff0c;String类型的表示static charpathSeparator依赖于系统的路径分隔符&#xff0c;char类型的…

vscode 远程免密登录

Windows R 输入 cmd在命令行终端中输入 ssh-keygen 一直回车、确定 生成秘钥 3. C:\用户\xxx.ssh 拷贝公钥内容 id_rsa.pub 4. 在虚拟机~/.ssh/ 下创建文件touch authorized_keys,拷贝公钥内容 id_rsa.pub粘贴到authorized_keys里即可。

uniapp自定义请求头信息header

添加请求头&#xff1a;uniapp自定义请求头信息header&#xff0c;如下&#xff1a;添加tenant-id参数 代码

信创教育:培养未来科技创新的生力军

随着全球数字化转型的加速&#xff0c;信息技术应用创新&#xff08;简称“信创”&#xff09;产业作为推动国家信息技术自主可控和产业升级的关键领域&#xff0c;正迎来前所未有的发展机遇。信创教育&#xff0c;作为培养未来科技创新生力军的重要阵地&#xff0c;其重要性和…

win的netassist TCP测试工具和Linux的nc工具使用

写在前面 有时工作中我们编写一些tcp相关的程序&#xff0c;而netassist就是这样一款辅助我们进行TCP功能测试的工具&#xff0c;你可以从这里下载。 1&#xff1a;netassist使用 我们需要一个server程序&#xff0c;可以参考这篇文章&#xff0c;启动server后&#xff0c;就…

系列:水果甜度个人手持设备检测-产品规划的方案和实现思路

系列:水果甜度个人手持设备检测 -- 产品规划的方案和实现思路 背景 我们在前面篇章中&#xff0c;大致的检索了一下市面存在的产品&#xff0c;并采用启发性搜索的办法从国家知识产权局的专利库、中国知网CNKI的学术文献库、各种文章、论坛甚至是GitHub中对我们预研的方向进…

EmguCV学习笔记 VB.Net 2.S 特别示例

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 教程VB.net版本请访问&#xff1a;EmguCV学习笔记 VB.Net 目录-CSDN博客 教程C#版本请访问&#xff1a;EmguCV学习笔记 C# 目录-CSD…

【区块链+金融服务】中国银联区块链可信存证服务 | FISCO BCOS应用案例

随着金融行业信息化的快速推进&#xff0c;“互联网 金融”业务产生了海量的电子数据。例如&#xff0c;截止到 2022 年第二季度&#xff0c; 全国累计信用卡发卡数量约 8.07 亿张&#xff0c;累计银行卡应偿信贷余额为 8.66 万亿元&#xff0c;累计信用卡逾期半年未尝信贷 总…

盲盒抽奖源码

介绍&#xff1a; 功能上还可以,商品和盲盒可以在你程序里添加&#xff0c;设置概率等!! 新盲盒星球抽奖商城手机网站源码 随机开箱抢购 代码有点大&#xff0c;三百多M。 教程搭建很简单&#xff0c;基本10分钟搭建一套&#xff0c;可一个服务器搭建多套&#xff0c;只要你…

云计算实训31——playbook(剧本)基本应用、playbook常见语法、playbook和ansible操作的编排

playbook(剧本): 是ansible⽤于配置,部署,和管理被控节点的剧本。⽤ 于ansible操作的编排。 使⽤的格式为yaml格式 一、YMAL格式 以.yaml或.yml结尾 ⽂件的第⼀⾏以 "---"开始&#xff0c;表明YMAL⽂件的开始(可选的) 以#号开头为注释 列表中的所有成员都开始于…

不能使用乘除法、for、while、if、else、switch、case求1+2+3+...+n

求123...n_牛客题霸_牛客网 (nowcoder.com) 描述 求123...n&#xff0c;要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句&#xff08;A?B:C&#xff09;。 数据范围&#xff1a; 0<n≤2000<n≤200 进阶&#xff1a; 空间复杂度 O(1)O(…