uniapp开发App如何使用正确高德地图。uni.chooseLocation数据不展示问题,uni.getLocation不生效问题。

记录uniapp开发App如何使用高德地图。

1.使用高德地图

高德开放平台 注册账号,创建应用。
在这里插入图片描述
在这里插入图片描述
注意到这里添加key有几个必须要填写的值

2.获取安全码SHA1和PackageName

Dclound登录创作者平台。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
这样就拿到了安全码SHA1
注意注意最坑的来了 就是这个PackageName这个搞错了,后续的地图和uni.chooseLocation都会有问题。
最简单的获取方式就是发行打包时复制appid。因为这个名字问题找了太久了,记录记录!!!
在这里插入图片描述

<think>我们正在讨论UniApp微信小程序中的`uni.chooseLocation`接口,并希望禁用地图的拖动功能。然而,根据微信小程序的官方文档和UniApp的封装,`uni.chooseLocation`是一个内置的地图选点组件,它直接调用了微信小程序的`wx.chooseLocation`API。这个API目前并支持禁用地图拖动的配置选项。引用[4]中提到了一种在canvas上阻止页面滚动的方法,通过使用`catchtouchstart`、`catchtouchend`、`catchtouchmove`等事件来阻止事件冒泡。但是,这种方法只适用于自定义组件(如canvas),而适用于`uni.chooseLocation`这样的系统级组件。因此,直接通过配置`uni.chooseLocation`的参数来禁用地图拖动是可能的。我们需要考虑其他方法来实现类似的功能。替代方案:1.使用地图组件(如`<map>`)自定义一个位置选择器,然后通过设置地图组件的属性来控制是否允许拖动。微信小程序的地图组件有一个`enable-scroll`属性,设置为`false`可以禁止拖动。这样我们就可以完全控制地图的交互行为。2.在自定义的地图组件上,我们可以添加标记点(markers)以及交互逻辑,当用户点击某个位置时,获取该位置的经纬度,然后返回给页面。步骤:a.在页面中放置一个地图组件,并设置`enable-scroll`为`false`禁止拖动。b.通过`uni.getLocation`获取用户当前位置,并作为地图的初始中心点。c.监听地图的点击事件(`@tap`),在事件处理函数中获取点击位置的经纬度。d.将获取到的经纬度转换为地址(可以使用`uni.chooseLocation`返回的地址信息,或者使用逆地址解析API,如腾讯地图或高德地图的API)。e.将地址信息返回,完成位置选择。注意:由于微信小程序要求使用其指定的地图key,并且需要配置安全域名等,使用逆地址解析API需要相应的配置。示例代码:在模板中:```html<mapid="myMap"style="width:100%;height:300px;":latitude="latitude" :longitude="longitude":enable-scroll="false" @tap="onMapTap"></map>```在脚本中:```javascriptexportdefault {data() {return{latitude:0,longitude:0}},onLoad() {//获取当前位置uni.getLocation({type:'gcj02',success:(res) =>{this.latitude =res.latitude;this.longitude =res.longitude;}});},methods:{onMapTap(e) {//获取点击位置的经纬度const {latitude,longitude }= e.detail;//这里可以调用逆地址解析API获取地址信息//假设我们有一个函数reverseGeocoderthis.reverseGeocoder(latitude, longitude).then(address =>{//返回位置信息,可以按照uni.chooseLocation的返回格式const res= {name: address.name ||'未知位置',address: address.address ||'',latitude,longitude};//然后可以将res返回给上一个页面,或者进行其他处理//例如,通过事件总线或vuex传递,或者使用uni.navigateBack传递数据uni.$emit('chooseLocation', res);uni.navigateBack();});},reverseGeocoder(latitude,longitude){//这里需要调用逆地址解析服务,例如使用腾讯地图的API//注意:需要在小程序后台配置合法域名,并申请密钥return newPromise((resolve,reject)=> {//示例:使用qqmapsdk(需要先引入SDK)//如果没有SDK,可以使用uni.request请求//这里以uni.request为例uni.request({url:'https://apis.map.qq.com/ws/geocoder/v1/',data: {location: `${latitude},${longitude}`,key:'您的腾讯地图key',get_poi:0},success: (res)=> {if(res.data.status ===0) {resolve(res.data.result);}else {reject(new Error('逆地址解析失败'));}},fail: (err)=> {reject(err);}});});}}} ```这个方案需要用户自己实现逆地址解析,并且需要申请地图服务的key,配置域名等,相对复杂,但可以满足禁用地图拖动的需求。另外,如果只是希望固定位置选择,允许用户选择其他位置,那么也可以考虑显示地图,而是直接使用当前位置,或者提供一个固定的位置列表供用户选择。总结:由于原生的`uni.chooseLocation`支持禁用拖动,我们可以通过自定义地图组件来实现类似功能,但需要额外的工作量。相关问题:1.如何在UniApp使用微信小程序的地图组件?2.如何实现逆地址解析(经纬度转地址)?3.UniApp中如何跨页面传递数据?4.如何申请腾讯地图或高德地图的key?5.微信小程序中如何使用第三方地图服务?</think>在 UniApp 微信小程序中,`uni.chooseLocation` 是封装了微信原生 `wx.chooseLocation` 的 API,但**官方未提供禁用地图拖动的配置选项**。以下是解决方案和替代思路: --- ### 直接方案分析 1. **官方限制** `uni.chooseLocation` 的参数中无控制地图拖动的属性(参考微信小程序文档)。其参数仅支持: ```js uni.chooseLocation({ latitude: 39.908823, // 初始纬度 longitude: 116.397470, // 初始经度 success: (res) => { console.log(res.name); } }) ``` 无法通过参数禁用拖动。 2. **底层原因** 该 API 是微信内置的全屏地图组件,开发者无法干预其内部交互行为(如拖动、缩放)[^1]。 --- ### 替代方案:自定义地图组件 若需完全控制地图行为,推荐使用 **`<map>` 组件 + 自定义交互** 实现位置选择器: #### 步骤 1. **禁用地图拖动** 在页面中嵌入 `<map>` 组件,通过 `enable-scroll` 属性禁用拖动: ```html <map :latitude="latitude" :longitude="longitude" :enable-scroll="false" <!-- 关键属性:禁止拖动 --> @tap="handleMapTap" ></map> ``` 2. **获取点击位置** 监听地图点击事件 `@tap`,获取用户点击的经纬度: ```javascript export default { data() { return { latitude: 39.908823, longitude: 116.397470 } }, methods: { handleMapTap(e) { const { latitude, longitude } = e.detail // 调用逆地理编码 API 将坐标转为地址 this.reverseGeocoder(latitude, longitude) }, async reverseGeocoder(lat, lng) { // 使用微信小程序逆地理编码 API const res = await uni.request({ url: 'https://api.map.qq.com/ws/geocoder/v1/', data: { location: `${lat},${lng}`, key: '您的腾讯地图KEY' } }) console.log('地址信息:', res.result.address) } } } ``` 3. **交互优化** - 添加标记点:`<map>` 内使用 `<marker>` 标记位置。 - 震动反馈:参考引用[^2],操作时触发轻震动: ```js uni.vibrateShort({ type: 'soft' }) // 点击地图时触发 ``` --- ### 注意事项 1. **权限申请** - 使用 `<map>` 需在 `manifest.json` 配置腾讯或高德地图的 SDK Key。 - 需申请 `scope.userLocation` 定位权限。 2. **性能考虑** 逆地理编码 API 有调用频率限制,建议添加防抖逻辑。 3. **兼容性** `enable-scroll` 属性在微信小程序基础库 1.0.0+ 支持,兼容性良好。 --- ### 总结建议 - **简单场景**:若仅需固定位置(如公司地址),直接显示地址文本,跳过地图交互。 - **复杂场景**:通过 `<map>` 组件自定义实现,禁用拖动并监听点击事件,结合逆地理编码获取地址信息。 > 引用说明: > [^1]: `uni.chooseLocation` 是微信原生 `wx.chooseLocation` 的封装,无拖动控制参数。 > [^2]: 通过 `uni.vibrateShort()` 可增强操作反馈,提升用户体验。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

优雅格子衫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值