af-mobile-client-vue3 1.0.98 → 1.1.2

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.
@@ -0,0 +1,20 @@
1
+ // https://github.com/pengzhanbo/vite-plugin-mock-dev-server
2
+ import { defineMock } from 'vite-plugin-mock-dev-server'
3
+
4
+ export default defineMock([
5
+ {
6
+ url: '/api/demo/post',
7
+ method: 'POST',
8
+ body: (params) => {
9
+ return {
10
+ code: 200,
11
+ msg: '操作成功',
12
+ data: {
13
+ ...params,
14
+ id: Math.floor(Math.random() * 1000),
15
+ timestamp: new Date().toISOString(),
16
+ },
17
+ }
18
+ },
19
+ },
20
+ ])
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "af-mobile-client-vue3",
3
3
  "type": "module",
4
- "version": "1.0.98",
4
+ "version": "1.1.2",
5
5
  "description": "Vue + Vite component lib",
6
6
  "license": "MIT",
7
7
  "engines": {
@@ -0,0 +1,220 @@
1
+ # XOlMap 地图组件使用说明
2
+
3
+ ## 组件简介
4
+
5
+ XOlMap 是一个基于 OpenLayers 的地图组件,支持多种底图切换、WMS 图层加载、点位渲染等功能。组件使用 Vue 3 + TypeScript 开发,采用 Composition API 和 `<script setup>` 语法。
6
+
7
+ ## 功能特性
8
+
9
+ - 支持多种底图切换(高德地图、高德卫星图、天地图、天地图卫星图)
10
+ - 支持 WMS 图层加载和控制
11
+ - 支持点位渲染(普通点位、分类点位、海量点)
12
+ - 支持地图基本操作(缩放、平移、中心点设置等)
13
+ - 支持移动端适配
14
+
15
+ ## 安装依赖
16
+
17
+ ```bash
18
+ npm install ol vant
19
+ ```
20
+
21
+ ## 基本用法
22
+
23
+ ```vue
24
+ <template>
25
+ <XOlMap ref="mapRef" />
26
+ </template>
27
+
28
+ <script setup lang="ts">
29
+ import { onMounted, ref } from 'vue'
30
+ import XOlMap from './index.vue'
31
+
32
+ const mapRef = ref()
33
+
34
+ onMounted(() => {
35
+ // 初始化地图
36
+ mapRef.value.init({
37
+ center: [116.404, 39.915], // 北京坐标
38
+ zoom: 12,
39
+ maxZoom: 18,
40
+ minZoom: 4,
41
+ tianDiTuKey: 'your-tianditu-key', // 天地图密钥
42
+ })
43
+ })
44
+ </script>
45
+ ```
46
+
47
+ ## 组件属性
48
+
49
+ ### 初始化参数 (InitParams)
50
+
51
+ | 参数名 | 类型 | 默认值 | 说明 |
52
+ |--------|------|--------|------|
53
+ | center | [number, number] | [116.404, 39.915] | 地图中心点坐标 [经度, 纬度] |
54
+ | zoom | number | 10 | 地图缩放级别 |
55
+ | maxZoom | number | 18 | 最大缩放级别 |
56
+ | minZoom | number | 4 | 最小缩放级别 |
57
+ | tianDiTuKey | string | '' | 天地图密钥 |
58
+
59
+ ## 组件方法
60
+
61
+ ### 地图控制
62
+
63
+ | 方法名 | 参数 | 返回值 | 说明 |
64
+ |--------|------|--------|------|
65
+ | init | InitParams | void | 初始化地图 |
66
+ | getMap | - | Map \| null | 获取地图实例 |
67
+ | setCenter | center: [number, number], animate?: boolean | void | 设置地图中心点 |
68
+ | setZoom | zoom: number, animate?: boolean | void | 设置地图缩放级别 |
69
+ | getZoom | - | number | 获取当前缩放级别 |
70
+ | setCenterAndZoom | center: [number, number], zoom: number, animate?: boolean | void | 设置地图中心点和缩放级别 |
71
+
72
+ ### 图层控制
73
+
74
+ | 方法名 | 参数 | 返回值 | 说明 |
75
+ |--------|------|--------|------|
76
+ | addWMSLayers | options: WMSOptions | void | 添加 WMS 图层 |
77
+ | setWMSLayerVisible | layerName: string, visible: boolean | void | 控制 WMS 图层显示/隐藏 |
78
+ | handleToggleWMSLayer | layer: WMSLayerConfig | void | 切换 WMS 图层显示状态 |
79
+ | addPointLayer | config: PointLayerConfig, points: PointData[] | number | 添加点位图层 |
80
+ | setPointLayerVisible | layerId: number, visible: boolean | void | 控制点位图层显示/隐藏 |
81
+
82
+ ### 点位渲染
83
+
84
+ | 方法名 | 参数 | 返回值 | 说明 |
85
+ |--------|------|--------|------|
86
+ | addVectorPoints | config: PointLayerConfig | VectorLayer<VectorSource> \| null | 渲染普通点位 |
87
+ | addWebGLPoints | options: WebGLPointOptions | void | 渲染海量点 |
88
+
89
+ ## 类型定义
90
+
91
+ ### PointData 点位数据
92
+
93
+ ```typescript
94
+ interface PointData {
95
+ longitude: number // 经度
96
+ latitude: number // 纬度
97
+ title?: string // 点标题
98
+ extData?: Record<string, any> // 自定义数据
99
+ }
100
+ ```
101
+
102
+ ### PointLayerConfig 点位图层配置
103
+
104
+ ```typescript
105
+ interface PointLayerConfig {
106
+ id: number // 图层ID
107
+ value: string // 图层名称
108
+ show: boolean // 是否显示
109
+ icon: string // 图标URL
110
+ iconAnchor?: [number, number] // 图标锚点
111
+ onClick?: (point: PointData, event: any) => void // 点击回调函数
112
+ data?: PointData[] // 点位数据
113
+ }
114
+ ```
115
+
116
+ ### WebGLPointOptions WebGL渲染配置
117
+
118
+ ```typescript
119
+ interface WebGLPointOptions extends PointLayerConfig {
120
+ iconSize?: [number, number] // 图标大小
121
+ enableCluster?: boolean // 是否开启聚合
122
+ clusterDistance?: number // 聚合距离
123
+ performance?: { // 性能配置
124
+ enableChunk?: boolean // 是否开启分块加载
125
+ chunkSize?: number // 每块数据量
126
+ enableThrottle?: boolean // 是否开启节流
127
+ throttleWait?: number // 节流时间间隔
128
+ }
129
+ }
130
+ ```
131
+
132
+ ## 示例代码
133
+
134
+ ### 添加普通点位
135
+
136
+ ```typescript
137
+ mapRef.value.addVectorPoints({
138
+ icon: 'path/to/icon.png',
139
+ iconAnchor: [0.5, 1],
140
+ data: [
141
+ {
142
+ longitude: 116.404,
143
+ latitude: 39.915,
144
+ title: '测试点位',
145
+ extData: { type: 'test' }
146
+ }
147
+ ],
148
+ onClick: (point) => {
149
+ console.log('点击了点位:', point)
150
+ }
151
+ })
152
+ ```
153
+
154
+ ### 添加分类点位
155
+
156
+ ```typescript
157
+ mapRef.value.addPointLayer(
158
+ {
159
+ id: 1,
160
+ value: '学校',
161
+ show: true,
162
+ icon: 'path/to/icon.png',
163
+ iconAnchor: [0.5, 1],
164
+ onClick: (point) => {
165
+ console.log('点击了学校:', point)
166
+ }
167
+ },
168
+ [
169
+ {
170
+ longitude: 116.404,
171
+ latitude: 39.915,
172
+ title: '北京大学',
173
+ extData: { type: 'school' }
174
+ }
175
+ ]
176
+ )
177
+ ```
178
+
179
+ ### 添加海量点
180
+
181
+ ```typescript
182
+ mapRef.value.addWebGLPoints({
183
+ icon: 'path/to/icon.png',
184
+ iconSize: [6, 6],
185
+ data: Array.from({ length: 10000 }, (_, i) => ({
186
+ longitude: 116.404 + Math.random() * 0.1,
187
+ latitude: 39.915 + Math.random() * 0.1,
188
+ title: `点位${i + 1}`,
189
+ extData: { type: 'mass' }
190
+ })),
191
+ performance: {
192
+ enableChunk: true,
193
+ chunkSize: 1000
194
+ }
195
+ })
196
+ ```
197
+
198
+ ## 注意事项
199
+
200
+ 1. 使用天地图时需要提供有效的天地图密钥
201
+ 2. 海量点渲染建议使用 WebGL 方式,性能更好
202
+ 3. 点位图层的 zIndex 会根据是否有 ID 自动设置
203
+ 4. 移动端适配已内置,无需额外配置
204
+
205
+ ## 常见问题
206
+
207
+ 1. 地图不显示
208
+ - 检查容器高度是否设置
209
+ - 检查网络连接是否正常
210
+ - 检查天地图密钥是否有效
211
+
212
+ 2. 点位不显示
213
+ - 检查点位数据格式是否正确
214
+ - 检查图标 URL 是否可访问
215
+ - 检查图层是否设置为显示状态
216
+
217
+ 3. 性能问题
218
+ - 大量点位建议使用 WebGL 渲染
219
+ - 开启分块加载和节流功能
220
+ - 合理设置聚合参数
@@ -1,12 +1,68 @@
1
1
  <script setup lang="ts">
2
+ import { showNotify } from 'vant'
2
3
  import { onMounted, ref } from 'vue'
3
4
  import XOlMap from './index.vue'
4
5
  import 'vant/lib/index.css'
5
6
 
6
7
  const mapRef = ref()
7
8
 
9
+ // WMS 配置
10
+ const wmsConfig = {
11
+ layers: [
12
+ {
13
+ phoneShow: false,
14
+ show: false,
15
+ id: 1,
16
+ layerName: 'gis:lp',
17
+ value: '低压管线',
18
+ },
19
+ {
20
+ phoneShow: true,
21
+ show: true,
22
+ id: 2,
23
+ layerName: 'gis:mp',
24
+ value: '中压管线',
25
+ },
26
+ {
27
+ phoneShow: false,
28
+ show: false,
29
+ id: 3,
30
+ layerName: 'gis:surface_valve',
31
+ value: '地面阀门',
32
+ },
33
+ {
34
+ phoneShow: false,
35
+ show: false,
36
+ id: 4,
37
+ layerName: 'gis:valve_chamber',
38
+ value: '阀门井',
39
+ },
40
+ {
41
+ phoneShow: false,
42
+ show: false,
43
+ id: 6,
44
+ layerName: 'gis:hp',
45
+ value: '高压管线',
46
+ },
47
+ {
48
+ phoneShow: false,
49
+ show: false,
50
+ id: 5,
51
+ layerName: 'gis:pressure_regulating_box',
52
+ value: '调压箱',
53
+ },
54
+ ],
55
+ wms: {
56
+ workspace: 'gis',
57
+ srs: 'EPSG:3857',
58
+ format: 'image/png',
59
+ version: '1.1.0',
60
+ url: '/linepatrol/geoserver/gis/wms',
61
+ },
62
+ }
63
+
64
+ // 初始化地图
8
65
  onMounted(() => {
9
- // 初始化地图
10
66
  mapRef.value.init({
11
67
  center: [108.948024, 34.263161], // 西安坐标
12
68
  zoom: 12,
@@ -14,80 +70,134 @@ onMounted(() => {
14
70
  minZoom: 4,
15
71
  tianDiTuKey: 'c16876b28898637c0a1a68b3fa410504',
16
72
  })
73
+ mapRef.value.addWMSLayers(wmsConfig)
17
74
  })
18
75
 
19
76
  // 地图控制函数
20
- function handleSetCenter(): void {
21
- // 切换到北京
22
- mapRef.value.setCenter([116.404, 39.915])
23
- }
77
+ const handleSetCenter = () => mapRef.value.setCenter([116.404, 39.915]) // 切换到北京
78
+ const handleSetZoom = () => mapRef.value.setZoom(14) // 设置缩放级别为14
79
+ const handleGetZoom = () => showNotify({ type: 'primary', message: `当前缩放级别:${mapRef.value.getZoom()}` })
80
+ const handleSetCenterAndZoom = () => mapRef.value.setCenterAndZoom([120.153576, 30.287459], 15) // 切换到杭州
24
81
 
25
- function handleSetZoom(): void {
26
- // 设置缩放级别为14
27
- mapRef.value.setZoom(14)
28
- }
82
+ // 点位数据
83
+ const poiPoints = [
84
+ {
85
+ longitude: 108.988024,
86
+ latitude: 34.283161,
87
+ title: '大雁塔',
88
+ extData: { type: 'poi' },
89
+ },
90
+ {
91
+ longitude: 108.948024,
92
+ latitude: 34.263161,
93
+ title: '钟楼',
94
+ extData: { type: 'poi' },
95
+ },
96
+ {
97
+ longitude: 108.968024,
98
+ latitude: 34.273161,
99
+ title: '小寨',
100
+ extData: { type: 'poi' },
101
+ },
102
+ ]
29
103
 
30
- function handleGetZoom(): void {
31
- // 获取当前缩放级别
32
- const zoom = mapRef.value.getZoom()
33
- // eslint-disable-next-line no-alert
34
- alert(`当前缩放级别:${zoom}`)
35
- }
104
+ const schoolPoints = [
105
+ {
106
+ longitude: 108.968024,
107
+ latitude: 34.273161,
108
+ title: '西安电子科技大学',
109
+ extData: {
110
+ type: 'school',
111
+ level: '985',
112
+ studentCount: 25000,
113
+ departments: ['通信学院', '计算机学院', '电子工程学院'],
114
+ },
115
+ },
116
+ ]
117
+
118
+ const hospitalPoints = [
119
+ {
120
+ longitude: 108.948024,
121
+ latitude: 34.263161,
122
+ title: '西安市第一医院',
123
+ extData: {
124
+ type: 'hospital',
125
+ level: '三甲',
126
+ departments: ['急诊科', '内科', '外科'],
127
+ contact: '029-12345678',
128
+ address: '西安市雁塔区',
129
+ },
130
+ },
131
+ {
132
+ longitude: 108.978024,
133
+ latitude: 34.278161,
134
+ title: '西安市中心医院',
135
+ extData: {
136
+ type: 'hospital',
137
+ level: '三甲',
138
+ departments: ['急诊科', '内科', '外科'],
139
+ contact: '029-87654321',
140
+ address: '西安市新城区',
141
+ },
142
+ },
143
+ ]
36
144
 
37
- function handleSetCenterAndZoom(): void {
38
- // 切换到杭州并设置缩放级别
39
- mapRef.value.setCenterAndZoom([120.153576, 30.287459], 15)
145
+ // 点位处理函数
146
+ function handlePointClick(point: any) {
147
+ showNotify({
148
+ type: 'primary',
149
+ message: `点击了: ${point.title}\n类型: ${point.extData.type}`,
150
+ })
40
151
  }
41
152
 
42
- // 添加点位示例,创建两种类型
43
- function handleAddPoints(): void {
153
+ // 添加点位示例
154
+ function handleAddPoints() {
44
155
  mapRef.value.addVectorPoints({
45
156
  icon: 'https://a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-red.png',
46
157
  iconAnchor: [0.5, 1],
47
- data: [
48
- {
49
- longitude: 108.988024,
50
- latitude: 34.283161,
51
- title: '示例点2',
52
- extData: { type: 'poi' },
53
- },
54
- ],
55
- onClick: (point) => {
56
- // eslint-disable-next-line no-alert
57
- alert(`点击了: ${point.title}`)
58
- },
158
+ data: poiPoints,
159
+ onClick: handlePointClick,
59
160
  })
60
- mapRef.value.addVectorPoints({
61
- icon: 'https://a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-red.png',
62
- iconAnchor: [0.5, 1],
63
- data: [
64
- {
65
- longitude: 108.948024,
66
- latitude: 34.263161,
67
- title: '西安市',
68
- extData: { type: 'city' },
69
- },
70
- ],
71
- onClick: (point) => {
72
- // eslint-disable-next-line no-alert
73
- alert(`点击了: ${point.title}`)
161
+ }
162
+
163
+ // 添加分类点位示例
164
+ function handleAddPointLayer() {
165
+ // 添加学校点位图层
166
+ mapRef.value.addPointLayer(
167
+ {
168
+ id: 1,
169
+ value: '学校',
170
+ show: true,
171
+ icon: 'https://a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png',
172
+ iconAnchor: [0.5, 1],
173
+ onClick: handlePointClick,
74
174
  },
75
- })
175
+ schoolPoints,
176
+ )
177
+
178
+ // 添加医院点位图层
179
+ mapRef.value.addPointLayer(
180
+ {
181
+ id: 2,
182
+ value: '医院',
183
+ show: true,
184
+ icon: 'https://a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png',
185
+ iconAnchor: [0.5, 1],
186
+ onClick: handlePointClick,
187
+ },
188
+ hospitalPoints,
189
+ )
76
190
  }
77
191
 
78
192
  // 添加海量点示例
79
- function handleAddMassPoints(): void {
193
+ function handleAddMassPoints() {
80
194
  // 生成10000个随机点
81
- const data = Array.from({ length: 10000 }, (_, index) => {
82
- // 在西安市区范围内随机生成点
83
- const offset = 0.1 // 控制点的分布范围
84
- return {
85
- longitude: 108.948024 + (Math.random() - 0.5) * offset,
86
- latitude: 34.263161 + (Math.random() - 0.5) * offset,
87
- title: `点位${index + 1}`,
88
- extData: { type: 'mass' },
89
- }
90
- })
195
+ const data = Array.from({ length: 10000 }, (_, index) => ({
196
+ longitude: 108.948024 + (Math.random() - 0.5) * 0.1,
197
+ latitude: 34.263161 + (Math.random() - 0.5) * 0.1,
198
+ title: `点位${index + 1}`,
199
+ extData: { type: 'mass' },
200
+ }))
91
201
 
92
202
  mapRef.value.addWebGLPoints({
93
203
  icon: 'https://a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-red.png',
@@ -132,6 +242,9 @@ function handleAddMassPoints(): void {
132
242
  <van-button type="success" size="small" @click="handleAddPoints">
133
243
  添加普通点位
134
244
  </van-button>
245
+ <van-button type="success" size="small" @click="handleAddPointLayer">
246
+ 添加分类点位
247
+ </van-button>
135
248
  <van-button type="warning" size="small" @click="handleAddMassPoints">
136
249
  添加海量点(1万)
137
250
  </van-button>
@@ -177,6 +290,14 @@ function handleAddMassPoints(): void {
177
290
  padding-left: 4px;
178
291
  border-left: 3px solid #1989fa;
179
292
  }
293
+
294
+ :deep(.van-button) {
295
+ margin-bottom: 8px;
296
+
297
+ &:last-child {
298
+ margin-bottom: 0;
299
+ }
300
+ }
180
301
  }
181
302
 
182
303
  :deep(.van-button) {