更新记录
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 | 输出坐标系:wgs84 或 gcj02 |
| enableRegeo | Boolean | true | 是否开启天地图逆地理 |
| tiandituTk | String | '' | 天地图 tk |
| tiandituSk | String | '' | 天地图 sk(混合底图用) |
| baseMap | String | tianditu-hybrid | 底图类型:tianditu-hybrid 或 mapbox-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 打开运行。
运行步骤
- 用 HBuilderX 打开
Mapbox-Pick-Point-demo目录 - 在
config/map.js中填入 Mapbox token 与天地图 tk - 在演示项目根目录执行
npm install - 运行到 App 或 H5 浏览器
演示项目结构
Mapbox-Pick-Point-demo/
├── uni_modules/Mapbox-Pick-Point/ # 插件副本
├── config/map.js # 密钥配置
├── pages/index/index.vue # 选点演示页
├── manifest.json
├── pages.json
└── package.json
注意事项
- 所有源文件使用 UTF-8 编码
- Mapbox 中心坐标为 WGS84;国内业务通常需要 GCJ02,请设置
output-crs="gcj02" - 逆地理依赖天地图外网 API,无 tk 时将使用坐标作为地址占位
- 插件通过 renderjs 运行,不支持微信小程序
- 销毁页面或组件时会自动清理 move 监听、定时器与十字准星 DOM
常见问题
Q:拖动地图时没有触发 change 事件?
确认 active 为 true,且地图已完成 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

收藏人数:
购买源码授权版(
试用
使用 HBuilderX 导入示例项目
赞赏(0)
下载 6
赞赏 0
下载 12325685
赞赏 1923
赞赏
京公网安备:11010802035340号