@benj-6/tdt-map-vue3

- 天地图 Vue 3 组件库
823
Install
npm install @benj-6/tdt-map-vue3
Latest Version:1.0.4
Vue:3
License:MIT
Last Updated:Sep 17, 2026
Links: GitHub  ·  npm
Maintainer: benj-6

tdt-map-vue3

项目状态

本项目已弃用,不再继续维护。

个人在实际使用中认为这层 Vue 组件封装收益有限,更推荐直接引入天地图官方 JS API 来使用,方式更直接、排查问题也更方便。

推荐用法(直接加载官方 JS)

/**
 * 按需加载天地图官方 JS API v4.0 脚本。
 * 官方接入方式:<script src="https://api.tianditu.gov.cn/api?v=4.0&tk=密钥"></script>,
 * 脚本加载后在全局注入 T 命名空间(new T.Map / T.LngLat 等)。
 * 模块级缓存:整个应用只加载一次,多个地图实例共享。
 */

const SCRIPT_URL = `https://api.tianditu.gov.cn/api?v=4.0&tk=${import.meta.env.VITE_TDT_TK}`;

let loadPromise: Promise<void> | null = null;

/** 确保官方脚本已加载;重复调用(含并发)只发起一次真实请求 */
export function loadTdtScript(): Promise<void> {
  if (window.T) return Promise.resolve();
  if (!loadPromise) {
    loadPromise = new Promise((resolve, reject) => {
      const script = document.createElement("script");
      script.src = SCRIPT_URL;
      script.type = "text/javascript";
      script.async = true;
      script.defer = true;
      script.onload = () => resolve();
      script.onerror = () => {
        // 加载失败后允许下次进入地图页面时重新尝试
        loadPromise = null;
        reject(new Error("天地图 JS API 加载失败"));
      };
      document.body.appendChild(script);
    });
  }
  return loadPromise;
}

说明

fork自 tdt-map-vue3

安装

npm i tdt-map-vue3
# or
yarn add tdt-map-vue3

快速上手

全局引入

全部引入,解放双手

// main.ts
import { createApp } from "vue";
import App from "./App.vue";
import { install } from "tdt-map-vue3";

const app = createApp(App);
app.use(install, {
  v: "4.0", //目前只支持4.0版本
  tk: "your map token",
  plugins: ['D3', 'CarTrack'],  //需要加载的插件
  plugDomain: '' //使用自定义加载插件的域名,官方发布的插件js(未压缩)会出现https强转为http的问题,可以变相使用代理解决问题
});
app.mount("#app");
<!-- App.vue -->
<template>
  <div class="mapDiv">
    <tdt-map :center="state.center" :zoom="state.zoom"></tdt-map>
  </div>
</template>

<script lang="ts" setup>
  import { reactive } from "vue";
  import type { LngLat } from "tdt-map-vue3";

  const state = reactive({
    center: [113.280637, 23.125178]  as LngLat,
    zoom: 12
  });
</script>

<style>
  .mapDiv {
    width: 100%;
    height: 100%;
  }
</style>

按需引入

按需引入,配合 ts 获得类型提示。

  • 使用组件时传入接口参数

loadConfig仅第一次生效,后续调用忽略此参数。

<!--App.vue-->
<template>
  <div class="mapDiv">
    <tdt-map :center="state.center" :zoom="state.zoom" :loadConfig="loadConfig"></tdt-map>
  </div>
</template>

<script lang="ts" setup>
  import { reactive } from "vue";
  import { TdtMap, type LngLat } from "tdt-map-vue3";

  const loadConfig = { v: "4.0", tk: "your map token" };
  const state = reactive({
    center: [113.280637, 23.125178] as LngLat,
    zoom: 12
  });
</script>

<style>
  .mapDiv {
    width: 100%;
    height: 100%;
  }
</style>
  • 单独调用useApiLoader
// main.ts
import { createApp } from "vue";
import App from "./App.vue";
import { useApiLoader } from "tdt-map-vue3";

const app = createApp(App);
useApiLoader( {
  v: "4.0", //目前只支持4.0版本
  tk: "your map token"
});
app.mount("#app");
<!--App.vue-->
<template>
  <div class="mapDiv">
    <tdt-map :center="state.center" :zoom="state.zoom"></tdt-map>
  </div>
</template>

<script lang="ts" setup>
  import { reactive } from "vue";
  import { TdtMap, type LngLat } from "tdt-map-vue3";

  const state = reactive({
    center: [113.280637, 23.125178] as LngLat,
    zoom: 12
  });
</script>

<style>
  .mapDiv {
    width: 100%;
    height: 100%;
  }
</style>

API 加载器

甚至可以把它当作无情的 API 加载工具

import { useApiLoader } from "tdt-map-vue3";

useApiLoader({
  v: "4.0",
  tk: "your map token",
  plugins: ["D3", "CarTrack", "HeatmapOverlay", "BufferTool", "ImageOverLayer"]
}).then(() => {
  new T.Map({ ... });
});

辅助函数

import { toLngLat, toBounds, toPoint, toIcon } from "tdt-map-vue3";

说明

函数名 返回值 描述
toLngLat(lnglat:[number,number]) T.LngLat 转换为经纬度对象。
参数说明:
lnglat:经纬度数组
toBounds(bounds:[[number,number],[number,number]]) T.Bounds 转换为地理范围对象。
参数说明:
bounds:地理范围数组
toPoint(point:[number,number]) T.Point 转换为像素坐标点对象。
参数说明:
point:像素坐标点数组
toIcon(icon:IconOption|string) T.Icon 转换为图标对象。
参数说明:
icon:string//图片地址 或 {iconUrl:string,//图片地址
iconSize:[number,number],//图片大小
iconAnchor:[number,number]//偏移}

调用原生API

由于API是通过useApiLoader异步加载的,所以需要在API加载完成后才能使用天地图原生的API,有以下三种方式:

  • 不使用组件,只使用API加载器

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

<script>
  import { useApiLoader } from "tdt-map-vue3";
  // 加载API
  useApiLoader({
    v: "4.0",
    tk: "your map token",
    plugins: ["D3", "CarTrack", "HeatmapOverlay", "BufferTool", "ImageOverLayer"]
  }).then(() => {
    const map = new T.Map("mapContainer", { ... });
    const marker = new T.Marker({ ... });
    map.addOverLay(marker);
  });
</script>
  • 使用组件,监听组件的初始化事件

<template>
  <tdt-map @init="mapInit"></tdt-map>
</template>

<script>
  function mapInit(map) {
    // 此时原生API中的T已存在window中
    const marker = new T.Marker({ ... })
    map.addOverLay(marker);
  }
</script>
  • 注册了组件,使用API加载器异步等待API加载完成
// 不用传参数,异步等待之前注册组件时带参数加载的API加载完成
useApiLoader({}).then(() => {
  const marker = new T.Marker({ ... });
});

Related Packages

vue-tianditu

vue-tianditu

7,691 123
@bonncloud/tianditu

天地图(Tianditu / 国家地理信息公共服务平台)全功能 TypeScript SDK —— JS API 4.0...

535
pl-table

一个表格插件(完美解决万级数据渲染卡顿问题)

35,525 1,149

Version History

Version Released Vue License
1.0.4 ^3.0.0 MIT
1.0.3 ^3.0.0 MIT
1.0.2 ^3.0.0 MIT
1.0.1 ^3.0.0 MIT
1.0.0 ^3.0.0 MIT