更新记录

1.0.1(2026-06-24)

1.0.1(2026-06-24)

  • 目录与组件命名统一为连字符风格:Mapbox-Pick-Point
  • uni_modules id 更新为 elink-Mapbox-Pick-Point

1.0.0(2026-06-24)

  • 首次发布
  • 支持 Mapbox 地图拖选点(中心十字准星 + move 防抖)
  • 支持 WGS84 / GCJ02 坐标输出
  • 支持天地图逆地理编码(可选)
  • 支持天地图 + Mapbox 卫星混合底图
  • 提供 js_sdk:attachPickPoint / detachPickPoint 叠加到已有地图

平台兼容性

Mapbox-Pick-Point 插件使用说明

基于 Mapbox GL JS 与 uni-app renderjs 的地图拖选点 uni_modules 插件。用户拖动地图,以屏幕中心十字准星为选点位置,支持坐标系转换与可选天地图逆地理编码。

目录结构

Mapbox-Pick-Point/
├── package.json
├── readme.md
├── changelog.md
├── components/
│   └── Mapbox-Pick-Point/
│       └── Mapbox-Pick-Point.vue
├── js_sdk/
│   ├── index.js
│   ├── pickPointController.js
│   ├── crosshair.js
│   ├── coordOutput.js
│   ├── tiandituRegeo.js
│   ├── mapStyle.js
│   └── constants.js
└── examples/
    ├── standalone-page.vue
    └── overlay-on-existing-map.js

运行环境

平台 支持
App-Vue(renderjs)
H5
小程序

安装依赖

在宿主项目中安装 npm 依赖:

npm install mapbox-gl coordtransform

Mapbox-Pick-Point 文件夹复制到项目的 uni_modules/ 目录下。组件支持 easycom 自动引入,无需手动注册。

获取密钥

密钥 用途 获取方式
Mapbox accessToken 地图底图(必填) Mapbox 账户
天地图 tk 混合底图瓦片、逆地理(可选) 天地图开放平台
天地图 sk 混合底图瓦片签名(可选) 天地图控制台

建议将密钥配置在业务项目的常量文件中,不要提交到公开仓库。


模式 A:独立选点组件

适用于整页选点场景(如选择农场地址、设备安装位置)。

基础用法

<template>
  <view>
    <Mapbox-Pick-Point
      :access-token="mapboxToken"
      :tianditu-tk="tiandituTk"
      tip="拖动地图,选择农场地址"
      height="70vh"
      output-crs="gcj02"
      @change="onPickChange"
      @resolve="onPickResolve"
    />
    <view>
      <text>地址:{{ address }}</text>
      <text>经纬度:{{ coordText }}</text>
    </view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      mapboxToken: "YOUR_MAPBOX_ACCESS_TOKEN",
      tiandituTk: "YOUR_TIANDITU_TK",
      address: "---",
      coordText: "---",
      pickResult: null,
    };
  },
  methods: {
    onPickChange(payload) {
      this.pickResult = payload;
      this.address = payload.address;
      this.coordText = `${payload.position[0].toFixed(6)}, ${payload.position[1].toFixed(6)}`;
    },
    onPickResolve(payload) {
      this.pickResult = payload;
      this.address = payload.address;
    },
  },
};
</script>

Props

属性 类型 默认值 说明
accessToken String 必填 Mapbox 访问令牌
center Array [116.397428, 39.90923] 初始中心点,WGS84 经纬度
zoom Number 17 初始缩放级别
active Boolean true 是否启用选点(可动态开关)
outputCrs String gcj02 输出坐标系:wgs84gcj02
enableRegeo Boolean true 是否开启天地图逆地理
tiandituTk String '' 天地图 tk
tiandituSk String '' 天地图 sk(混合底图用)
baseMap String tianditu-hybrid 底图类型:tianditu-hybridmapbox-satellite
tip String 拖动地图,选择位置 十字准星提示文案
regeoDebounceMs Number 420 逆地理防抖毫秒数
autoGeolocate Boolean true 地图加载后自动定位
disableScrollZoom Boolean true 禁用滚轮缩放
height String 70vh 地图容器高度
mapLanguage String zh-Hans 地图语言
regeoPendingText String 正在解析地址… 逆地理进行中的占位文案
showScaleControl Boolean true 显示比例尺
showGeolocateControl Boolean true 显示定位按钮
instanceId String 自动生成 多实例时避免容器 id 冲突

Events

事件名 说明 回调参数
ready 地图加载完成
change 地图中心每次变化(含逆地理 pending 态) PickPayload
resolve 逆地理完成;未开启逆地理时与 change 等效 PickPayload
geolocate 定位成功 { position, wgs84 }
geolocateError 定位失败 { code, message }
error 地图初始化错误 { message }

PickPayload 结构:

{
  position: [lng, lat],      // 按 outputCrs 输出
  wgs84: [lng, lat],         // Mapbox 原始 WGS84
  address: '北京市...',      // 地址文本或占位
  addressPending: false,     // 是否仍在等待逆地理
  regeoError: undefined      // 逆地理失败时的错误信息
}

模式 B:叠加到已有地图(js_sdk)

适用于主地图已存在、只需临时开启选点的场景。在 renderjs 中引入:

import {
  attachPickPoint,
  detachPickPoint,
  destroyPickPoint,
} from "@/uni_modules/Mapbox-Pick-Point/js_sdk/index.js";

// 开启选点
attachPickPoint(mapboxMap, {
  tip: "拖动地图,选择安装设备位置",
  outputCrs: "gcj02",
  enableRegeo: false,
  onChange: (payload) => {
    ownerInstance.callMethod("onPositionSelected", payload.position);
  },
});

// 关闭选点(保留地图)
detachPickPoint(mapboxMap);

// 组件销毁时彻底清理
destroyPickPoint(mapboxMap);

js_sdk API

方法 说明
attachPickPoint(map, options) 绑定选点控制器并启动
detachPickPoint(map) 停止选点,移除准星与监听
destroyPickPoint(map) 停止并注销控制器
createPickPointController(map, options) 手动创建控制器
createTiandituHybridStyle(options) 生成天地图混合 style
bindHybridZoomSwitch(map, layerIds) 绑定高 zoom 切换卫星图层
fetchAddressByWgs84(lng, lat, tk) 天地图逆地理

演示示例项目

仓库内提供独立演示项目 Mapbox-Pick-Point-demo/,可直接用 HBuilderX 打开运行。

运行步骤

  1. 用 HBuilderX 打开 Mapbox-Pick-Point-demo 目录
  2. config/map.js 中填入 Mapbox token 与天地图 tk
  3. 在演示项目根目录执行 npm install
  4. 运行到 App 或 H5 浏览器

演示项目结构

Mapbox-Pick-Point-demo/
├── uni_modules/Mapbox-Pick-Point/   # 插件副本
├── config/map.js                  # 密钥配置
├── pages/index/index.vue          # 选点演示页
├── manifest.json
├── pages.json
└── package.json

注意事项

  1. 所有源文件使用 UTF-8 编码
  2. Mapbox 中心坐标为 WGS84;国内业务通常需要 GCJ02,请设置 output-crs="gcj02"
  3. 逆地理依赖天地图外网 API,无 tk 时将使用坐标作为地址占位
  4. 插件通过 renderjs 运行,不支持微信小程序
  5. 销毁页面或组件时会自动清理 move 监听、定时器与十字准星 DOM

常见问题

Q:拖动地图时没有触发 change 事件?

确认 activetrue,且地图已完成 load。检查 accessToken 是否有效。

Q:地址一直显示「正在解析地址…」?

检查 tiandituTk 是否正确,以及设备是否能访问 api.tianditu.gov.cn

Q:如何在已有地图上只选坐标、不要逆地理?

设置 enableRegeo: false(组件 prop 或 js_sdk options)。

Q:多实例如何避免容器 id 冲突?

为每个组件设置不同的 instance-id prop。


版本

当前版本:1.0.1

详见 changelog.md

隐私、权限声明

1. 本插件需要申请的系统权限列表:

"<uses-permission android:name=\"android.permission.INTERNET\"/>", "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>", "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>", "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>"

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。