@kimap/indoor-positioning-sdk-vue2 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/EXAMPLE.vue +234 -0
- package/KimapComponent.vue +149 -0
- package/LICENSE +21 -0
- package/QUICK_REFERENCE.md +351 -0
- package/README.md +448 -0
- package/index.js +33 -0
- package/package.json +50 -0
package/EXAMPLE.vue
ADDED
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="map-page">
|
|
3
|
+
<!-- 控制面板 -->
|
|
4
|
+
<div class="control-panel">
|
|
5
|
+
<h3>地图控制</h3>
|
|
6
|
+
<button @click="addMarker">添加标记</button>
|
|
7
|
+
<button @click="removeMarker">移除标记</button>
|
|
8
|
+
<button @click="updatePosition">更新位置</button>
|
|
9
|
+
<button @click="showInfo">显示弹窗</button>
|
|
10
|
+
<button @click="hideInfo">隐藏弹窗</button>
|
|
11
|
+
<button @click="startDrawLine">绘制线段</button>
|
|
12
|
+
<button @click="stopDraw">停止绘制</button>
|
|
13
|
+
</div>
|
|
14
|
+
|
|
15
|
+
<!-- 地图容器 -->
|
|
16
|
+
<kimap-component
|
|
17
|
+
ref="kimap"
|
|
18
|
+
:obj-url="modelUrl"
|
|
19
|
+
:origin="mapOrigin"
|
|
20
|
+
:max-x="100"
|
|
21
|
+
:max-y="50"
|
|
22
|
+
:show-grid="true"
|
|
23
|
+
:show-axes="true"
|
|
24
|
+
@ready="onMapReady"
|
|
25
|
+
@position-click="onPositionClick"
|
|
26
|
+
@error="onMapError"
|
|
27
|
+
/>
|
|
28
|
+
|
|
29
|
+
<!-- 信息显示 -->
|
|
30
|
+
<div class="info-panel" v-if="clickedPosition">
|
|
31
|
+
<p>点击位置: X={{ clickedPosition.x }}, Z={{ clickedPosition.z }}</p>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
</template>
|
|
35
|
+
|
|
36
|
+
<script>
|
|
37
|
+
// 导入Vue2兼容组件
|
|
38
|
+
import KimapComponent from './KimapComponent.vue';
|
|
39
|
+
|
|
40
|
+
// 使用CommonJS导入Three.js(兼容旧版项目)
|
|
41
|
+
var THREE = require('three');
|
|
42
|
+
|
|
43
|
+
export default {
|
|
44
|
+
name: 'MapExample',
|
|
45
|
+
components: {
|
|
46
|
+
KimapComponent
|
|
47
|
+
},
|
|
48
|
+
data: function() {
|
|
49
|
+
return {
|
|
50
|
+
modelUrl: '/static/models/building.obj', // 模型文件路径
|
|
51
|
+
mapOrigin: { x: 0, y: 0, z: 0 },
|
|
52
|
+
clickedPosition: null,
|
|
53
|
+
markerCount: 0,
|
|
54
|
+
isMapReady: false
|
|
55
|
+
};
|
|
56
|
+
},
|
|
57
|
+
methods: {
|
|
58
|
+
// 地图加载完成
|
|
59
|
+
onMapReady: function(sdk) {
|
|
60
|
+
console.log('地图初始化完成', sdk);
|
|
61
|
+
this.isMapReady = true;
|
|
62
|
+
this.$message && this.$message.success('地图加载成功');
|
|
63
|
+
},
|
|
64
|
+
|
|
65
|
+
// 地图加载失败
|
|
66
|
+
onMapError: function(error) {
|
|
67
|
+
console.error('地图加载失败:', error);
|
|
68
|
+
this.$message && this.$message.error('地图加载失败');
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
// 点击位置回调
|
|
72
|
+
onPositionClick: function(data) {
|
|
73
|
+
console.log('点击位置:', data.position);
|
|
74
|
+
this.clickedPosition = data.position;
|
|
75
|
+
},
|
|
76
|
+
|
|
77
|
+
// 添加标记
|
|
78
|
+
addMarker: function() {
|
|
79
|
+
if (!this.isMapReady) {
|
|
80
|
+
alert('地图未就绪');
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
this.markerCount++;
|
|
85
|
+
var id = 'marker-' + this.markerCount;
|
|
86
|
+
|
|
87
|
+
// 随机位置
|
|
88
|
+
var x = Math.random() * 80 + 10;
|
|
89
|
+
var z = Math.random() * 40 + 10;
|
|
90
|
+
|
|
91
|
+
this.$refs.kimap.addLocationMarker({
|
|
92
|
+
id: id,
|
|
93
|
+
position: new THREE.Vector3(x, 0, z),
|
|
94
|
+
label: '标记 ' + this.markerCount,
|
|
95
|
+
color: this.getRandomColor()
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
console.log('添加标记:', id);
|
|
99
|
+
},
|
|
100
|
+
|
|
101
|
+
// 移除标记
|
|
102
|
+
removeMarker: function() {
|
|
103
|
+
if (this.markerCount > 0) {
|
|
104
|
+
var id = 'marker-' + this.markerCount;
|
|
105
|
+
this.$refs.kimap.removeLocationMarker(id);
|
|
106
|
+
this.markerCount--;
|
|
107
|
+
console.log('移除标记:', id);
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
|
|
111
|
+
// 更新当前位置
|
|
112
|
+
updatePosition: function() {
|
|
113
|
+
if (!this.isMapReady) {
|
|
114
|
+
alert('地图未就绪');
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
var x = Math.random() * 80 + 10;
|
|
119
|
+
var z = Math.random() * 40 + 10;
|
|
120
|
+
var position = new THREE.Vector3(x, 0, z);
|
|
121
|
+
|
|
122
|
+
this.$refs.kimap.updateCurrentPosition(position);
|
|
123
|
+
console.log('更新位置:', position);
|
|
124
|
+
},
|
|
125
|
+
|
|
126
|
+
// 显示弹窗
|
|
127
|
+
showInfo: function() {
|
|
128
|
+
if (!this.isMapReady) {
|
|
129
|
+
alert('地图未就绪');
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
this.$refs.kimap.showPopup({
|
|
134
|
+
title: '信息提示',
|
|
135
|
+
content: '这是一个示例弹窗',
|
|
136
|
+
position: new THREE.Vector3(50, 0, 25)
|
|
137
|
+
});
|
|
138
|
+
},
|
|
139
|
+
|
|
140
|
+
// 隐藏弹窗
|
|
141
|
+
hideInfo: function() {
|
|
142
|
+
this.$refs.kimap.hidePopup();
|
|
143
|
+
},
|
|
144
|
+
|
|
145
|
+
// 开始绘制
|
|
146
|
+
startDrawLine: function() {
|
|
147
|
+
var self = this;
|
|
148
|
+
|
|
149
|
+
this.$refs.kimap.startDraw('line', {
|
|
150
|
+
onDrawClick: function(position) {
|
|
151
|
+
console.log('添加点:', position);
|
|
152
|
+
},
|
|
153
|
+
onDrawComplete: function(points) {
|
|
154
|
+
console.log('绘制完成,共 ' + points.length + ' 个点');
|
|
155
|
+
alert('线段绘制完成!共 ' + points.length + ' 个点');
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
},
|
|
159
|
+
|
|
160
|
+
// 停止绘制
|
|
161
|
+
stopDraw: function() {
|
|
162
|
+
this.$refs.kimap.endDraw();
|
|
163
|
+
},
|
|
164
|
+
|
|
165
|
+
// 获取随机颜色
|
|
166
|
+
getRandomColor: function() {
|
|
167
|
+
var colors = ['#4CAF50', '#2196F3', '#FF9800', '#E91E63', '#9C27B0'];
|
|
168
|
+
return colors[Math.floor(Math.random() * colors.length)];
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
|
|
172
|
+
// 组件销毁时清理
|
|
173
|
+
beforeDestroy: function() {
|
|
174
|
+
console.log('组件即将销毁');
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
</script>
|
|
178
|
+
|
|
179
|
+
<style scoped>
|
|
180
|
+
.map-page {
|
|
181
|
+
width: 100%;
|
|
182
|
+
height: 100vh;
|
|
183
|
+
position: relative;
|
|
184
|
+
display: flex;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.control-panel {
|
|
188
|
+
position: absolute;
|
|
189
|
+
top: 20px;
|
|
190
|
+
left: 20px;
|
|
191
|
+
background: white;
|
|
192
|
+
padding: 20px;
|
|
193
|
+
border-radius: 8px;
|
|
194
|
+
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
|
|
195
|
+
z-index: 100;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
.control-panel h3 {
|
|
199
|
+
margin: 0 0 15px 0;
|
|
200
|
+
font-size: 16px;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
.control-panel button {
|
|
204
|
+
display: block;
|
|
205
|
+
width: 120px;
|
|
206
|
+
margin-bottom: 10px;
|
|
207
|
+
padding: 8px 12px;
|
|
208
|
+
background: #2196F3;
|
|
209
|
+
color: white;
|
|
210
|
+
border: none;
|
|
211
|
+
border-radius: 4px;
|
|
212
|
+
cursor: pointer;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
.control-panel button:hover {
|
|
216
|
+
background: #1976D2;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
.info-panel {
|
|
220
|
+
position: absolute;
|
|
221
|
+
bottom: 20px;
|
|
222
|
+
left: 20px;
|
|
223
|
+
background: white;
|
|
224
|
+
padding: 15px;
|
|
225
|
+
border-radius: 8px;
|
|
226
|
+
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
|
|
227
|
+
z-index: 100;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
.info-panel p {
|
|
231
|
+
margin: 0;
|
|
232
|
+
font-size: 14px;
|
|
233
|
+
}
|
|
234
|
+
</style>
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div ref="mapContainer" class="kimap-container"></div>
|
|
3
|
+
</template>
|
|
4
|
+
|
|
5
|
+
<script>
|
|
6
|
+
// Vue2兼容的Kimap SDK组件
|
|
7
|
+
export default {
|
|
8
|
+
name: 'KimapComponent',
|
|
9
|
+
props: {
|
|
10
|
+
// SDK配置
|
|
11
|
+
objUrl: {
|
|
12
|
+
type: String,
|
|
13
|
+
required: true
|
|
14
|
+
},
|
|
15
|
+
origin: {
|
|
16
|
+
type: Object,
|
|
17
|
+
default: function() {
|
|
18
|
+
return { x: 0, y: 0, z: 0 };
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
maxX: {
|
|
22
|
+
type: Number,
|
|
23
|
+
default: 100
|
|
24
|
+
},
|
|
25
|
+
maxY: {
|
|
26
|
+
type: Number,
|
|
27
|
+
default: 50
|
|
28
|
+
},
|
|
29
|
+
showGrid: {
|
|
30
|
+
type: Boolean,
|
|
31
|
+
default: true
|
|
32
|
+
},
|
|
33
|
+
showAxes: {
|
|
34
|
+
type: Boolean,
|
|
35
|
+
default: true
|
|
36
|
+
},
|
|
37
|
+
backgroundColor: {
|
|
38
|
+
type: Number,
|
|
39
|
+
default: 0xf0f0f0
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
data: function() {
|
|
43
|
+
return {
|
|
44
|
+
sdk: null,
|
|
45
|
+
isReady: false
|
|
46
|
+
};
|
|
47
|
+
},
|
|
48
|
+
mounted: function() {
|
|
49
|
+
this.initSDK();
|
|
50
|
+
},
|
|
51
|
+
beforeDestroy: function() {
|
|
52
|
+
this.destroySDK();
|
|
53
|
+
},
|
|
54
|
+
methods: {
|
|
55
|
+
initSDK: function() {
|
|
56
|
+
var self = this;
|
|
57
|
+
|
|
58
|
+
// 动态导入SDK(兼容旧版Webpack)
|
|
59
|
+
import('@kimap/indoor-positioning-sdk')
|
|
60
|
+
.then(function(module) {
|
|
61
|
+
var KimapSDK = module.KimapSDK;
|
|
62
|
+
|
|
63
|
+
self.sdk = new KimapSDK({
|
|
64
|
+
container: self.$refs.mapContainer,
|
|
65
|
+
objUrl: self.objUrl,
|
|
66
|
+
origin: self.origin,
|
|
67
|
+
maxX: self.maxX,
|
|
68
|
+
maxY: self.maxY,
|
|
69
|
+
showGrid: self.showGrid,
|
|
70
|
+
showAxes: self.showAxes,
|
|
71
|
+
backgroundColor: self.backgroundColor,
|
|
72
|
+
onPositionClick: function(position, object) {
|
|
73
|
+
self.$emit('position-click', { position: position, object: object });
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
self.isReady = true;
|
|
78
|
+
self.$emit('ready', self.sdk);
|
|
79
|
+
})
|
|
80
|
+
.catch(function(error) {
|
|
81
|
+
console.error('Failed to load Kimap SDK:', error);
|
|
82
|
+
self.$emit('error', error);
|
|
83
|
+
});
|
|
84
|
+
},
|
|
85
|
+
|
|
86
|
+
destroySDK: function() {
|
|
87
|
+
if (this.sdk) {
|
|
88
|
+
this.sdk.destroy();
|
|
89
|
+
this.sdk = null;
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
|
|
93
|
+
// 对外暴露的方法
|
|
94
|
+
addLocationMarker: function(marker) {
|
|
95
|
+
if (this.sdk) {
|
|
96
|
+
this.sdk.addLocationMarker(marker);
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
|
|
100
|
+
removeLocationMarker: function(id) {
|
|
101
|
+
if (this.sdk) {
|
|
102
|
+
this.sdk.removeLocationMarker(id);
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
|
|
106
|
+
updateCurrentPosition: function(position) {
|
|
107
|
+
if (this.sdk) {
|
|
108
|
+
this.sdk.updateCurrentPosition(position);
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
|
|
112
|
+
showPopup: function(info) {
|
|
113
|
+
if (this.sdk) {
|
|
114
|
+
this.sdk.showPopup(info);
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
|
|
118
|
+
hidePopup: function() {
|
|
119
|
+
if (this.sdk) {
|
|
120
|
+
this.sdk.hidePopup();
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
|
|
124
|
+
startDraw: function(mode, callbacks) {
|
|
125
|
+
if (this.sdk) {
|
|
126
|
+
this.sdk.startDraw(mode, callbacks);
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
|
|
130
|
+
endDraw: function() {
|
|
131
|
+
if (this.sdk) {
|
|
132
|
+
this.sdk.endDraw();
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
|
|
136
|
+
getSDK: function() {
|
|
137
|
+
return this.sdk;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
</script>
|
|
142
|
+
|
|
143
|
+
<style scoped>
|
|
144
|
+
.kimap-container {
|
|
145
|
+
width: 100%;
|
|
146
|
+
height: 100%;
|
|
147
|
+
position: relative;
|
|
148
|
+
}
|
|
149
|
+
</style>
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 zyl19950114
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
# Kimap SDK Vue2 快速参考
|
|
2
|
+
|
|
3
|
+
## 🚀 快速开始
|
|
4
|
+
|
|
5
|
+
### 1. 安装依赖
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install three@0.150.0 @kimap/indoor-positioning-sdk --save
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
### 2. 使用组件
|
|
12
|
+
|
|
13
|
+
```vue
|
|
14
|
+
<template>
|
|
15
|
+
<kimap-component
|
|
16
|
+
ref="kimap"
|
|
17
|
+
:obj-url="'/static/models/building.obj'"
|
|
18
|
+
:max-x="100"
|
|
19
|
+
:max-y="50"
|
|
20
|
+
@ready="onReady"
|
|
21
|
+
/>
|
|
22
|
+
</template>
|
|
23
|
+
|
|
24
|
+
<script>
|
|
25
|
+
import KimapComponent from '@/components/kimap/KimapComponent.vue';
|
|
26
|
+
var THREE = require('three');
|
|
27
|
+
|
|
28
|
+
export default {
|
|
29
|
+
components: { KimapComponent },
|
|
30
|
+
methods: {
|
|
31
|
+
onReady: function(sdk) {
|
|
32
|
+
this.$refs.kimap.addLocationMarker({
|
|
33
|
+
id: 'marker-1',
|
|
34
|
+
position: new THREE.Vector3(10, 0, 15),
|
|
35
|
+
label: '位置1'
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
</script>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## 📋 Props 属性
|
|
44
|
+
|
|
45
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
46
|
+
|------|------|--------|------|
|
|
47
|
+
| objUrl | String | - | 模型文件路径(必填) |
|
|
48
|
+
| origin | Object | {x:0,y:0,z:0} | 原点坐标 |
|
|
49
|
+
| maxX | Number | 100 | X轴最大值 |
|
|
50
|
+
| maxY | Number | 50 | Y轴最大值 |
|
|
51
|
+
| showGrid | Boolean | true | 显示网格 |
|
|
52
|
+
| showAxes | Boolean | true | 显示坐标轴 |
|
|
53
|
+
| backgroundColor | Number | 0xf0f0f0 | 背景颜色 |
|
|
54
|
+
|
|
55
|
+
## 📡 Events 事件
|
|
56
|
+
|
|
57
|
+
```vue
|
|
58
|
+
<kimap-component
|
|
59
|
+
@ready="onReady"
|
|
60
|
+
@error="onError"
|
|
61
|
+
@position-click="onClick"
|
|
62
|
+
/>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
| 事件 | 参数 | 说明 |
|
|
66
|
+
|------|------|------|
|
|
67
|
+
| ready | sdk | 地图就绪 |
|
|
68
|
+
| error | error | 加载失败 |
|
|
69
|
+
| position-click | {position, object} | 点击位置 |
|
|
70
|
+
|
|
71
|
+
## 🎯 常用方法
|
|
72
|
+
|
|
73
|
+
### 添加标记
|
|
74
|
+
|
|
75
|
+
```javascript
|
|
76
|
+
var THREE = require('three');
|
|
77
|
+
|
|
78
|
+
this.$refs.kimap.addLocationMarker({
|
|
79
|
+
id: 'marker-1',
|
|
80
|
+
position: new THREE.Vector3(10, 0, 15),
|
|
81
|
+
label: '会议室',
|
|
82
|
+
color: '#4CAF50'
|
|
83
|
+
});
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 移除标记
|
|
87
|
+
|
|
88
|
+
```javascript
|
|
89
|
+
this.$refs.kimap.removeLocationMarker('marker-1');
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### 更新当前位置
|
|
93
|
+
|
|
94
|
+
```javascript
|
|
95
|
+
var position = new THREE.Vector3(20, 0, 30);
|
|
96
|
+
this.$refs.kimap.updateCurrentPosition(position);
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### 显示弹窗
|
|
100
|
+
|
|
101
|
+
```javascript
|
|
102
|
+
this.$refs.kimap.showPopup({
|
|
103
|
+
title: '标题',
|
|
104
|
+
content: '内容',
|
|
105
|
+
position: new THREE.Vector3(15, 0, 20)
|
|
106
|
+
});
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 隐藏弹窗
|
|
110
|
+
|
|
111
|
+
```javascript
|
|
112
|
+
this.$refs.kimap.hidePopup();
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### 绘制线段
|
|
116
|
+
|
|
117
|
+
```javascript
|
|
118
|
+
this.$refs.kimap.startDraw('line', {
|
|
119
|
+
onDrawClick: function(pos) {
|
|
120
|
+
console.log('点击:', pos);
|
|
121
|
+
},
|
|
122
|
+
onDrawComplete: function(points) {
|
|
123
|
+
console.log('完成,共' + points.length + '个点');
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### 绘制多边形
|
|
129
|
+
|
|
130
|
+
```javascript
|
|
131
|
+
this.$refs.kimap.startDraw('polygon', {
|
|
132
|
+
onDrawComplete: function(points) {
|
|
133
|
+
console.log('多边形完成');
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
// 双击或调用完成
|
|
138
|
+
this.$refs.kimap.completePolygon();
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### 停止绘制
|
|
142
|
+
|
|
143
|
+
```javascript
|
|
144
|
+
this.$refs.kimap.endDraw();
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### 获取原始SDK
|
|
148
|
+
|
|
149
|
+
```javascript
|
|
150
|
+
var sdk = this.$refs.kimap.getSDK();
|
|
151
|
+
// 使用原始SDK的所有方法
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## 🎨 样式定制
|
|
155
|
+
|
|
156
|
+
### 修改容器大小
|
|
157
|
+
|
|
158
|
+
```vue
|
|
159
|
+
<template>
|
|
160
|
+
<div class="map-wrapper">
|
|
161
|
+
<kimap-component ref="kimap" />
|
|
162
|
+
</div>
|
|
163
|
+
</template>
|
|
164
|
+
|
|
165
|
+
<style scoped>
|
|
166
|
+
.map-wrapper {
|
|
167
|
+
width: 100%;
|
|
168
|
+
height: 600px;
|
|
169
|
+
}
|
|
170
|
+
</style>
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### 修改背景颜色
|
|
174
|
+
|
|
175
|
+
```vue
|
|
176
|
+
<kimap-component
|
|
177
|
+
:background-color="0x333333"
|
|
178
|
+
/>
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## 🔧 坐标转换
|
|
182
|
+
|
|
183
|
+
### 使用坐标系统
|
|
184
|
+
|
|
185
|
+
```javascript
|
|
186
|
+
// 在methods中
|
|
187
|
+
initCoordSystem: function() {
|
|
188
|
+
var createCoordSystem = require('@/components/kimap').createCoordSystem;
|
|
189
|
+
|
|
190
|
+
createCoordSystem().then(function(coordSystem) {
|
|
191
|
+
coordSystem.init(
|
|
192
|
+
{
|
|
193
|
+
basePoint: { lat: 39.9042, lng: 116.4074 },
|
|
194
|
+
xAxisPoint: { lat: 39.9043, lng: 116.4075 },
|
|
195
|
+
yAxisPoint: { lat: 39.9044, lng: 116.4074 }
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
origin: { x: 0, y: 0 },
|
|
199
|
+
xAxis: { x: 100, y: 0 },
|
|
200
|
+
yAxis: { x: 0, y: 100 }
|
|
201
|
+
}
|
|
202
|
+
);
|
|
203
|
+
|
|
204
|
+
// GPS转SDK坐标
|
|
205
|
+
var sdkCoord = coordSystem.gpsToSDK({
|
|
206
|
+
lat: 39.9042,
|
|
207
|
+
lng: 116.4075
|
|
208
|
+
}, 0);
|
|
209
|
+
|
|
210
|
+
console.log('SDK坐标:', sdkCoord);
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## 💡 实用技巧
|
|
216
|
+
|
|
217
|
+
### 1. 在created中加载数据
|
|
218
|
+
|
|
219
|
+
```javascript
|
|
220
|
+
export default {
|
|
221
|
+
data: function() {
|
|
222
|
+
return {
|
|
223
|
+
markers: [],
|
|
224
|
+
isMapReady: false
|
|
225
|
+
};
|
|
226
|
+
},
|
|
227
|
+
created: function() {
|
|
228
|
+
// 预加载标记数据
|
|
229
|
+
this.loadMarkers();
|
|
230
|
+
},
|
|
231
|
+
methods: {
|
|
232
|
+
loadMarkers: function() {
|
|
233
|
+
var self = this;
|
|
234
|
+
this.$http.get('/api/markers').then(function(res) {
|
|
235
|
+
self.markers = res.data;
|
|
236
|
+
// 如果地图已就绪,立即添加
|
|
237
|
+
if (self.isMapReady) {
|
|
238
|
+
self.addAllMarkers();
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
},
|
|
242
|
+
|
|
243
|
+
onMapReady: function() {
|
|
244
|
+
this.isMapReady = true;
|
|
245
|
+
// 地图就绪后添加标记
|
|
246
|
+
this.addAllMarkers();
|
|
247
|
+
},
|
|
248
|
+
|
|
249
|
+
addAllMarkers: function() {
|
|
250
|
+
var THREE = require('three');
|
|
251
|
+
var self = this;
|
|
252
|
+
|
|
253
|
+
this.markers.forEach(function(m) {
|
|
254
|
+
self.$refs.kimap.addLocationMarker({
|
|
255
|
+
id: m.id,
|
|
256
|
+
position: new THREE.Vector3(m.x, 0, m.z),
|
|
257
|
+
label: m.label
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### 2. 监听位置变化
|
|
266
|
+
|
|
267
|
+
```javascript
|
|
268
|
+
export default {
|
|
269
|
+
data: function() {
|
|
270
|
+
return {
|
|
271
|
+
currentPos: null
|
|
272
|
+
};
|
|
273
|
+
},
|
|
274
|
+
watch: {
|
|
275
|
+
currentPos: function(newPos) {
|
|
276
|
+
if (newPos && this.$refs.kimap) {
|
|
277
|
+
var THREE = require('three');
|
|
278
|
+
var pos = new THREE.Vector3(newPos.x, 0, newPos.z);
|
|
279
|
+
this.$refs.kimap.updateCurrentPosition(pos);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
};
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### 3. 清理资源
|
|
287
|
+
|
|
288
|
+
```javascript
|
|
289
|
+
export default {
|
|
290
|
+
beforeDestroy: function() {
|
|
291
|
+
// Vue组件会自动清理,无需手动调用destroy
|
|
292
|
+
console.log('地图组件销毁');
|
|
293
|
+
}
|
|
294
|
+
};
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
## ⚠️ 注意事项
|
|
298
|
+
|
|
299
|
+
1. **必须升级Three.js到0.150.0+**
|
|
300
|
+
2. 模型文件放在 `static/` 目录,不要放在 `assets/`
|
|
301
|
+
3. 使用 `$refs` 调用方法时,确保地图已就绪(在 `@ready` 之后)
|
|
302
|
+
4. Three.js的Vector3等类使用 `require('three')` 导入
|
|
303
|
+
5. 组件销毁时会自动清理资源
|
|
304
|
+
|
|
305
|
+
## 🐛 常见错误
|
|
306
|
+
|
|
307
|
+
### 错误1: "Cannot read property 'addLocationMarker' of undefined"
|
|
308
|
+
|
|
309
|
+
**原因:** 地图未就绪时调用方法
|
|
310
|
+
|
|
311
|
+
**解决:**
|
|
312
|
+
```javascript
|
|
313
|
+
// 错误
|
|
314
|
+
mounted: function() {
|
|
315
|
+
this.$refs.kimap.addLocationMarker(...); // 地图可能还未初始化
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// 正确
|
|
319
|
+
methods: {
|
|
320
|
+
onMapReady: function() {
|
|
321
|
+
this.$refs.kimap.addLocationMarker(...); // 在ready事件中调用
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
### 错误2: "Module not found: Can't resolve 'three'"
|
|
327
|
+
|
|
328
|
+
**原因:** 未安装Three.js
|
|
329
|
+
|
|
330
|
+
**解决:**
|
|
331
|
+
```bash
|
|
332
|
+
npm install three@0.150.0 --save
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
### 错误3: 模型不显示
|
|
336
|
+
|
|
337
|
+
**排查:**
|
|
338
|
+
1. 检查 `objUrl` 路径是否正确
|
|
339
|
+
2. 打开Network面板查看模型是否加载
|
|
340
|
+
3. 检查控制台错误
|
|
341
|
+
|
|
342
|
+
## 📚 更多示例
|
|
343
|
+
|
|
344
|
+
查看完整示例:
|
|
345
|
+
- [EXAMPLE.vue](./EXAMPLE.vue) - 包含所有功能的完整示例
|
|
346
|
+
- [INSTALL_GUIDE.md](./INSTALL_GUIDE.md) - 详细集成步骤
|
|
347
|
+
- [README.md](./README.md) - 完整文档
|
|
348
|
+
|
|
349
|
+
---
|
|
350
|
+
|
|
351
|
+
**快速参考卡片 v1.0.0**
|
package/README.md
ADDED
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
# Kimap SDK Vue2 兼容包装器
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@kimap/indoor-positioning-sdk-vue2)
|
|
4
|
+
[](https://github.com/kimap/indoor-positioning-sdk/blob/main/LICENSE)
|
|
5
|
+
|
|
6
|
+
为旧版Vue2项目提供的Kimap SDK兼容层,支持Webpack 3和Babel 6。
|
|
7
|
+
|
|
8
|
+
## ⚠️ 重要:升级Three.js版本
|
|
9
|
+
|
|
10
|
+
SDK要求 `three >= 0.150.0`。如果您的项目使用旧版本(如0.125.2),必须先升级。
|
|
11
|
+
|
|
12
|
+
**升级Three.js:**
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm install three@0.150.0 --save
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## 📦 安装
|
|
19
|
+
|
|
20
|
+
### 方法1:从npm安装(推荐⭐)
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
# 安装Vue2包装器(会自动安装原厂SDK)
|
|
24
|
+
npm install @kimap/indoor-positioning-sdk-vue2 --save
|
|
25
|
+
|
|
26
|
+
# 同时安装Three.js(必需)
|
|
27
|
+
npm install three@0.150.0 --save
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**一行命令安装全部:**
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npm install @kimap/indoor-positioning-sdk-vue2 three@0.150.0 --save
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### 方法2:本地复制文件
|
|
37
|
+
|
|
38
|
+
将此 `sdk-vue2-wrapper` 文件夹复制到您的项目中:
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
your-project/
|
|
42
|
+
├── src/
|
|
43
|
+
│ ├── components/
|
|
44
|
+
│ │ └── kimap/ # 复制到这里
|
|
45
|
+
│ │ ├── KimapComponent.vue
|
|
46
|
+
│ │ ├── index.js
|
|
47
|
+
│ │ └── package.json
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
然后安装依赖:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
npm install @kimap/indoor-positioning-sdk three@0.150.0 --save
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 方法3:直接使用原厂SDK
|
|
57
|
+
|
|
58
|
+
如果您的Webpack配置正确,也可以直接使用原厂SDK:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
npm install @kimap/indoor-positioning-sdk three@0.150.0 --save
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## 🚀 使用方法
|
|
65
|
+
|
|
66
|
+
### 方式1:使用Vue组件(最简单)
|
|
67
|
+
|
|
68
|
+
#### 从npm包导入(方法1安装)
|
|
69
|
+
|
|
70
|
+
```vue
|
|
71
|
+
<template>
|
|
72
|
+
<div class="map-page">
|
|
73
|
+
<kimap-component
|
|
74
|
+
ref="kimap"
|
|
75
|
+
:obj-url="modelUrl"
|
|
76
|
+
:origin="{ x: 0, y: 0, z: 0 }"
|
|
77
|
+
:max-x="100"
|
|
78
|
+
:max-y="50"
|
|
79
|
+
:show-grid="true"
|
|
80
|
+
@ready="onMapReady"
|
|
81
|
+
@position-click="onPositionClick"
|
|
82
|
+
/>
|
|
83
|
+
</div>
|
|
84
|
+
</template>
|
|
85
|
+
|
|
86
|
+
<script>
|
|
87
|
+
// 从npm包导入
|
|
88
|
+
import KimapComponent from '@kimap/indoor-positioning-sdk-vue2/KimapComponent.vue';
|
|
89
|
+
|
|
90
|
+
export default {
|
|
91
|
+
name: 'MapPage',
|
|
92
|
+
components: {
|
|
93
|
+
KimapComponent
|
|
94
|
+
},
|
|
95
|
+
data: function() {
|
|
96
|
+
return {
|
|
97
|
+
modelUrl: '/static/models/building.obj'
|
|
98
|
+
};
|
|
99
|
+
},
|
|
100
|
+
methods: {
|
|
101
|
+
onMapReady: function(sdk) {
|
|
102
|
+
console.log('地图加载完成', sdk);
|
|
103
|
+
this.addMarkers();
|
|
104
|
+
},
|
|
105
|
+
|
|
106
|
+
onPositionClick: function(data) {
|
|
107
|
+
console.log('点击位置:', data.position);
|
|
108
|
+
},
|
|
109
|
+
|
|
110
|
+
addMarkers: function() {
|
|
111
|
+
var THREE = require('three');
|
|
112
|
+
|
|
113
|
+
// 通过ref调用组件方法
|
|
114
|
+
this.$refs.kimap.addLocationMarker({
|
|
115
|
+
id: 'marker-1',
|
|
116
|
+
position: new THREE.Vector3(10, 0, 15),
|
|
117
|
+
label: '会议室A',
|
|
118
|
+
color: '#4CAF50'
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
</script>
|
|
124
|
+
|
|
125
|
+
<style scoped>
|
|
126
|
+
.map-page {
|
|
127
|
+
width: 100%;
|
|
128
|
+
height: 100vh;
|
|
129
|
+
}
|
|
130
|
+
</style>
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
#### 从本地文件导入(方法2安装)
|
|
134
|
+
|
|
135
|
+
如果使用方法2(复制文件),导入路径为:
|
|
136
|
+
|
|
137
|
+
```javascript
|
|
138
|
+
import KimapComponent from '@/components/kimap/KimapComponent.vue';
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### 方式2:使用包装函数
|
|
142
|
+
|
|
143
|
+
#### 从npm包导入
|
|
144
|
+
|
|
145
|
+
```vue
|
|
146
|
+
<template>
|
|
147
|
+
<div ref="mapContainer" class="map-container"></div>
|
|
148
|
+
</template>
|
|
149
|
+
|
|
150
|
+
<script>
|
|
151
|
+
var createKimapSDK = require('@kimap/indoor-positioning-sdk-vue2').createKimapSDK;
|
|
152
|
+
var THREE = require('three');
|
|
153
|
+
|
|
154
|
+
export default {
|
|
155
|
+
name: 'MapPage',
|
|
156
|
+
data: function() {
|
|
157
|
+
return {
|
|
158
|
+
sdk: null
|
|
159
|
+
};
|
|
160
|
+
},
|
|
161
|
+
mounted: function() {
|
|
162
|
+
this.initMap();
|
|
163
|
+
},
|
|
164
|
+
beforeDestroy: function() {
|
|
165
|
+
if (this.sdk) {
|
|
166
|
+
this.sdk.destroy();
|
|
167
|
+
}
|
|
168
|
+
},
|
|
169
|
+
methods: {
|
|
170
|
+
initMap: function() {
|
|
171
|
+
var self = this;
|
|
172
|
+
|
|
173
|
+
createKimapSDK({
|
|
174
|
+
container: this.$refs.mapContainer,
|
|
175
|
+
objUrl: '/static/models/building.obj',
|
|
176
|
+
origin: { x: 0, y: 0, z: 0 },
|
|
177
|
+
maxX: 100,
|
|
178
|
+
maxY: 50,
|
|
179
|
+
onPositionClick: function(position) {
|
|
180
|
+
self.handleClick(position);
|
|
181
|
+
}
|
|
182
|
+
}).then(function(sdk) {
|
|
183
|
+
self.sdk = sdk;
|
|
184
|
+
self.addMarkers();
|
|
185
|
+
}).catch(function(error) {
|
|
186
|
+
console.error('初始化失败:', error);
|
|
187
|
+
});
|
|
188
|
+
},
|
|
189
|
+
|
|
190
|
+
addMarkers: function() {
|
|
191
|
+
this.sdk.addLocationMarker({
|
|
192
|
+
id: 'marker-1',
|
|
193
|
+
position: new THREE.Vector3(10, 0, 15),
|
|
194
|
+
label: '会议室'
|
|
195
|
+
});
|
|
196
|
+
},
|
|
197
|
+
|
|
198
|
+
handleClick: function(position) {
|
|
199
|
+
console.log('点击位置:', position);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
</script>
|
|
204
|
+
|
|
205
|
+
<style scoped>
|
|
206
|
+
.map-container {
|
|
207
|
+
width: 100%;
|
|
208
|
+
height: 100vh;
|
|
209
|
+
}
|
|
210
|
+
</style>
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### 方式3:直接使用SDK(需要Webpack支持动态导入)
|
|
214
|
+
|
|
215
|
+
```vue
|
|
216
|
+
<template>
|
|
217
|
+
<div ref="mapContainer" class="map-container"></div>
|
|
218
|
+
</template>
|
|
219
|
+
|
|
220
|
+
<script>
|
|
221
|
+
export default {
|
|
222
|
+
name: 'MapPage',
|
|
223
|
+
data: function() {
|
|
224
|
+
return {
|
|
225
|
+
sdk: null
|
|
226
|
+
};
|
|
227
|
+
},
|
|
228
|
+
mounted: function() {
|
|
229
|
+
this.initMap();
|
|
230
|
+
},
|
|
231
|
+
beforeDestroy: function() {
|
|
232
|
+
if (this.sdk) {
|
|
233
|
+
this.sdk.destroy();
|
|
234
|
+
}
|
|
235
|
+
},
|
|
236
|
+
methods: {
|
|
237
|
+
initMap: function() {
|
|
238
|
+
var self = this;
|
|
239
|
+
|
|
240
|
+
// 动态导入(Webpack 3支持,但需要babel-plugin-syntax-dynamic-import)
|
|
241
|
+
Promise.all([
|
|
242
|
+
import('@kimap/indoor-positioning-sdk'),
|
|
243
|
+
import('three')
|
|
244
|
+
]).then(function(modules) {
|
|
245
|
+
var KimapSDK = modules[0].KimapSDK;
|
|
246
|
+
var THREE = modules[1];
|
|
247
|
+
|
|
248
|
+
self.sdk = new KimapSDK({
|
|
249
|
+
container: self.$refs.mapContainer,
|
|
250
|
+
objUrl: '/static/models/building.obj',
|
|
251
|
+
origin: { x: 0, y: 0, z: 0 },
|
|
252
|
+
maxX: 100,
|
|
253
|
+
maxY: 50
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
self.sdk.addLocationMarker({
|
|
257
|
+
id: 'marker-1',
|
|
258
|
+
position: new THREE.Vector3(10, 0, 15),
|
|
259
|
+
label: '会议室'
|
|
260
|
+
});
|
|
261
|
+
}).catch(function(error) {
|
|
262
|
+
console.error('加载失败:', error);
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
};
|
|
267
|
+
</script>
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
## 🔧 Webpack配置(如果需要)
|
|
271
|
+
|
|
272
|
+
如果动态导入不工作,需要在 `build/webpack.base.conf.js` 中添加:
|
|
273
|
+
|
|
274
|
+
```js
|
|
275
|
+
module.exports = {
|
|
276
|
+
// ...其他配置
|
|
277
|
+
resolve: {
|
|
278
|
+
extensions: ['.js', '.vue', '.json'],
|
|
279
|
+
alias: {
|
|
280
|
+
'vue$': 'vue/dist/vue.esm.js',
|
|
281
|
+
'@': resolve('src')
|
|
282
|
+
}
|
|
283
|
+
},
|
|
284
|
+
module: {
|
|
285
|
+
rules: [
|
|
286
|
+
// 确保处理node_modules中的ES6模块
|
|
287
|
+
{
|
|
288
|
+
test: /\.js$/,
|
|
289
|
+
loader: 'babel-loader',
|
|
290
|
+
include: [
|
|
291
|
+
resolve('src'),
|
|
292
|
+
resolve('test'),
|
|
293
|
+
resolve('node_modules/@kimap') // 添加这行
|
|
294
|
+
]
|
|
295
|
+
}
|
|
296
|
+
]
|
|
297
|
+
}
|
|
298
|
+
};
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
## 📋 完整示例项目结构
|
|
302
|
+
|
|
303
|
+
```
|
|
304
|
+
your-project/
|
|
305
|
+
├── src/
|
|
306
|
+
│ ├── components/
|
|
307
|
+
│ │ └── kimap/
|
|
308
|
+
│ │ ├── KimapComponent.vue
|
|
309
|
+
│ │ ├── index.js
|
|
310
|
+
│ │ └── package.json
|
|
311
|
+
│ ├── views/
|
|
312
|
+
│ │ └── MapView.vue
|
|
313
|
+
│ └── main.js
|
|
314
|
+
├── static/
|
|
315
|
+
│ └── models/
|
|
316
|
+
│ └── building.obj
|
|
317
|
+
└── package.json
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
## ⚡ API方法
|
|
321
|
+
|
|
322
|
+
所有方法与SDK保持一致,通过 `$refs` 调用:
|
|
323
|
+
|
|
324
|
+
```js
|
|
325
|
+
// 添加标记
|
|
326
|
+
this.$refs.kimap.addLocationMarker(marker);
|
|
327
|
+
|
|
328
|
+
// 移除标记
|
|
329
|
+
this.$refs.kimap.removeLocationMarker('marker-id');
|
|
330
|
+
|
|
331
|
+
// 更新当前位置
|
|
332
|
+
this.$refs.kimap.updateCurrentPosition(position);
|
|
333
|
+
|
|
334
|
+
// 显示弹窗
|
|
335
|
+
this.$refs.kimap.showPopup(info);
|
|
336
|
+
|
|
337
|
+
// 隐藏弹窗
|
|
338
|
+
this.$refs.kimap.hidePopup();
|
|
339
|
+
|
|
340
|
+
// 开始绘制
|
|
341
|
+
this.$refs.kimap.startDraw('line', {
|
|
342
|
+
onDrawComplete: function(points) {
|
|
343
|
+
console.log('绘制完成', points);
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
|
|
347
|
+
// 获取原始SDK实例
|
|
348
|
+
var sdk = this.$refs.kimap.getSDK();
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
## 🎯 Props属性
|
|
352
|
+
|
|
353
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
354
|
+
|------|------|--------|------|
|
|
355
|
+
| objUrl | String | - | OBJ模型文件路径(必填) |
|
|
356
|
+
| origin | Object | `{x:0, y:0, z:0}` | 原点坐标 |
|
|
357
|
+
| maxX | Number | 100 | X轴最大值 |
|
|
358
|
+
| maxY | Number | 50 | Y轴最大值 |
|
|
359
|
+
| showGrid | Boolean | true | 显示网格 |
|
|
360
|
+
| showAxes | Boolean | true | 显示坐标轴 |
|
|
361
|
+
| backgroundColor | Number | 0xf0f0f0 | 背景颜色 |
|
|
362
|
+
|
|
363
|
+
## 📡 Events事件
|
|
364
|
+
|
|
365
|
+
| 事件名 | 参数 | 说明 |
|
|
366
|
+
|--------|------|------|
|
|
367
|
+
| ready | sdk | SDK初始化完成 |
|
|
368
|
+
| error | error | 初始化失败 |
|
|
369
|
+
| position-click | {position, object} | 点击位置 |
|
|
370
|
+
|
|
371
|
+
## ⚠️ 常见问题
|
|
372
|
+
|
|
373
|
+
### Q1: 提示找不到模块?
|
|
374
|
+
|
|
375
|
+
**解决方案:** 确保已安装依赖
|
|
376
|
+
|
|
377
|
+
```bash
|
|
378
|
+
npm install @kimap/indoor-positioning-sdk three@0.150.0 --save
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
### Q2: Webpack编译错误?
|
|
382
|
+
|
|
383
|
+
**解决方案:** 在 `webpack.base.conf.js` 中添加对 `@kimap` 的babel处理:
|
|
384
|
+
|
|
385
|
+
```js
|
|
386
|
+
{
|
|
387
|
+
test: /\.js$/,
|
|
388
|
+
loader: 'babel-loader',
|
|
389
|
+
include: [
|
|
390
|
+
resolve('src'),
|
|
391
|
+
resolve('node_modules/@kimap')
|
|
392
|
+
]
|
|
393
|
+
}
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
### Q3: Three.js版本冲突?
|
|
397
|
+
|
|
398
|
+
**解决方案:** 必须升级到0.150.0或更高版本
|
|
399
|
+
|
|
400
|
+
```bash
|
|
401
|
+
npm uninstall three
|
|
402
|
+
npm install three@0.150.0 --save
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
### Q4: 动态导入不支持?
|
|
406
|
+
|
|
407
|
+
**解决方案:** 使用提供的Vue组件,它已经处理了兼容性问题。
|
|
408
|
+
|
|
409
|
+
### Q5: 在IE浏览器报错?
|
|
410
|
+
|
|
411
|
+
由于SDK使用了现代JavaScript特性,不支持IE浏览器。您的项目配置中已排除IE:
|
|
412
|
+
|
|
413
|
+
```json
|
|
414
|
+
"browserslist": [
|
|
415
|
+
"> 1%",
|
|
416
|
+
"last 2 versions",
|
|
417
|
+
"not ie <= 8"
|
|
418
|
+
]
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
建议更新为:
|
|
422
|
+
|
|
423
|
+
```json
|
|
424
|
+
"browserslist": [
|
|
425
|
+
"> 1%",
|
|
426
|
+
"last 2 versions",
|
|
427
|
+
"not ie <= 11"
|
|
428
|
+
]
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
## 📚 更多文档
|
|
432
|
+
|
|
433
|
+
- [SDK API文档](../docs-site/API_REFERENCE.md)
|
|
434
|
+
- [完整示例](../USAGE_EXAMPLE.md)
|
|
435
|
+
- [发布指南](../sdk/PUBLISH_GUIDE.md)
|
|
436
|
+
|
|
437
|
+
## 💡 提示
|
|
438
|
+
|
|
439
|
+
1. **推荐使用方式1(Vue组件)**,最简单且兼容性最好
|
|
440
|
+
2. **必须升级Three.js到0.150.0+**
|
|
441
|
+
3. 如果遇到编译问题,检查Webpack配置
|
|
442
|
+
4. 建议将模型文件放在 `static/` 目录下,避免Webpack处理
|
|
443
|
+
|
|
444
|
+
## 🆘 技术支持
|
|
445
|
+
|
|
446
|
+
如有问题,请查看:
|
|
447
|
+
- [API文档](../docs-site/API_REFERENCE.md)
|
|
448
|
+
- [GitHub Issues](https://github.com/kimap/sdk/issues)
|
package/index.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vue2兼容的Kimap SDK包装器
|
|
3
|
+
* 使用CommonJS格式,兼容旧版Webpack
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
// 导出Vue组件
|
|
7
|
+
var KimapComponent = require('./KimapComponent.vue').default || require('./KimapComponent.vue');
|
|
8
|
+
|
|
9
|
+
// 创建简化的包装函数
|
|
10
|
+
function createKimapSDK(config) {
|
|
11
|
+
// 返回Promise以支持动态导入
|
|
12
|
+
return import('@kimap/indoor-positioning-sdk').then(function(module) {
|
|
13
|
+
var KimapSDK = module.KimapSDK;
|
|
14
|
+
return new KimapSDK(config);
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// 导出坐标系统类的包装
|
|
19
|
+
function createCoordSystem() {
|
|
20
|
+
return import('@kimap/indoor-positioning-sdk').then(function(module) {
|
|
21
|
+
var BuildingCoordSystem = module.BuildingCoordSystem;
|
|
22
|
+
return new BuildingCoordSystem();
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
module.exports = {
|
|
27
|
+
KimapComponent: KimapComponent,
|
|
28
|
+
createKimapSDK: createKimapSDK,
|
|
29
|
+
createCoordSystem: createCoordSystem
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
// 兼容ES6导出
|
|
33
|
+
module.exports.default = module.exports;
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kimap/indoor-positioning-sdk-vue2",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Vue2兼容的Kimap室内定位SDK包装器 - Vue2 Compatible Wrapper for Kimap Indoor Positioning SDK",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"files": [
|
|
7
|
+
"index.js",
|
|
8
|
+
"KimapComponent.vue",
|
|
9
|
+
"README.md",
|
|
10
|
+
"QUICK_REFERENCE.md",
|
|
11
|
+
"EXAMPLE.vue"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"prepublishOnly": "echo 'Ready to publish'"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"kimap",
|
|
18
|
+
"indoor-positioning",
|
|
19
|
+
"3d-map",
|
|
20
|
+
"vue2",
|
|
21
|
+
"threejs",
|
|
22
|
+
"wrapper",
|
|
23
|
+
"compatibility",
|
|
24
|
+
"vue",
|
|
25
|
+
"building-map",
|
|
26
|
+
"location",
|
|
27
|
+
"gps"
|
|
28
|
+
],
|
|
29
|
+
"author": "zyl19950114",
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": "https://github.com/kimap/indoor-positioning-sdk"
|
|
34
|
+
},
|
|
35
|
+
"bugs": {
|
|
36
|
+
"url": "https://github.com/kimap/indoor-positioning-sdk/issues"
|
|
37
|
+
},
|
|
38
|
+
"homepage": "https://github.com/kimap/indoor-positioning-sdk#readme",
|
|
39
|
+
"peerDependencies": {
|
|
40
|
+
"vue": "^2.6.0",
|
|
41
|
+
"three": ">=0.150.0"
|
|
42
|
+
},
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"@kimap/indoor-positioning-sdk": "^1.0.0"
|
|
45
|
+
},
|
|
46
|
+
"engines": {
|
|
47
|
+
"node": ">=6.0.0",
|
|
48
|
+
"npm": ">=3.0.0"
|
|
49
|
+
}
|
|
50
|
+
}
|