@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 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
+ [![npm version](https://img.shields.io/npm/v/@kimap/indoor-positioning-sdk-vue2.svg)](https://www.npmjs.com/package/@kimap/indoor-positioning-sdk-vue2)
4
+ [![license](https://img.shields.io/npm/l/@kimap/indoor-positioning-sdk-vue2.svg)](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
+ }