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

news2024/11/14 17:20:40

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

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

目录

引入天地图 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).d3
    const TMAP_VECTOR_MAP = (window as any).TMAP_VECTOR_MAP
    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')
    };
    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).d3
    const TMAP_VECTOR_MAP = (window as any).TMAP_VECTOR_MAP
    let 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.coloradmin.cn/o/2054602.html

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

相关文章

k8s高版本(1,28)部署NodePort模式下的ingress-nginx的详细过程及应用案例

文章目录 前言环境ingress安装应用案例(ingress-http案例&#xff1a; 基于名称的负载均衡) 前言 这个是nodeport模式下的&#xff0c;如果需要loadbalancer模式下的&#xff0c;看看博主下面以前的博客 链接: k8s学习–负载均衡器matelLB的详细解释与安装 链接: k8s学习–ing…

机器学习 之 使用逻辑回归 进行银行贷款预测(请帮忙点点赞谢谢,这对我很重要)

目录 一、逻辑回归简介 逻辑回归的基本原理 线性组合&#xff1a; Sigmoid函数&#xff1a; 二、实战案例 1.导入数据 2.准备环境 混淆矩阵的基本概念 混淆矩阵的作用 3.加载数据 4.数据预处理 什么是标准化&#xff1f; 标准化的计算公式 划分数据集 5.逻辑回归模…

19.缓存的认识和基本使用

缓存介绍 缓存是数据交换的缓冲区Cache&#xff0c;是临时存储数据的地方&#xff0c;一般读写性能较高。 数据库的缓存就是建立索引。 缓存的作用 1.降低后端负载。 2.提高读写效率&#xff0c;降低响应时间。 缓存的问题 1.保证数据的一致性。 2.增加代码维护成本。解…

Kafka运行机制(二):消息确认,消息日志的存储和回收

前置知识 Kafka基本概念https://blog.csdn.net/dxh9231028/article/details/141270920?spm1001.2014.3001.5501Kafka运行机制&#xff08;一&#xff09;&#xff1a;Kafka集群启动&#xff0c;controller选举&#xff0c;生产消费流程https://blog.csdn.net/dxh9231028/arti…

Qt 0816作业

一、思维导图 二、将day1做的登录界面升级优化【资源文件的添加】 三、在登录界面的登录取消按钮进行一下设置 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到…

C++ | Leetcode C++题解之第350题两个数组的交集II

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {sort(nums1.begin(), nums1.end());sort(nums2.begin(), nums2.end());int length1 nums1.size(), length2 nums2…

函数递归VS操作符深入?

1>>前言 函数递归函数递归&#xff0c;当小白听到这样的词会感到无比陌生&#xff0c;请不要惊慌&#xff0c;这是正常的&#xff0c;以至于都不是很经常用到&#xff0c;但是它的算法&#xff0c;它的思想是值得我们深入思考的。还有一些复杂操作符&#xff0c;如按位与…

【原创】java+swing+mysql共享充电宝管理系统设计与实现

个人主页&#xff1a;程序员杨工 个人简介&#xff1a;从事软件开发多年&#xff0c;前后端均有涉猎&#xff0c;具有丰富的开发经验 博客内容&#xff1a;全栈开发&#xff0c;分享Java、Python、Php、小程序、前后端、数据库经验和实战 文末有本人名片&#xff0c;希望和大家…

PyTorch之TensorBoard使用

接回上一篇&#xff1a;PyTorch深度学习框架-CSDN博客 在学习这篇之前建议先按照上一篇搭建好整个PyTorch环境 然后这一篇讲怎么用TensorBoard&#xff0c;这个玩意是Tensorflow官方推出的一个可视化工具&#xff0c;当使用Tensorflow训练大量深层的神经网络时&#xff0c;我们…

全局锁、表级锁、行级锁

锁的作用和特点 WHY&#xff1a;锁的出现是为了解决并发场景下不同用户同时对共享资源进行操作&#xff0c;而可能引发的并发问题。 HOW&#xff1a;控制不同线程对资源访问的规则。 全局锁 顾名思义&#xff0c;全局锁就是对整个数据库实例加锁。一般在进行全库备份的时候…

prometheus + grafana + 告警

配置环境 准备三台主机&#xff0c;将三台主机的信息分别写入/etc/hosts文件中 192.168.100.115 server.example.com server 192.168.100.116 agent1.example.com agent1 192.168.100.117 grafana.example.com grafana [rootserver ~]# cat /etc/hosts 127.0.0.1 localhos…

【MySQL 08】内置函数 (带思维导图)

文章目录 &#x1f308; 一、日期函数⭐ 1. 常见日期函数⭐ 2. 日期函数使用示例⭐ 3. 日期函数综合案例 &#x1f308; 二、字符串函数⭐ 1. 常见字符串函数⭐ 2. 字符串函数使用示例⭐ 3. 字符串函数综合案例 &#x1f308; 三、数值函数⭐ 1. 常见数值函数⭐ 2. 数值函数使用…

探索GitHub的无限可能:从注册到Linux环境下的库分支链接

在这个数字化时代&#xff0c;GitHub已成为开发者们不可或缺的宝藏库。无论你是编程新手还是资深开发者&#xff0c;GitHub都能为你打开一扇通往无限创意与协作的大门。今天&#xff0c;就让我们一起踏上这段探索之旅&#xff0c;从GitHub的注册开始&#xff0c;再到如何在Linu…

google transalte api的使用,V2服务账户方式(google-cloud-java)

Google Cloud Translation API 有几个不同的使用方式&#xff0c;其中之一是使用最新的 Google Cloud Client Library。这些库提供了简化的 API&#xff0c;使得与 Google Cloud 服务的交互变得更加容易。 对于gcp平台的创建方式&#xff0c;我记得得绑定真信用卡了&#xff0c…

Debug-021-el-table实现分页多选的效果(切换分页,仍可以保持前一页的选中效果)

前情提要&#xff1a; 这个功能实现很久了&#xff0c;但是一直没有留意如何实现&#xff0c;今天想分享一下。具体就是我们展示table数据的时候&#xff0c;表格中的数据多数情况是分页展示&#xff0c;毕竟数据量太多&#xff0c;分页的确是有必要的。那么我们有业务需要给表…

portswigger的Exploiting DOM clobbering to enable XSS

目录 尝试一下看看可不可以XSS DOM破坏 查看源码确定DOM破坏漏洞点以及代码分析 首先查看/resources/labheader/js/labHeader.js&#xff0c;没有什么作用 然后domPurify这东西是一个过滤框架也没啥子用 看/resources/js/loadCommentsWithDomClobbering.js尝试分析代码(对…

使用Poi-tl对word模板生成动态报告

一、pom依赖问题&#xff1a; <dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl</artifactId> <version>1.12.2</version> </dependency> 使用 poi-tl 的 1.12.2版本&#xff0c;如果使用了poi依赖&#x…

【编程之路:在 Bug 的迷宫中寻找出口】

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Mysql-linux通过rpm安装、linux离线安装mysql

新建用户 useradd mysql passwd mysqlmysql用户增加sudo权限 Linux-创建用户、给普通用户sudo权限、设置不需要密码执行sudo 卸载旧版本软件包 卸载mariadb --查询mariadb版本 rpm -qa|grep mariadb --控制台输出 mariadb-libs-5.5.68-1.el7.x86_64 --执行卸载 sudo rpm -…

系规学习第13天

1、规划设计的主要目的不包括() A、设计满足业务需求的IT服务 B、设计SLA、测量方法和指标。 C、设计服务过程及其控制方 D、设计实施规划所需要的进度管理过程 [答案] D [解析]本题考察的是规划设计的目的&#xff0c;建议掌握。 (1)设计满足业务需求的IT服务。 (2)设…