peixue-dev/peidu/Archive/一次性文件/[一次性]临时方案-使用微信位置选择-2026-01-26.md

235 lines
6.0 KiB
Markdown
Raw Normal View History

# 临时方案:使用微信小程序位置选择
## 背景
由于腾讯地图API Key未开启WebService权限暂时无法使用逆地理编码自动获取地址。
## 临时解决方案
使用微信小程序的 `wx.chooseLocation` API让用户手动选择位置。
## 优缺点对比
### 当前方案(逆地理编码)
- ✅ 自动获取,无需用户操作
- ✅ 精确到街道门牌号
- ❌ 需要配置API Key
- ❌ 有调用次数限制
### 临时方案(手动选择)
- ✅ 无需配置API Key
- ✅ 用户可以精确选择位置
- ✅ 微信小程序原生支持
- ❌ 需要用户手动操作
- ❌ 体验稍差
## 实施方案
### 方案A完全替换为手动选择
修改 `getLocation()` 方法:
```javascript
getLocation() {
// 使用微信小程序的位置选择
uni.chooseLocation({
success: (res) => {
console.log('选择的位置:', res)
this.latitude = res.latitude
this.longitude = res.longitude
this.address = res.address + (res.name ? ' ' + res.name : '')
uni.showToast({
title: '位置已选择',
icon: 'success'
})
},
fail: (err) => {
console.error('选择位置失败:', err)
uni.showToast({
title: '请选择位置',
icon: 'none'
})
}
})
}
```
### 方案B混合方案推荐
先自动获取GPS坐标如果逆地理编码失败提示用户手动选择
```javascript
async getLocation() {
uni.showLoading({ title: '获取位置中...', mask: false })
try {
// 1. 先获取GPS坐标
const locationRes = await new Promise((resolve, reject) => {
uni.getLocation({
type: 'gcj02',
success: resolve,
fail: reject
})
})
this.latitude = locationRes.latitude
this.longitude = locationRes.longitude
// 2. 尝试逆地理编码
try {
await this.getAddress(locationRes.latitude, locationRes.longitude)
uni.hideLoading()
uni.showToast({ title: '位置已获取', icon: 'success', duration: 1000 })
} catch (e) {
// 3. 逆地理编码失败,提示用户手动选择
uni.hideLoading()
const confirmRes = await new Promise((resolve) => {
uni.showModal({
title: '提示',
content: '自动获取地址失败,是否手动选择位置?',
success: (res) => resolve(res.confirm)
})
})
if (confirmRes) {
// 用户同意手动选择
const chooseRes = await new Promise((resolve, reject) => {
uni.chooseLocation({
latitude: this.latitude,
longitude: this.longitude,
success: resolve,
fail: reject
})
})
this.latitude = chooseRes.latitude
this.longitude = chooseRes.longitude
this.address = chooseRes.address + (chooseRes.name ? ' ' + chooseRes.name : '')
uni.showToast({ title: '位置已选择', icon: 'success' })
} else {
// 用户拒绝,使用坐标显示
this.address = `位置: ${this.latitude.toFixed(6)}, ${this.longitude.toFixed(6)}`
}
}
} catch (err) {
uni.hideLoading()
console.error('获取位置失败', err)
this.address = '位置获取失败,请检查权限'
uni.showToast({ title: '获取位置失败', icon: 'none' })
}
}
```
### 方案C添加"手动选择位置"按钮
在页面上添加一个按钮,让用户可以主动选择位置:
```vue
<template>
<view class="location-section">
<view class="section-header">
<text class="section-title">📍 当前位置</text>
<view class="location-actions">
<view class="refresh-location" @click="getLocation">
<text>刷新</text>
</view>
<view class="choose-location" @click="chooseLocation">
<text>手动选择</text>
</view>
</view>
</view>
<view class="location-info">
<text class="location-text">{{ address || '获取位置中...' }}</text>
</view>
</view>
</template>
<script>
methods: {
// 手动选择位置
chooseLocation() {
uni.chooseLocation({
latitude: this.latitude || 31.230416,
longitude: this.longitude || 121.473701,
success: (res) => {
this.latitude = res.latitude
this.longitude = res.longitude
this.address = res.address + (res.name ? ' ' + res.name : '')
uni.showToast({
title: '位置已选择',
icon: 'success'
})
},
fail: (err) => {
console.error('选择位置失败:', err)
uni.showToast({
title: '选择位置失败',
icon: 'none'
})
}
})
}
}
</script>
<style>
.location-actions {
display: flex;
gap: 10rpx;
}
.choose-location {
font-size: 24rpx;
color: #4a9b9f;
padding: 8rpx 16rpx;
background: rgba(74, 155, 159, 0.1);
border-radius: 20rpx;
}
</style>
```
## 推荐实施顺序
1. **立即实施:** 方案C - 添加"手动选择位置"按钮
- 不影响现有功能
- 给用户提供备选方案
- 开发成本低
2. **短期:** 配置腾讯地图API Key
- 按照《腾讯地图API配置指南》操作
- 开启WebService权限
- 恢复自动获取地址功能
3. **长期:** 方案B - 混合方案
- 自动获取 + 手动选择
- 最佳用户体验
- 容错性强
## 注意事项
1. **权限配置**
- 需要在 `manifest.json` 中配置位置权限
- 需要在微信小程序后台配置"位置接口"权限
2. **用户体验**
- 手动选择位置需要用户操作,可能影响体验
- 建议在UI上明确提示用户
3. **数据准确性**
- 手动选择的位置可能不是用户当前位置
- 建议在签到时记录选择方式(自动/手动)
## 相关文档
- 微信小程序位置APIhttps://developers.weixin.qq.com/miniprogram/dev/api/location/wx.chooseLocation.html
- uni-app位置APIhttps://uniapp.dcloud.net.cn/api/location/location.html
---
**创建时间:** 2026-01-26
**适用场景:** 腾讯地图API暂时无法使用时的临时方案