tdt-map-vue 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,243 @@
1
+ # @80458/tdt-map
2
+
3
+ 一个基于 **Vue 2 / Vue 3** 的天地图(Tianditu)地图组件库,面向实际业务场景封装了地图初始化、标注管理、文字标签、信息窗体、地理编码搜索和组件实例方法调用等能力。你可以像使用普通 Vue 组件一样快速接入到项目中,也可以通过 `ref` 控制地图的增删改查、搜索定位和视图刷新,适合用于后台管理系统、地理信息展示页面、业务地图看板等场景。
4
+
5
+ ## 特性
6
+
7
+ - 同时兼容 Vue 2 与 Vue 3,可直接在不同版本项目中复用
8
+ - 自动加载天地图 JS API,无需在业务项目里手动引入脚本
9
+ - 支持地图初始化,并可配置中心点、缩放级别、最小/最大缩放范围
10
+ - 支持拖拽、滚轮缩放、缩放控件等常用地图交互能力
11
+ - 支持自定义标注图标、文字标签、信息窗内容
12
+ - 支持新增标注、隐藏标注、获取全部标注和销毁地图实例
13
+ - 支持地理编码搜索,可根据地址关键字快速定位
14
+ - 支持通过 `ref` 调用组件公开方法,便于在业务代码中做二次控制
15
+
16
+ ## 安装
17
+
18
+ ```bash
19
+ npm install tdt-map-vue --save
20
+ ```
21
+
22
+ 如果你使用的是 Vue 3 项目,通常只需要正常安装即可;如果是 Vue 2 项目,则需要确保 `vue-demi` 的运行环境配置正确。组件库内部通过 `vue-demi` 做了兼容处理,因此同一套 API 可以在两种版本中使用。
23
+
24
+ ### 安装说明
25
+
26
+ - **Vue 2**:确保项目中已正确配置 `vue-demi` 所需环境
27
+ - **Vue 3**:正常安装即可
28
+
29
+ > 组件库通过 `vue-demi` 处理 Vue 2 / Vue 3 兼容场景。
30
+
31
+ ## 快速开始
32
+
33
+ 下面分别给出 Vue 2 和 Vue 3 的使用方式。无论哪种版本,都可以通过组件形式直接渲染地图,并通过 `tk` 传入天地图 API Key。
34
+
35
+ ### 全局注册
36
+
37
+ ```js
38
+ import Vue from "vue";
39
+ import TiandiMap from "tdt-map-vue";
40
+
41
+ Vue.use(TiandiMap);
42
+ ```
43
+
44
+ ### 局部注册
45
+
46
+ ```vue
47
+ <template>
48
+ <TiandiMap tk="your-tianditu-api-key" :zoom="12" />
49
+ </template>
50
+
51
+ <script>
52
+ import TiandiMap from "tdt-map-vue
53
+
54
+ export default {
55
+ components: {
56
+ TiandiMap,
57
+ },
58
+ };
59
+ </script>
60
+ ```
61
+
62
+ ## 通过 `ref` 调用方法
63
+
64
+ 组件支持通过 `ref` 直接调用实例方法,这也是它比较适合做业务封装的原因之一。比如你可以在按钮点击后新增标注、清空搜索条件、重新计算地图尺寸,或者根据外部业务状态控制地图行为,而不必把逻辑全部写死在地图组件内部。
65
+
66
+ ### 常用方法
67
+
68
+ - `addMarkers(markers)`:新增标注
69
+ - `clearSearch()`:清空搜索框
70
+ - `geocodeSearch(keyword)`:地理编码搜索
71
+ - `hideMarkers(markers)`:隐藏标注
72
+ - `getAllMarkers()`:获取全部标注
73
+ - `destroyMap()`:销毁地图
74
+ - `resizeMap()`:重新计算地图尺寸
75
+
76
+ ### Vue 3 示例
77
+
78
+ ```vue
79
+ <template>
80
+ <div>
81
+ <TiandiMap ref="mapRef" tk="your-tianditu-api-key" :zoom="12" />
82
+ <button @click="addMarker">添加标注</button>
83
+ </div>
84
+ </template>
85
+
86
+ <script>
87
+ import { ref } from "vue";
88
+ import TiandiMap from "tdt-map-vue"
89
+
90
+ export default {
91
+ components: {
92
+ TiandiMap,
93
+ },
94
+ setup() {
95
+ const mapRef = ref(null);
96
+
97
+ const addMarker = () => {
98
+ mapRef.value?.addMarkers([
99
+ {
100
+ lng: 116.397428,
101
+ lat: 39.90923,
102
+ option: {
103
+ content: "<div>北京</div>",
104
+ },
105
+ },
106
+ ]);
107
+ };
108
+
109
+ return {
110
+ mapRef,
111
+ addMarker,
112
+ };
113
+ },
114
+ };
115
+ </script>
116
+ ```
117
+
118
+ ### Vue 2 示例
119
+
120
+ ```vue
121
+ <template>
122
+ <div>
123
+ <TiandiMap ref="mapRef" tk="your-tianditu-api-key" :zoom="12" />
124
+ <button @click="addMarker">添加标注</button>
125
+ </div>
126
+ </template>
127
+
128
+ <script>
129
+ export default {
130
+ methods: {
131
+ addMarker() {
132
+ this.$refs.mapRef.addMarkers([
133
+ {
134
+ lng: 116.397428,
135
+ lat: 39.90923,
136
+ option: {
137
+ content: "<div>北京</div>",
138
+ },
139
+ },
140
+ ]);
141
+ },
142
+ },
143
+ };
144
+ </script>
145
+ ```
146
+
147
+ ## Props
148
+
149
+ 这些属性用于控制地图的初始状态和交互行为。对于大多数业务场景,你只需要传入 `tk`、中心点和缩放级别即可;如果需要更强的定制能力,还可以继续配置标注、拖拽、滚轮缩放等选项。
150
+
151
+ | 参数 | 类型 | 默认值 | 说明 |
152
+ | ----------------- | --------- | ----------------------------------- | ---------------- |
153
+ | `tk` | `String` | 必填 | 天地图 API Key |
154
+ | `version` | `String` | `4.0` | 天地图 API 版本 |
155
+ | `containerStyle` | `Object` | `{ width: '100%', height: '100%' }` | 地图容器样式 |
156
+ | `center` | `Array` | `[117.017362,25.075884]` | 地图中心点经度 |
157
+ | `zoom` | `Number` | `10` | 初始缩放级别 |
158
+ | `minZoom` | `Number` | `1` | 最小缩放级别 |
159
+ | `maxZoom` | `Number` | `18` | 最大缩放级别 |
160
+ | `markers` | `Array` | `[]` | 初始标注数组 |
161
+ | `dragEnable` | `Boolean` | `true` | 是否允许拖拽 |
162
+ | `scrollWheelZoom` | `Boolean` | `true` | 是否允许滚轮缩放 |
163
+
164
+ ## Events
165
+
166
+ 组件在地图初始化、标注点击、搜索结果和异常场景下都会向外抛出事件,便于业务层统一处理状态、提示信息和联动操作。
167
+
168
+ | 事件名 | 参数 | 说明 |
169
+ | ---------------- | ------------------------- | -------------------------- |
170
+ | `ready` | `(map)` | 地图初始化完成 |
171
+ | `error` | `(error)` | 地图初始化、加载或搜索失败 |
172
+ | `marker-click` | `({ markerData, event })` | 标注点击事件 |
173
+ | `addsuccess` | `(markers)` | 新增标注成功 |
174
+ | `hidesuccess` | `()` | 隐藏标注成功 |
175
+ | `search-success` | `(location)` | 地理编码搜索成功 |
176
+ | `search-error` | `(error)` | 地理编码搜索失败 |
177
+
178
+ window.T.Map 地图对象
179
+ window.T.Marker 标记对象
180
+ window.T.InfoWindow 信息窗口对象
181
+ window.T.LngLat 经纬度对象
182
+ window.T.Point 点位/偏移对象
183
+ map 天地图对象 可以拿来调用原生的api
184
+
185
+ ## 标注数据格式
186
+
187
+ 标注数据建议统一使用数组结构传入,每一项都可以包含坐标、唯一标识和扩展配置。`option` 中支持图标、文字标签和弹窗内容,因此既能展示基础点位,也能满足更复杂的业务展示需求。
188
+
189
+ ```js
190
+ [
191
+ {
192
+ id: "marker-1",
193
+ lng: 116.397428,
194
+ lat: 39.90923,
195
+ option: {
196
+ iconInfo: {
197
+ icon: "https://example.com/icon.png",
198
+ offsetX: 32,
199
+ offsetY: 32,
200
+ },
201
+ content: "<div>北京市中心</div>",
202
+ textInfo: {
203
+ text: "北京",
204
+ offsetX: 0,
205
+ offsetY: -30,
206
+ },
207
+ },
208
+ },
209
+ ];
210
+ ```
211
+
212
+ ## 常见问题
213
+
214
+ 下面整理了一些接入时最容易遇到的问题,建议在安装和使用前先快速浏览一遍,可以节省很多排查时间。
215
+
216
+ ### 1. Vue 2 项目里能用吗?
217
+
218
+ 可以,当前组件库就是按 Vue 2 / Vue 3 双兼容方向整理的。
219
+
220
+ ### 2. Vue 3 能通过 ref 调用方法吗?
221
+
222
+ 可以,直接通过 `ref` 访问组件实例并调用公开方法。
223
+
224
+ ### 3. 地图不显示怎么办?
225
+
226
+ 请检查以下几点:
227
+
228
+ - `tk` 是否填写正确
229
+ - 页面容器是否设置了高度
230
+ - 天地图 API 是否能正常加载
231
+ - 当前网络环境是否允许访问天地图资源
232
+
233
+ ### 4. 标注不显示怎么办?
234
+
235
+ 请确认:
236
+
237
+ - `lng` 和 `lat` 是数字
238
+ - `markers` 是数组
239
+ - 地图已经初始化完成
240
+
241
+ ## License
242
+
243
+ MIT