vue3封装leaflet并使用高德底图

该组件配置了高德和腾讯地图的底图。具有新建图层和打点(使用leaflet中的方法),打点分为单个和多个。经纬度和详细地址的互相转换由高德api完成。

<template><div class="container"><!-- 搜索框 --><div class="module-top"><el-input  v-model="modelValue" placeholder="" style="width: 100%;" @input="onInput"/> </div><!-- 工具栏 --><div class="module-tools"><div class='tools-box'><button @click="onClickMark(1)">打点-单个</button><button @click="onClickMark(2)">打点-多个</button><button @click="onClearLayer">清空</button></div></div><div ref="mapLeafletRef" class="map"></div></div><!-- <button @click="onClearLayer">btn</button> -->
</template>
<script setup>
import L from 'leaflet';
import AMapLoader from '@amap/amap-jsapi-loader';
import { onMounted, onUnmounted, ref, getCurrentInstance, watch } from 'vue';
window._AMapSecurityConfig = {  // 高德安全密钥securityJsCode: '申请的高德安全密钥',
};
const props = defineProps({mapType: {  // 地图底图,高德、腾讯type: String,default: () => {return 'gaode';}}
});
watch(() => props, (newV, oldV) => {console.log(newV, 'new', oldV, 'old');
}, {immediate: true
});
const emits = defineEmits(['doRefreshMap']);
const mapObj = ref(); // leaflet对象
const mapLeafletRef = ref(null); //
const mapGaode = ref(null); // 高德
const modelValue = ref('');
const geocoder = ref(null); // 经纬度解析obj
const layerGroup = ref(null);
const autocomplete = ref(null);
const gaodeMapOption = ref({url: 'http://webrd0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}',option: {subdomains: '1234'}
});
const tencentMapOption = ref({url: 'http://rt{s}.map.gtimg.com/realtimerender?z={z}&x={x}&y={y}&type=vector&style=0',option: {subdomains: '0123',tms: true}
});
// 初始化地图:leaflet
const initMap = () => {let mapOption = {};if (props.mapType === 'gaode') {mapOption = gaodeMapOption.value;} else if (props.mapType === 'tengxun') {mapOption = tencentMapOption.value;}const map = L.map(mapLeafletRef.value, {center: [39.90887, 116.397435],zoom: 11,minZoom: 6,maxZoom: 20,zoomControl: true,  //是否启用地图缩放控件attributionControl: false,  是否启用地图属性控件});L.tileLayer(  // 给leaflet添加瓦片底图mapOption.url, mapOption.option).addTo(map);// 绑定leaflet的click点击事件map.on('click', (evt) => {mapClick([evt.latlng.lat, evt.latlng.lng]);});// 创建图层并添加至地图layerGroup.value = L.layerGroup();layerGroup.value.addTo(map);return map;
};
const initMapGaode = () => {AMapLoader.load({key: '申请的高德key', // 申请好的Web端开发者Key,首次调用 load 时必填plugins: ['AMap.Scale', 'AMap.Autocomplete', 'AMap.PlaceSearch'], // 需要使用的的插件列表,如比例尺'AMap.Scale'等AMapUI: {version: '1.1',},}).then((AMap) => {mapGaode.value = AMap;geocoder.value = new AMap.Geocoder({  // 经纬度解析city: '010', // 城市设为北京,默认:“全国”radius: 1000, // 范围,默认:500});const autoOptions = {city: '全国'};autocomplete.value = new AMap.Autocomplete(autoOptions);}).catch((e) => {console.log(e, 'catch');});
};
const marker = ref([]);
const mapClick = (e) => { // leaflet的点击方法// onClearLayer();marker.value = L.marker(e);layerGroup.value.addLayer(marker.value);regeoCode([e[1], e[0]]);
};
const regeoCode = (e) => {  // 经纬度转换成详细地址geocoder.value.getAddress(e, (status, result) => {if (status === 'complete' && result.regeocode) {let address = result.regeocode.formattedAddress;console.log(address, '---address');emits('doRefreshMap', address);} else {console.log('根据经纬度查询地址失败');}});
};
const onClearLayer = () => {  // 清除全部图层上的内容layerGroup.value.clearLayers();
};
const onInput = (e) => {  //input监听输入//console.log(e, '--e');autocomplete.value.search(e, (status, result) => {// 搜索成功时,result即是对应的匹配数据console.log(result, '---result');});
};const removeMap = () => {if (mapObj.value) {mapObj.value.remove();}
};
const show = (e) => {console.log('111');
};
const markNumSingle = ref(true);
const onClickMark = (e) => {if (e === 1) {markNumSingle.value = true;} else {markNumSingle.value = false;}
};
defineExpose({onClearLayer
});
onMounted(() => {mapObj.value = initMap();initMapGaode();
});// 在组件卸载时删除地图
onUnmounted(() => {removeMap();
});
</script><style scoped lang="scss">
.map {height: 100%;width: 100%;z-index: 0;
}
.map2 {height: 40vh;z-index: 0;
}
.container {height: 50vh;position: relative;.module-top{position: absolute;
width: 200px;
height: 50px;
top: 20px;
left: 80px;
z-index: 10;}.module-tools {width:500px;height:50px;position: absolute;bottom:0;left:30%;z-index: 10;background:pink;.tools-box {display:flex;align-items:center;justify-content:center;}}
}</style>

使用leaflet新建一底图的简写方式

let map = L.map('map').setView([39.90887, 116.397435], 17);

复杂icon标点

// latlngs是标点坐标,格式同初始化地图时的中心坐标
let marker = L.marker(latlngs, {icon: L.divIcon({className: "dIcon", //标点icon的容器类名html:`标点icon的html字段内容`, //可以添加标点名字之类的自定义内容// iconSize: [60, 24] //标点icon的容器大小,也可以直接用className类名写css样式})
}).addTo(map); //添加到地图中

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

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

相关文章

Microsoft Word 快捷键 (keyboard shortcut - hotkey)

Microsoft Word 快捷键 [keyboard shortcut - hotkey] References 块复制 Alt 拖动选中 切换字母大小写 Shift F3 快速将光标移到文末 Ctrl End 快速将光标移到文首 Ctrl Home References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

MySQL中的基本SQL语句

文章目录 MySQL中的基本SQL语句查看操作创建与删除数据库和表修改表格数据库用户管理 MySQL中的基本SQL语句 查看操作 1. 查看有哪些数据库 show databases; 2.切换数据库 use 数据库名;比如切换至 mysql数据库 use mysql;3.查看数据库中的表 show tables;4.查看表中…

postgresql 数据库update 去重sql

1、先按重复记录fk分组找最小的记录&#xff0c;然后更新id 不在子查询中的数据 update td_f_stop_history set del_flag1 where "id" not in (select "min"("id") from td_f_stop_history where allowed_recover1 and del_flag0 group by fk…

Linux_进程概念_冯诺依曼_进程概念_查看进程_获取进程pid_创建进程_进程状态_进程优先级_环境变量_获取环境变量三种方式_3

文章目录 一、硬件-冯诺依曼体系结构二、软件-操作系统-进程概念0.操作系统做什么的1.什么叫做进程2.查看进程3.系统接口 获取进程pid- getpid4.系统接口 获取父进程pid - getppid5.系统接口 创建子进程 - fork1、手册2、返回值3、fork做了什么4、基本用法 6.进程的状态1、进程…

GAMES101 学习4

材质和外观 材质 BRDF 漫反射 任何方向的光进来都会被均匀的反射到周围各个不同的方向上去 假设能量守恒&#xff0c;那么 Li Lo&#xff0c;这之后BRDF就 &#xff0c;就可以定义一个反照率 &#xff08;Albeo&#xff09; - &#xff0c;在&#xff08;0 - 1&#xff0…

vue学习笔记——Vue3循环生成表单时,对每一行新生成的数据添加表单验证的方法

应用场景&#xff1a; 在form表单内&#xff0c;动态生成一个数组类型的一组数据&#xff0c;要求对生成的每一组数据内容进行表单验证。例如动态添加人员&#xff0c;并对每个人的人员的信息输入框进行表单验证。 解决思路&#xff1a; 把rules的验证规则循环写在element ui的…

国产大模型KimiChat起飞了!200万字内测开启,AI助手能力大提升!

会议之眼 快讯 Kimi Chat是北京月之暗面科技有限公司推出的支持输入20万汉字的智能助手产品。其背后的技术是一个体量为千亿参数的大模型。Kimi Chat的推出是月之暗面“登月计划”的一部分&#xff0c;旨在为未来的多模态版本产品提供基础&#xff0c;并最终在大模型领域打造面…

Spring Security之认证过滤器

前言 上回我们探讨了关于Spring Security&#xff0c;着实复杂。这次咱们聊的认证过滤器就先聊聊认证功能。涉及到多方协同的功能&#xff0c;咱分开聊。也给小伙伴喘口气&#xff0c;嘻嘻。此外也是因为只有登录认证了&#xff0c;才有后续的更多功能集成的可能。 认证过滤器…

ES的集群节点发现故障排除指南(1)

本文是ES官方文档关于集群节点发现与互联互通的问题排查指南内容。 英文原文&#xff08;官网&#xff09; 集群节点发现是首要任务 集群互连&#xff0c;重中之重&#xff01; 在大多数情况下&#xff0c;发现和选举过程会迅速完成&#xff0c;并且主节点会长时间保持当选状…

Linux系统安装完成之后如何开启root的ssh登录

Linux系统安装完成之后如何开启root的ssh登录 默认情况下&#xff0c;root用户是没有密码的&#xff0c;而且出于安全考虑&#xff0c;SSH服务不允许root用户直接登录。但在某些情况下&#xff0c;你可能需要以root用户身份通过SSH远程登录服务器&#xff0c;或者为root用户设…

mysql基础4sql优化

SQL优化 插入数据优化 如果我们需要一次性往数据库表中插入多条记录&#xff0c;可以从以下三个方面进行优化。 insert into tb_test values(1,tom); insert into tb_test values(2,cat); insert into tb_test values(3,jerry);-- 优化方案一&#xff1a;批量插入数据 Inser…

生骨肉冻干真的对猫身体好吗?排行榜靠前对猫身体好的生骨肉冻干推荐

随着科学养猫知识的广泛传播&#xff0c;生骨肉冻干喂养正逐渐受到养猫人士的青睐。生骨肉冻干真的对猫身体好吗&#xff1f;生骨肉冻干不仅符合猫咪的饮食天性&#xff0c;还能提供全面均衡的营养&#xff0c;有助于维护猫咪的口腔和消化系统健康。然而&#xff0c;许多猫主人…

Open CASCADE学习|最小二乘法拟合直线

最小二乘法&#xff0c;又称最小平方法&#xff0c;起源于十八世纪的大航海探索时期&#xff0c;发展于天文领域和航海领域。其历史可以追溯到法国科学家马里勒让德于1805年首次提出这一概念&#xff0c;而1809年&#xff0c;高斯在他的著作《天体运动论》中也提出了最小二乘法…

JavaScript中三目运算

三目运算符是JavaScript中常用的一种条件语句&#xff0c;也称为条件运算符。它由问号&#xff08;?&#xff09;和冒号&#xff08;:&#xff09;组成&#xff0c;用于根据条件的真假返回不同的值。在本篇文章中&#xff0c;我将详细介绍三目运算符的语法、用法和实例&#x…

自学新标日第八课 未完结

第八课 单词 因为总是电脑打字 手写不会 以后单词都先自己手写了 晚更&#xff01;&#xff01; 单词假名声调词义プレゼント2礼物チケット&#xff11;门票パンフレット&#xff11;小册子記念品きねんひん&#xff10;纪念品スケジュールひょうすけじゅーるひょう&#xf…

xilinx FPGA 除法器ip核(divider)的学习和仿真(Vivado)

在设计中&#xff0c;经常出现除法运算&#xff0c;实现方法&#xff1a; 1、移位操作 2、取模取余 3、调用除法器IP核 4、查找表 简单学习除法器IP。 网上很多IP翻译文档&#xff0c;不详细介绍&#xff0c;记录几个重要的点&#xff1a; 1、三种算法模式(不同模式所消耗的资…

【Linux 进程概念】

【Linux 进程概念】 冯诺依曼体系结构冯诺依曼结构简要解释&#xff1a;你用QQ和朋友聊天时数据的流动过程 操作系统(OperatorSystem)概念设计OS的目的定位操作系统的上下层都分别是什么如何理解“管理"总结 进程基本概念描述进程-PCBtask_ struct内容 组织进程查看进程通…

大模型围剿战:Kimi如何在免费与盈利之间找到平衡?

文 | 大力财经 在近期的互联网科技领域&#xff0c;一款名为Kimi的国产大型AI模型引起了广泛关注。随着Kimi的火爆&#xff0c;国内的大型科技公司纷纷开始关注并投入到长文本处理技术的竞争中。 阿里巴巴、360等知名企业纷纷宣布了他们的长文本处理能力&#xff0c;分别达到…

网络——套接字编程UDP

目录 端口号 源端口号和目的端口号 认识TCP协议和UDP协议 网络字节序 socket编程接口 socket常见接口 sockaddr结构 UDP socket bind recvfrom sendto 编写客户端 绑定INADDR_ANY 实现聊天功能 端口号 在这之前我们已经说过源IP地址和目的IP地址&#xff0c;还有…

微信小程序的页面制作---常用组件及其属性2

一、标签栏taBar 在全局配置文件app.json中添加taBar配置&#xff0c;可实现标签栏配置。标签栏最少2个&#xff0c;最多5个 &#xff08;1&#xff09;如何配置标签栏&#xff1f; 1》先建多个文件&#xff0c;&#xff08;以我的index&#xff0c;list&#xff0c;myform文…