|
|
@@ -54,6 +54,42 @@ const selectedOptionText = computed(() => {
|
|
54
|
54
|
return selected ? selected.name : ''
|
|
55
|
55
|
})
|
|
56
|
56
|
|
|
|
57
|
+// 计算两点之间的距离(使用Haversine公式)
|
|
|
58
|
+const calculateDistance = (lat1: any, lon1: any, lat2: any, lon2: any) => {
|
|
|
59
|
+ const R = 6371 // 地球半径(公里)
|
|
|
60
|
+ const dLat = ((lat2 - lat1) * Math.PI) / 180
|
|
|
61
|
+ const dLon = ((lon2 - lon1) * Math.PI) / 180
|
|
|
62
|
+ const a =
|
|
|
63
|
+ Math.sin(dLat / 2) * Math.sin(dLat / 2) +
|
|
|
64
|
+ Math.cos((lat1 * Math.PI) / 180) * Math.cos((lat2 * Math.PI) / 180) * Math.sin(dLon / 2) * Math.sin(dLon / 2)
|
|
|
65
|
+ const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))
|
|
|
66
|
+ return R * c
|
|
|
67
|
+}
|
|
|
68
|
+
|
|
|
69
|
+// 根据当前位置匹配最近的服务区
|
|
|
70
|
+const findNearestParking = (currentPos: any, parkList: any) => {
|
|
|
71
|
+ if (!currentPos || !parkList || parkList.length === 0) {
|
|
|
72
|
+ return null
|
|
|
73
|
+ }
|
|
|
74
|
+
|
|
|
75
|
+ let nearestPark = null
|
|
|
76
|
+ let minDistance = Infinity
|
|
|
77
|
+
|
|
|
78
|
+ for (const park of parkList) {
|
|
|
79
|
+ const distance = calculateDistance(currentPos.latitude, currentPos.longitude, Number(park.latitude), Number(park.longitude))
|
|
|
80
|
+
|
|
|
81
|
+ if (distance < minDistance) {
|
|
|
82
|
+ minDistance = distance
|
|
|
83
|
+ nearestPark = {
|
|
|
84
|
+ ...park,
|
|
|
85
|
+ distance: distance.toFixed(2) // 保留两位小数
|
|
|
86
|
+ }
|
|
|
87
|
+ }
|
|
|
88
|
+ }
|
|
|
89
|
+
|
|
|
90
|
+ return nearestPark
|
|
|
91
|
+}
|
|
|
92
|
+
|
|
57
|
93
|
// 获取全部园区楼宇
|
|
58
|
94
|
const getParkWeb = async () => {
|
|
59
|
95
|
const res = await getParkWebAPI()
|
|
|
@@ -62,15 +98,37 @@ const getParkWeb = async () => {
|
|
62
|
98
|
|
|
63
|
99
|
// 当数据加载完成且没有选中值时,默认选择第一项
|
|
64
|
100
|
if (parkList.value.length > 0 && !selectedValue.value) {
|
|
65
|
|
- const firstItem = parkList.value[0]
|
|
66
|
|
- selectedValue.value = firstItem.id
|
|
67
|
|
-
|
|
68
|
|
- // 存储到本地缓存
|
|
69
|
|
- uni.setStorageSync('parkId', firstItem.id)
|
|
|
101
|
+ uni.getLocation({
|
|
|
102
|
+ type: 'wgs84',
|
|
|
103
|
+ success: (res: any) => {
|
|
|
104
|
+ const position = {
|
|
|
105
|
+ longitude: res.longitude,
|
|
|
106
|
+ latitude: res.latitude
|
|
|
107
|
+ }
|
|
|
108
|
+ const nearestPark = findNearestParking(position, parkList.value)
|
|
|
109
|
+ if (nearestPark) {
|
|
|
110
|
+ selectedValue.value = nearestPark.id
|
|
|
111
|
+ } else {
|
|
|
112
|
+ const firstItem = parkList.value[0]
|
|
|
113
|
+ selectedValue.value = firstItem.id
|
|
|
114
|
+ }
|
|
|
115
|
+ // 存储到本地缓存
|
|
|
116
|
+ uni.setStorageSync('parkId', selectedValue.value)
|
|
70
|
117
|
|
|
71
|
|
- // 触发事件通知父组件
|
|
72
|
|
- emit('update:modelValue', firstItem.id)
|
|
73
|
|
- emit('change', firstItem)
|
|
|
118
|
+ // 触发事件通知父组件
|
|
|
119
|
+ emit('update:modelValue', selectedValue.value)
|
|
|
120
|
+ emit('change', nearestPark || parkList.value[0])
|
|
|
121
|
+ },
|
|
|
122
|
+ fail: () => {
|
|
|
123
|
+ const firstItem = parkList.value[0]
|
|
|
124
|
+ selectedValue.value = firstItem.id
|
|
|
125
|
+ // 存储到本地缓存
|
|
|
126
|
+ uni.setStorageSync('parkId', selectedValue.value)
|
|
|
127
|
+ // 触发事件通知父组件
|
|
|
128
|
+ emit('update:modelValue', selectedValue.value)
|
|
|
129
|
+ emit('change', firstItem)
|
|
|
130
|
+ }
|
|
|
131
|
+ })
|
|
74
|
132
|
}
|
|
75
|
133
|
}
|
|
76
|
134
|
}
|