map_view_vue2 0.0.1 → 0.0.3
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 +171 -0
- package/index.d.ts +138 -0
- package/map_view_vue2.common.js +370 -300
- package/map_view_vue2.common.js.map +1 -1
- package/map_view_vue2.css +1 -1
- package/map_view_vue2.umd.js +370 -300
- package/map_view_vue2.umd.js.map +1 -1
- package/map_view_vue2.umd.min.js +1 -1
- package/map_view_vue2.umd.min.js.map +1 -1
- package/package.json +2 -1
package/README.md
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# map_view_vue2 地图查看器组件
|
|
2
|
+
|
|
3
|
+
> 基于 OpenLayers + proj4 的 Vue 2 地图查看器组件,支持 PNG 栅格地图(世界文件定位)、GeoJSON + SLD 矢量图层、多坐标系切换、明暗主题,开箱即用。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# npm
|
|
9
|
+
npm install map_view_vue2 --save
|
|
10
|
+
|
|
11
|
+
# yarn
|
|
12
|
+
yarn add map_view_vue2
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
// main.js
|
|
17
|
+
import MapView from 'map_view_vue2'
|
|
18
|
+
import 'map_view_vue2/map_view_vue2.css'
|
|
19
|
+
Vue.use(MapView)
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## 快速上手
|
|
24
|
+
|
|
25
|
+
完整绑定示例(全部 props 与全部事件):
|
|
26
|
+
|
|
27
|
+
```vue
|
|
28
|
+
<template>
|
|
29
|
+
<div id="app">
|
|
30
|
+
<mapView
|
|
31
|
+
ref="viewer"
|
|
32
|
+
:theme="theme"
|
|
33
|
+
:data-crs="dataCrs"
|
|
34
|
+
:zoom="zoom"
|
|
35
|
+
:hide-panels="hidePanels"
|
|
36
|
+
:show-loader="showLoader"
|
|
37
|
+
:width="viewerWidth"
|
|
38
|
+
:height="viewerHeight"
|
|
39
|
+
:map-background="mapBackground"
|
|
40
|
+
:auto-load="autoLoad"
|
|
41
|
+
@layer-removed="onLayerRemoved"
|
|
42
|
+
@view-changed="onViewChanged"
|
|
43
|
+
@theme-changed="onThemeChanged" />
|
|
44
|
+
</div>
|
|
45
|
+
</template>
|
|
46
|
+
|
|
47
|
+
<script>
|
|
48
|
+
export default {
|
|
49
|
+
data () {
|
|
50
|
+
return {
|
|
51
|
+
theme: 'light', // light | dark
|
|
52
|
+
dataCrs: 'EPSG:3857', // 初始数据坐标系
|
|
53
|
+
zoom: 4.2, // 初始缩放级别
|
|
54
|
+
hidePanels: false, // 嵌入模式隐藏两侧面板
|
|
55
|
+
viewerWidth: '1000px', // 查看器宽度:数字按 px,字符串原样使用;null 铺满父容器
|
|
56
|
+
viewerHeight: '800px', // 查看器高度:数字按 px,字符串原样使用;null 铺满父容器
|
|
57
|
+
mapBackground: '#ffffff', // 地图画布背景色;null 跟随明暗主题默认背景
|
|
58
|
+
autoLoad: {
|
|
59
|
+
type: 'manifest', // manifest=矢量清单 / image=PNG 栅格地图
|
|
60
|
+
url: 'http://your-server.com/geojson/metadata.json',
|
|
61
|
+
baseUrl: 'http://your-server.com/geojson'
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
},
|
|
65
|
+
methods: {
|
|
66
|
+
// 图层删除:info = { isGroup, name, layerCount, group }
|
|
67
|
+
onLayerRemoved ({ isGroup, name, layerCount, group }) {
|
|
68
|
+
// isGroup :true --- 点击的是图层组的删除, false----点击的是图层组下面的删除
|
|
69
|
+
if (isGroup) {
|
|
70
|
+
console.log('删除了图层组:' + name + ',包含 ' + layerCount + ' 个图层');
|
|
71
|
+
} else {
|
|
72
|
+
console.log('删除了图层:' + name);
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
// 视图变化(moveend):state = { center, zoom, crs, ... }
|
|
76
|
+
onViewChanged (state) {},
|
|
77
|
+
// 主题切换:theme = light | dark
|
|
78
|
+
onThemeChanged (theme) {}
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
</script>
|
|
82
|
+
```
|
|
83
|
+
## Props
|
|
84
|
+
|
|
85
|
+
| Prop | 类型 | 默认值 | 说明 |
|
|
86
|
+
| --- | --- | --- | --- |
|
|
87
|
+
| theme | String | 'light' | 初始主题:light / dark,可在查看器内切换。 |
|
|
88
|
+
| dataCrs | String | 'EPSG:3857' | 初始数据坐标系(EPSG 代码)。 |
|
|
89
|
+
| zoom | Number | 4.2 | 初始缩放级别。 |
|
|
90
|
+
| hidePanels | Boolean | false | 隐藏两侧面板(嵌入模式)。 |
|
|
91
|
+
| width | String / Number | null | 固定查看器宽度:数字按 px,字符串原样使用(如 600 → 600px、100% → 100%)。不传则铺满父容器。 |
|
|
92
|
+
| height | String / Number | null | 固定查看器高度:同上(如 800 → 800px、100vh)。不传则铺满父容器。 |
|
|
93
|
+
| mapBackground | String | null | 地图画布背景色(任意 CSS 颜色值)。不传则跟随明暗主题默认背景。 |
|
|
94
|
+
| autoLoad | Object | null | 挂载后自动加载的数据源,见下方说明。 |
|
|
95
|
+
|
|
96
|
+
## autoLoad 自动加载数据源
|
|
97
|
+
|
|
98
|
+
组件挂载后按 `autoLoad` 配置自动加载地图,`type` 支持两种:
|
|
99
|
+
|
|
100
|
+
### type: manifest —— 矢量地图(GeoJSON + SLD 清单)
|
|
101
|
+
|
|
102
|
+
```js
|
|
103
|
+
autoLoad: {
|
|
104
|
+
type: 'manifest',
|
|
105
|
+
url: 'http://xxx.xxx.xxx.xx:xx/geojson/metadata.json', // 清单接口地址
|
|
106
|
+
baseUrl: 'http://xxx.xxx.xxx.xx:xx/geojson' // 清单内相对文件名的前缀
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
- 清单支持三种格式:URL 数组、`{ files: [...] }`、QGIS 导出的 `{ name, layers: [{ title, geojson, sld }] }`
|
|
111
|
+
- `.geojson` / `.json` 识别为矢量图层,`.sld` 按**同名主干**自动配对到对应 GeoJSON
|
|
112
|
+
- `metadata.json` 作为元数据使用(图层排序与标题)
|
|
113
|
+
|
|
114
|
+
### type: image —— PNG 栅格地图
|
|
115
|
+
|
|
116
|
+
```js
|
|
117
|
+
autoLoad: {
|
|
118
|
+
type: 'image',
|
|
119
|
+
url: 'http://xxx.xxx.xxx.xx:xx/333.png', // PNG 图片地址
|
|
120
|
+
worldFile: 'http://xxx.xxx.xxx.xx:xx/333.pgw', // 世界文件地址
|
|
121
|
+
name: '矿区底图' // 可选:地图条目显示名称
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
- 世界文件扩展名支持:`.pgw` / `.pwg` / `.jgw` / `.gfw` / `.wld` / `.pngw` / `.jpgw`
|
|
126
|
+
- 世界文件只提供地理范围与分辨率,**不含坐标系**,务必通过 `crs` 指定
|
|
127
|
+
|
|
128
|
+
## Events
|
|
129
|
+
|
|
130
|
+
| 事件 | 载荷 | 触发时机 |
|
|
131
|
+
| --- | --- | --- |
|
|
132
|
+
| map-added | { id, name, kind, extent, projection } | 新地图加载完成并加入列表。 |
|
|
133
|
+
| active-map-changed | { id, name, kind } | 当前活动地图切换。 |
|
|
134
|
+
| map-removed | { id, name, kind } | 地图条目被删除。 |
|
|
135
|
+
| layer-removed | { isGroup, name, layerCount, group } | 图层被移除。 |
|
|
136
|
+
| view-changed | { center, zoom, crs, ... } | 视图移动/缩放结束(moveend)。 |
|
|
137
|
+
| theme-changed | theme(light / dark) | 明暗主题切换。 |
|
|
138
|
+
|
|
139
|
+
## TypeScript
|
|
140
|
+
|
|
141
|
+
包内自带类型声明(`index.d.ts`),TypeScript 项目无需额外安装 `@types`:
|
|
142
|
+
|
|
143
|
+
```ts
|
|
144
|
+
import mapView from 'map_view_vue2'
|
|
145
|
+
|
|
146
|
+
// autoLoad / 事件载荷等均有完整类型提示
|
|
147
|
+
const autoLoad: import('map_view_vue2').AutoLoadSource = {
|
|
148
|
+
type: 'manifest',
|
|
149
|
+
url: 'http://xxx.xxx.xxx.xx:xx/geojson/metadata.json',
|
|
150
|
+
baseUrl: 'http://xxx.xxx.xxx.xx:xx/geojson'
|
|
151
|
+
};
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## 内置功能
|
|
155
|
+
|
|
156
|
+
- 侧栏右缘拖拽调宽(280 ~ 620px),缩放、全屏、比例尺、版权信息自动跟随
|
|
157
|
+
- 侧栏收起 / 展开
|
|
158
|
+
- 视图坐标系切换(所有图层自动重投影)
|
|
159
|
+
- GeoJSON 数据坐标系自动识别(优先读取文件声明的 CRS,如 CRS84 → EPSG:4326)
|
|
160
|
+
- 图层显隐、缩放定位、删除,GeoJSON 按 layer 属性自动分组
|
|
161
|
+
- 明暗主题切换
|
|
162
|
+
|
|
163
|
+
## 注意事项
|
|
164
|
+
|
|
165
|
+
1. 所有远程数据(清单、GeoJSON、SLD、PNG、世界文件)通过浏览器加载,跨域时数据服务必须返回 `Access-Control-Allow-Origin` 响应头
|
|
166
|
+
2. 世界文件只提供地理位置与尺寸,不含坐标系信息,加载 PNG 地图时务必通过 `crs` 指定正确坐标系
|
|
167
|
+
3. 组件依赖 `ol` 与 `proj4`,安装包时会自动带入
|
|
168
|
+
|
|
169
|
+
## License
|
|
170
|
+
|
|
171
|
+
MIT
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* map_view_vue2 地图查看器组件类型声明(Vue 2)
|
|
3
|
+
*
|
|
4
|
+
* 组件基于 OpenLayers + proj4,支持 PNG 栅格地图(世界文件定位)、
|
|
5
|
+
* GeoJSON + SLD 矢量图层、多坐标系切换与明暗主题。
|
|
6
|
+
*/
|
|
7
|
+
import Vue from 'vue';
|
|
8
|
+
|
|
9
|
+
/** 主题类型 */
|
|
10
|
+
export type MapViewTheme = 'light' | 'dark';
|
|
11
|
+
|
|
12
|
+
/** autoLoad:矢量清单数据源 */
|
|
13
|
+
export interface AutoLoadManifest {
|
|
14
|
+
type: 'manifest';
|
|
15
|
+
/** 清单接口地址:支持 URL 数组、{ files: [...] } 与 QGIS 导出 { layers: [{ title, geojson, sld }] } */
|
|
16
|
+
url: string;
|
|
17
|
+
/** 清单内相对文件名的前缀 */
|
|
18
|
+
baseUrl?: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** autoLoad:PNG 栅格数据源 */
|
|
22
|
+
export interface AutoLoadImage {
|
|
23
|
+
type: 'image';
|
|
24
|
+
/** PNG 图片地址 */
|
|
25
|
+
url: string;
|
|
26
|
+
/** 世界文件地址(支持 .pgw / .pwg / .jgw / .gfw / .wld / .pngw / .jpgw) */
|
|
27
|
+
worldFile?: string;
|
|
28
|
+
/** 世界文件文本内容(传入时优先于 worldFile) */
|
|
29
|
+
worldText?: string;
|
|
30
|
+
/** 数据坐标系:世界文件不含坐标系信息;不传时自动按范围猜测中国高斯投影带号,未命中默认按 EPSG:3857 解析 */
|
|
31
|
+
crs?: string;
|
|
32
|
+
/** 地图条目显示名称 */
|
|
33
|
+
name?: string;
|
|
34
|
+
/** 固定地理范围 [minx, miny, maxx, maxy],传入时忽略世界文件 */
|
|
35
|
+
extent?: [number, number, number, number];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** autoLoad 数据源配置 */
|
|
39
|
+
export type AutoLoadSource = AutoLoadManifest | AutoLoadImage;
|
|
40
|
+
|
|
41
|
+
/** 地图条目信息(map-added / active-map-changed / map-removed 事件载荷) */
|
|
42
|
+
export interface MapInfo {
|
|
43
|
+
id: number;
|
|
44
|
+
name: string;
|
|
45
|
+
/** 地图类型:image / geojson / xyz 等 */
|
|
46
|
+
kind: string;
|
|
47
|
+
/** 数据范围 [minx, miny, maxx, maxy](仅 map-added 提供) */
|
|
48
|
+
extent?: number[];
|
|
49
|
+
/** 数据坐标系代码(仅 map-added 提供) */
|
|
50
|
+
projection?: string;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** 图层删除事件载荷 */
|
|
54
|
+
export interface LayerRemovedInfo {
|
|
55
|
+
/** 是否为图层组 */
|
|
56
|
+
isGroup: boolean;
|
|
57
|
+
/** 图层(组)名称 */
|
|
58
|
+
name: string;
|
|
59
|
+
/** 图层组包含的图层个数(仅图层组时提供) */
|
|
60
|
+
layerCount: number | null;
|
|
61
|
+
/** 所属分组名(仅图层组时提供) */
|
|
62
|
+
group: string | null;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** 视图变化事件载荷(view-changed) */
|
|
66
|
+
export interface ViewState {
|
|
67
|
+
center: number[];
|
|
68
|
+
zoom: number;
|
|
69
|
+
crs: string;
|
|
70
|
+
[key: string]: unknown;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** 组件实例方法:通过模板 ref 调用,如 this.$refs.viewer.loadImageFromUrl({...}) */
|
|
74
|
+
export interface MapViewInstance extends Vue {
|
|
75
|
+
/** 加载在线 XYZ 切片图层 */
|
|
76
|
+
addXyzLayer (options: {
|
|
77
|
+
url: string;
|
|
78
|
+
crs?: string;
|
|
79
|
+
minZoom?: number;
|
|
80
|
+
maxZoom?: number;
|
|
81
|
+
extent?: number[] | null;
|
|
82
|
+
extentCrs?: string | null;
|
|
83
|
+
}): Promise<unknown>;
|
|
84
|
+
/** 从 URL 加载 PNG 栅格地图(可选世界文件地址或文本) */
|
|
85
|
+
loadImageFromUrl (options: {
|
|
86
|
+
url: string;
|
|
87
|
+
name?: string | null;
|
|
88
|
+
crs?: string;
|
|
89
|
+
worldFileUrl?: string | null;
|
|
90
|
+
worldText?: string | null;
|
|
91
|
+
extent?: number[] | null;
|
|
92
|
+
}): Promise<unknown>;
|
|
93
|
+
/** 从清单对象加载矢量图层 */
|
|
94
|
+
loadGeoJsonFromManifest (manifest: unknown, baseUrl?: string): Promise<unknown>;
|
|
95
|
+
/** 从内联数据加载矢量图层:layers = [{ name, geojson, sld }],顺序即图层顺序 */
|
|
96
|
+
loadGeoJsonFromData (layers: Array<{ name: string; geojson: unknown; sld?: string }>): Promise<unknown>;
|
|
97
|
+
/** 从 File 列表加载 GeoJSON + SLD(同名主干自动配对) */
|
|
98
|
+
loadGeoJsonFromFiles (files: File[]): Promise<unknown>;
|
|
99
|
+
/** 定位到当前活动地图的地理范围 */
|
|
100
|
+
fitActiveMap (): void;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** 组件 Props 定义 */
|
|
104
|
+
export interface MapViewProps {
|
|
105
|
+
/** 初始主题:light / dark */
|
|
106
|
+
theme?: MapViewTheme;
|
|
107
|
+
/** 初始数据坐标系(EPSG 代码) */
|
|
108
|
+
dataCrs?: string;
|
|
109
|
+
/** 初始缩放级别 */
|
|
110
|
+
zoom?: number;
|
|
111
|
+
/** 隐藏两侧面板(嵌入模式) */
|
|
112
|
+
hidePanels?: boolean;
|
|
113
|
+
/** 是否显示「加载地图」按钮与对话框 */
|
|
114
|
+
showLoader?: boolean;
|
|
115
|
+
/** 固定查看器宽度:数字按 px,字符串原样使用;null 铺满父容器 */
|
|
116
|
+
width?: string | number | null;
|
|
117
|
+
/** 固定查看器高度:数字按 px,字符串原样使用;null 铺满父容器 */
|
|
118
|
+
height?: string | number | null;
|
|
119
|
+
/** 地图画布背景色(任意 CSS 颜色值);null 跟随明暗主题默认背景 */
|
|
120
|
+
mapBackground?: string | null;
|
|
121
|
+
/** 挂载后自动加载的数据源 */
|
|
122
|
+
autoLoad?: AutoLoadSource;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* 地图查看器组件(Vue 2)
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* import mapView from 'map_view_vue2'
|
|
130
|
+
* import 'map_view_vue2/map_view_vue2.css'
|
|
131
|
+
*
|
|
132
|
+
* export default {
|
|
133
|
+
* components: { mapView }
|
|
134
|
+
* }
|
|
135
|
+
*/
|
|
136
|
+
declare const MapView: Vue.ComponentOptions<Vue> & MapViewProps;
|
|
137
|
+
|
|
138
|
+
export default MapView;
|