VUE3 + TS + MapboxGL + 拖拽定位

2023-11-18

VUE3 + TS + MapboxGL + 拖拽定位

mapbox的拖拽定位,相对于其他api来说还是相对容易实现的。只需要在中心创建图层,之后在地图移动时候一直更改图层的中心即可。

首先,安装部分不过多描述:
官网安装地址

之后,要使用mapboxGL,首当其冲肯定是初始化mapbox
这里我把初始化全部放在一个ts文件并且组件调用该初始化函数进行初始化。
ts文件中函数,下面注释都挺清楚的,不再一行行解释


import { onMounted, Ref, ref } from "vue";
import MapboxLanguage from "@mapbox/mapbox-gl-language"; // 加中文
import mapboxgl, { Map, Marker } from "mapbox-gl";

export function initDragMap() {
    const mapboxgl = require("mapbox-gl"); // 引入mapbox-gl组件

    const mapDivElement: Ref<HTMLDivElement | null> = ref(null)
    const map: Ref<Map> = ref({}) as Ref<Map>
    const marker: Ref<Marker> = ref({}) as Ref<Marker>

    onMounted(initMap)

    return {
        map,
        mapDivElement,
        marker,
    }

    /**
     * 初始化mapbox
     */
    function initMap() {
        mapboxgl.accessToken = //这里请换成自己的token
        let arr = [lng, lat];//写入希望初始化的经纬度
        mapNew(map, mapDivElement, marker, arr);
        map.value.on("move", moveing);//地图移动则变化移动中
    }

    function moveing() {
        var lngLat = map.value.getCenter();
        marker.value.setLngLat(lngLat);
    }
}

/**
 * 新建地图
 * @param map
 * @param mapDivElement
 * @param marker
 * @param arr
 */
function mapNew(map: Ref<Map>, mapDivElement: Ref<HTMLDivElement | null>, marker: Ref<Marker>, arr: [number, number]) {
    if (mapDivElement.value !== null) {
        // console.log(mapDivElement.value)
        map.value = new mapboxgl.Map({
            container: mapDivElement.value, // container id 绑定的组件的id
            center: arr, // 初始坐标系
            minZoom: 1.7, // 设置最小拉伸比例
            zoom: 10, // starting zoom 地图初始的拉伸比例
            style: "mapbox://styles/mapbox/streets-v11", // 类型
            // pitch: 60, //地图的角度,不写默认是0,取值是0-60度,一般在3D中使用
            bearing: 0, //地图的初始方向,值是北的逆时针度数,默认是0,即是正北,-17.6
            antialias: false, //抗锯齿,通过false关闭提升性能
            // maxBounds: [[, ], // 西南方坐标
            // [, ]] //东北方坐标,用于控制缩放范围
        });

        mapThreeDim(map, 'street-map');
        skyLoad(map);

        // 中文
        map.value.addControl(
            new MapboxLanguage({
                defaultLanguage: "zh-Hans",
            })
        );
		
        const scale = new mapboxgl.ScaleControl({
            maxWidth: 100,
            unit: 'metric'
        });

        map.value.addControl(scale, "bottom-left");// 比例尺
        scale.setUnit('metric');
		
		// 这里就是图层部分,可以在官网找到自己希望图层样式
        marker.value = new mapboxgl.Marker()
            .setLngLat(arr)
            .addTo(map.value);

    } else {
        throw Error('map new init error')
    }
}

mapThreeDim(map, ‘street-map’);和skyLoad(map);函数是加入高度信息和转动后的天空层,如果不需要也可以屏蔽。

export function mapThreeDim(map: Ref<Map>, style: MapType) {
		map.value.on("load", () => {
           const layers = map.value.getStyle().layers;
           if (layers !== undefined) {
               const labelLayerId = layers.find(
                   (layer) => {
                       if ("layout" in layer && layer.layout !== undefined) {
                           return layer.type === "symbol" && layer.layout["text-field"]
                       } else {
                           return false
                       }
                   }
               )?.id;
               map.value.addLayer(
                   {
                       id: "3d",
                       source: "composite",
                       "source-layer": "building",
                       filter: ["==", "extrude", "true"],
                       type: "fill-extrusion",
                       minzoom: 15,
                       paint: {
                           "fill-extrusion-color": "#aaa",

                           // 当用户放大时,使用“插值”表达式为建筑物添加平滑过渡效果
                           "fill-extrusion-height": [
                               "interpolate",
                               ["linear"],
                               ["zoom"],
                               15,
                               0,
                               15.05,
                               ["get", "height"],
                           ],
                           "fill-extrusion-base": [
                               "interpolate",
                               ["linear"],
                               ["zoom"],
                               15,
                               0,
                               15.05,
                               ["get", "min_height"],
                           ],
                           "fill-extrusion-opacity": 0.6,
                       },
                   },
                   labelLayerId
               );
           }
       });
}
export function skyLoad(map: Ref<Map>) {
    map.value.on("load", () => {
        map.value.addLayer({
            id: "sky",
            type: "sky",
            paint: {
                "sky-type": "atmosphere",
                "sky-atmosphere-sun": [0.0, 0.0],
                "sky-atmosphere-sun-intensity": 15,
            },
        });
    });
}

最后,我们只需要在组件中导入即可

<div class="chart" id="mapContainer" ref="mapDivElement" />
const {
    map,
    mapDivElement,
    marker
} = initDragMap();

结果
1
2

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VUE3 + TS + MapboxGL + 拖拽定位 的相关文章

随机推荐

  • MathType改变字体大小

    目录 一 MathType中的公式字体 二 临时自定义字体大小 三 更改默认字体大小 四 总结 一 MathType中的公式字体 MathType中默认的字体大小为12pt 在word中即小四 word字体对应MathType的字体大小如下
  • Android Studio开发环境的搭建

    Android Studio开发环境的搭建 一 实验目的及任务 Windows下掌握Android Studio的安装和配置 模拟器的创建 Activity的创建和注册 二 实验环境 Jdk Android Studio 三 实验步骤 An
  • 7 种提升SpringBoot 吞吐量神技

    架构师专栏 2022 04 11 08 44 大家好 我是磊哥 一 异步执行 实现方式二种 1 使用异步注解 aysnc 启动类 添加 EnableAsync注解 2 JDK 8本身有一个非常好用的Future类 CompletableFu
  • 计算两个数之和,不能用+ = 运算符

    在lintcode的一个简单的算法题 计算两数的和 不能用 运算符 对于这个题 我是一点思路都没有 不用 那能用什么计算呢 于是在网上找了找答案 答案其实很简单 主要是涉及到运算 我是觉得应该记一下 所以才将这个题写下来 具体代码 异或 运
  • centos 6.5 连接MySQL 提示:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password:

    centos 6 5 连接MySQL 提示 ERROR 1045 28000 Access denied for user root localhost using password NO CentOs 第一次登入MySQL 默认超级用户
  • 深度学习中的优化算法之AdaGrad

    之前在https blog csdn net fengbingchun article details 123955067 介绍过SGD Mini Batch Gradient Descent MBGD 有时提到SGD的时候 其实指的是MB
  • 链表和线性表的优缺点

    链表和线性表的优缺点 作为我们最先接触的两个数据结构 链表和线性表的优缺点都较为明显 并且二者互相补足 文章目录 链表和线性表的优缺点 线性表 线性表的组成 线性表的缺点 线性表的优点 链表 链表的组成 链表的优点 链表的缺点 总结 线性表
  • Spring系列之BeanFactory扩展(BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor)

    先来看几个问题 BeanFactoryPostProcessor是做什么的 BeanDefinitionRegistryPostProcessor是干什么的 BeanFactoryPostProcessor和BeanDefinitionRe
  • Uni-app 之uParse 富文本 样式

    富文本如果内容过多 会导致有些列不出现在屏幕内 如果只被挡的只有一两列 显示出来也不拥挤 可以修改样式使其全部展示出来 增加tag style
  • 什么是项目管理?项目经理应该如何进行管理?

    项目管理 一是指一种管理活动 一种有意识地按照项目的特点和规律 对项目进行组织管理的活动 二是指一种管理学科 以项目管理活动为研究对象的一门学科 它是探求项目活动科学组织管理的理论与方法 就是把各种知识 技能 手段和技术应用于项目活动之中
  • unity2D横版游戏教程10-场景控制

    我们让角色掉出地图时重置游戏 我们在Hierarchy那里创建一个一个空项目 命名为DeathLine 也就是死亡线 我们给它添加一个盒体碰撞器 调整一下碰撞器 我们要把这个碰撞器当做触发器使用 所以我们勾选Is Trigger 我们既然用
  • DevOps初识

    博主入职了 正在学习一些在学校没有接触过的东西 在此进行记录 背景 随着软件发布迭代的频率越来越高 传统的 瀑布型 开发 测试 发布 模式已经不能满足快速交付的需求 打破开发和运维的壁垒 聪明的大佬创造出一套模式 就是devops 当我们提
  • qt中treeView的使用

    参考博客 1 https blog csdn net CSND Ayo article details 71106067 utm medium distribute pc relevant none task blog BlogCommen
  • CSS学习总结

    CSS学习视频 狂神说 CSS 目录 简介 什么是CSS 什么是CSS CSS发展史 快速入门 CSS的3种导入方式 选择器 基本选择器 层次选择器 结构伪类选择器 属性选择器 美化网页元素 为什么要美化网页 字体样式 文本样式 阴影 超链
  • sonarqube代码规则配置

    sonarqube做代码检测 可以自定义配置规则库的规则和绑定项目 方法如下 1 进入sonarqube质量配置页面 选择某一语言 点击右侧设置按钮 选择复制 2 输入名称后 点击复制 进入配置页面 3 点击修改项目 可以选择当前已存在的项
  • 谷歌浏览器崩溃之错误代码:RESULT_CODE_MISSING_DATA

    打开谷歌 突然页面崩溃了 所有插件提示也用不了了 页面显示崩溃的错误代码是 RESULT CODE MISSING DATA 我在网上找到一个大神的解决方法 亲测有限 解决方法 首先在谷歌浏览器右键打开属性 在箭头所指的位置复制粘贴 no
  • 用远见超越未见

    2022年是极不平凡的一年 外部的世界局势逐步恶化 内部的新冠疫情转段迈向新阶段 2022年也是伟大的一年 党的二十大胜利召开 党的二十大报告就 推进国家安全体系和能力现代化 坚决维护国家安全和社会稳定 作出专章部署 明确指出 国家安全是民
  • AD16出现your licence is already used on computer的解决办法

    AD16出现报错警告如何解决 AD16持续出现报错警告 AD为什么会报错 如何解决报错 AD16持续出现报错警告 AD为什么会报错 在使用破解版AD的时候 你用的注册表跟别人的注册表一样 也就是说你两用的是同一个安装包 用的是相同的注册码
  • 【第一天】Linux基础命令1

    聊一聊 Hello 好久不见 好久没更新了 因为小编现在是一名大三专科生 正在准备升本 所以正在全力进行备考 备考的过程中 也算是属于没怎么碰过电脑的那种 以前学的知识都忘的差不多了 于是 我决定每天抽出两到三个小时 来写一篇知识总结 这样
  • VUE3 + TS + MapboxGL + 拖拽定位

    VUE3 TS MapboxGL 拖拽定位 mapbox的拖拽定位 相对于其他api来说还是相对容易实现的 只需要在中心创建图层 之后在地图移动时候一直更改图层的中心即可 首先 安装部分不过多描述 官网安装地址 之后 要使用mapboxGL