map_view_vue3 0.0.1 → 0.0.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.
- package/README.md +232 -0
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
# map_view_vue3
|
|
2
|
+
|
|
3
|
+
基于 Vue 3 + OpenLayers 的地图查看器组件,支持栅格图片、本地切片 XYZ、在线 XYZ、GeoJSON/SLD 数据加载,并提供坐标系切换、图层管理、拖拽加载等能力。
|
|
4
|
+
|
|
5
|
+
## 目录结构
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
map_view_vue3/
|
|
9
|
+
├─ map_view_vue3.js # ESM 构建产物
|
|
10
|
+
├─ map_view_vue3.umd.cjs # UMD 构建产物
|
|
11
|
+
├─ map_view_vue3.css # 组件样式
|
|
12
|
+
├─ types/index.d.ts # TypeScript 类型声明
|
|
13
|
+
├─ favicon.svg
|
|
14
|
+
└─ icons.svg
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## 引入方式
|
|
18
|
+
|
|
19
|
+
### 方式一:按需引入组件
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
import { createApp } from 'vue'
|
|
23
|
+
import { MapViewVue3 } from './map_view_vue3/map_view_vue3.js'
|
|
24
|
+
import './map_view_vue3/map_view_vue3.css'
|
|
25
|
+
|
|
26
|
+
import App from './App.vue'
|
|
27
|
+
|
|
28
|
+
const app = createApp(App)
|
|
29
|
+
app.component('MapViewVue3', MapViewVue3)
|
|
30
|
+
app.mount('#app')
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### 方式二:全局插件式注册
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
import { createApp } from 'vue'
|
|
37
|
+
import MapViewVue3 from './map_view_vue3/map_view_vue3.js'
|
|
38
|
+
import './map_view_vue3/map_view_vue3.css'
|
|
39
|
+
|
|
40
|
+
import App from './App.vue'
|
|
41
|
+
|
|
42
|
+
const app = createApp(App)
|
|
43
|
+
app.use(MapViewVue3)
|
|
44
|
+
app.mount('#app')
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## 基础用法
|
|
48
|
+
|
|
49
|
+
```vue
|
|
50
|
+
<template>
|
|
51
|
+
<MapViewVue3
|
|
52
|
+
theme="light"
|
|
53
|
+
data-crs="EPSG:3857"
|
|
54
|
+
:zoom="4.2"
|
|
55
|
+
width="1000px"
|
|
56
|
+
height="800px"
|
|
57
|
+
map-background="#ffffff"
|
|
58
|
+
:auto-load="autoLoad"
|
|
59
|
+
@view-changed="onViewChanged"
|
|
60
|
+
@active-map-changed="onActiveMapChanged"
|
|
61
|
+
/>
|
|
62
|
+
</template>
|
|
63
|
+
|
|
64
|
+
<script setup lang="ts">
|
|
65
|
+
import { ref } from 'vue'
|
|
66
|
+
|
|
67
|
+
const autoLoad = ref({
|
|
68
|
+
type: 'manifest',
|
|
69
|
+
url: 'http://localhost:7010/geojson/metadata.json',
|
|
70
|
+
baseUrl: 'http://localhost:7010/geojson'
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
function onViewChanged(state: { center: number[] | null; zoom: number | null; crs: string }) {
|
|
74
|
+
console.log('视野变化', state)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function onActiveMapChanged(payload: { id: number; name: string; kind: string }) {
|
|
78
|
+
console.log('当前地图变化', payload)
|
|
79
|
+
}
|
|
80
|
+
</script>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Props
|
|
84
|
+
|
|
85
|
+
| 名称 | 类型 | 默认值 | 说明 |
|
|
86
|
+
| --- | --- | --- | --- |
|
|
87
|
+
| `theme` | `'light' \| 'dark'` | `'light'` | 明暗主题 |
|
|
88
|
+
| `dataCrs` | `string` | `'EPSG:3857'` | 初始数据坐标系 |
|
|
89
|
+
| `zoom` | `number` | `4.2` | 初始缩放级别 |
|
|
90
|
+
| `hidePanels` | `boolean` | `false` | 是否隐藏两侧面板 |
|
|
91
|
+
| `width` | `string \| number \| null` | `null` | 固定宽度,如 `'1000px'` |
|
|
92
|
+
| `height` | `string \| number \| null` | `null` | 固定高度,如 `'800px'` |
|
|
93
|
+
| `mapBackground` | `string \| null` | `null` | 地图画布背景色 |
|
|
94
|
+
| `autoLoad` | `AutoLoadConfig \| null` | `null` | 挂载后自动加载数据源 |
|
|
95
|
+
|
|
96
|
+
## autoLoad 示例
|
|
97
|
+
|
|
98
|
+
### 加载 GeoJSON 清单
|
|
99
|
+
|
|
100
|
+
```ts
|
|
101
|
+
const autoLoad = {
|
|
102
|
+
type: 'manifest',
|
|
103
|
+
url: 'https://example.com/geojson/metadata.json',
|
|
104
|
+
baseUrl: 'https://example.com/geojson'
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### 加载图片
|
|
109
|
+
|
|
110
|
+
```ts
|
|
111
|
+
const autoLoad = {
|
|
112
|
+
type: 'image',
|
|
113
|
+
url: 'https://example.com/map.png',
|
|
114
|
+
worldFile: 'https://example.com/map.pgw',
|
|
115
|
+
crs: 'EPSG:3857',
|
|
116
|
+
name: '示例地图'
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## 事件
|
|
121
|
+
|
|
122
|
+
| 事件名 | 参数 | 说明 |
|
|
123
|
+
| --- | --- | --- |
|
|
124
|
+
| `theme-changed` | `theme: 'light' \| 'dark'` | 主题切换 |
|
|
125
|
+
| `view-changed` | `{ center, zoom, crs }` | 视野变化 |
|
|
126
|
+
| `active-map-changed` | `{ id, name, kind }` | 当前地图切换 |
|
|
127
|
+
| `map-removed` | `{ id, name, kind }` | 地图删除 |
|
|
128
|
+
| `layer-removed` | `{ isGroup, name, layerCount, group }` | 图层删除 |
|
|
129
|
+
| `notify` | `{ message, type }` | 通知信息 |
|
|
130
|
+
|
|
131
|
+
## 常用实例方法
|
|
132
|
+
|
|
133
|
+
可以通过模板 `ref` 调用组件内部暴露的方法。
|
|
134
|
+
|
|
135
|
+
```vue
|
|
136
|
+
<template>
|
|
137
|
+
<MapViewVue3 ref="viewer" />
|
|
138
|
+
<button @click="loadLayers">加载图层</button>
|
|
139
|
+
</template>
|
|
140
|
+
|
|
141
|
+
<script setup lang="ts">
|
|
142
|
+
import { ref } from 'vue'
|
|
143
|
+
|
|
144
|
+
const viewer = ref()
|
|
145
|
+
|
|
146
|
+
async function loadLayers() {
|
|
147
|
+
await viewer.value?.loadGeoJsonFromData([
|
|
148
|
+
{
|
|
149
|
+
name: '道路',
|
|
150
|
+
geojson: { type: 'FeatureCollection', features: [] },
|
|
151
|
+
sld: '<StyledLayerDescriptor></StyledLayerDescriptor>'
|
|
152
|
+
}
|
|
153
|
+
])
|
|
154
|
+
}
|
|
155
|
+
</script>
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
常用方法包括:
|
|
159
|
+
|
|
160
|
+
| 方法 | 说明 |
|
|
161
|
+
| --- | --- |
|
|
162
|
+
| `waitViewerReady()` | 等待地图查看器初始化完成 |
|
|
163
|
+
| `loadImageFromUrl(options)` | 通过 URL 加载图片地图 |
|
|
164
|
+
| `addXyzLayer(options)` | 加载在线 XYZ 图层 |
|
|
165
|
+
| `loadGeoJsonFromFiles(files)` | 加载 GeoJSON / SLD 文件 |
|
|
166
|
+
| `loadGeoJsonFromManifest(manifest, baseUrl?)` | 通过 manifest 加载矢量数据 |
|
|
167
|
+
| `loadGeoJsonFromData(layers)` | 直接传入 GeoJSON / SLD 数据 |
|
|
168
|
+
| `fitActiveMap()` | 定位到当前地图 |
|
|
169
|
+
| `fitToExtent(extent, projection?)` | 定位到指定范围 |
|
|
170
|
+
| `getViewState()` | 获取当前视野状态 |
|
|
171
|
+
| `getActiveMapInfo()` | 获取当前地图信息 |
|
|
172
|
+
| `applyTheme(theme)` | 切换明暗主题 |
|
|
173
|
+
| `normalizeEpsg(value)` | 规范化 EPSG 代码 |
|
|
174
|
+
|
|
175
|
+
## 数据格式说明
|
|
176
|
+
|
|
177
|
+
### GeoJSON / SLD 目录
|
|
178
|
+
|
|
179
|
+
支持按文件名主干配对的 `.geojson` / `.json` 与 `.sld` / `.xml` 文件。
|
|
180
|
+
|
|
181
|
+
```text
|
|
182
|
+
layers/
|
|
183
|
+
├─ roads.geojson
|
|
184
|
+
├─ roads.sld
|
|
185
|
+
├─ buildings.geojson
|
|
186
|
+
└─ buildings.sld
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### manifest 示例
|
|
190
|
+
|
|
191
|
+
```json
|
|
192
|
+
{
|
|
193
|
+
"layers": [
|
|
194
|
+
{
|
|
195
|
+
"name": "道路",
|
|
196
|
+
"geojson": "roads.geojson",
|
|
197
|
+
"sld": "roads.sld"
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
"name": "建筑",
|
|
201
|
+
"geojson": "buildings.geojson",
|
|
202
|
+
"sld": "buildings.sld"
|
|
203
|
+
}
|
|
204
|
+
]
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
如果 `metadata.json` 存在,会用于图层排序和标题显示。
|
|
209
|
+
|
|
210
|
+
## 注意事项
|
|
211
|
+
|
|
212
|
+
1. 使用前请确保项目已引入 Vue 3。
|
|
213
|
+
2. 本组件依赖 OpenLayers 与 proj4,构建产物中通常已经打包;如果你使用源码方式集成,请确保项目里已安装相关依赖。
|
|
214
|
+
3. 加载远程 GeoJSON、图片或切片时,注意目标服务是否允许跨域访问。
|
|
215
|
+
4. 如果使用本地切片目录,推荐按 `z/x/y.png` 的 XYZ 结构组织数据。
|
|
216
|
+
5. 如需在线获取 EPSG 定义,需要能访问 `epsg.io`。
|
|
217
|
+
|
|
218
|
+
## TypeScript
|
|
219
|
+
|
|
220
|
+
类型声明位于 `types/index.d.ts`,可以直接使用:
|
|
221
|
+
|
|
222
|
+
```ts
|
|
223
|
+
import type {
|
|
224
|
+
MapViewerProps,
|
|
225
|
+
MapViewerEmits,
|
|
226
|
+
MapViewerInstance
|
|
227
|
+
} from './map_view_vue3/types'
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
## 许可证
|
|
231
|
+
|
|
232
|
+
ISC
|