uni多端(H5和微信小程序)获取经纬度以及位置信息(当前城市)

本文介绍如何使用腾讯地图API在微信小程序及H5环境中获取用户的地理位置信息,并通过经纬度反查城市名称。涵盖uni-app跨平台应用开发技巧,包括解决跨域问题、条件编译等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.首先使用uni.getlocation获取到当前的经纬度信息

uni.getlocation开发者文档

封装uni.getlocation

// 获取当前经纬度位置promise封装
const getMyLocation = function() {
	let promise = new Promise((resolve, reject) => {
		uni.getLocation({ //获取当前的位置坐标
			type: 'wgs84',
			success: function(res) {
				// console.log(res)
				resolve({
					longitude: res.longitude,
					latitude: res.latitude
				})
				// console.log('当前位置的经度:' + res.longitude);
				// console.log('当前位置的纬度:' + res.latitude);
			},
			fail: (err) => {}
		});
	})
	return promise
}

2.微信小程序端

腾讯地图微信小程序JavaScript SDK开发者文档

  1. 注册腾讯地图开发者并填写开发者相关信息 https://lbs.qq.com/
  2. 申请开发者密钥(key),绑定小程序appid
  3. 开通webserviceAPI服务
  4. 下载微信小程序JavaScriptSDK,1.1或者1.2都可以,解压然后随便创建一个文件夹丢进入,我是直接在根目录创建了一个lib文件夹
  5. 小程序安全域名设置(须在微信小程序开发设置中进行配置)
    在这里插入图片描述
  6. 配置完成之后首先要将我们刚才下载下来的JavaScriptSDK引入到我们封装方法的地方,然后再使用在第一步中获取到的经纬度信息,使用腾讯官方提供的逆地址解析服务进行经纬度逆解析
    因为我是有一个专门封装方法的文件,所以直接引入就OK了
    在这里插入图片描述
  7. 然后就是将这个方法直接封装起来了
// 根据经纬度获取当前城市信息腾讯地图
const TencentGetLocalCity = function(latitude, longitude) {
	console.log(latitude, longitude)
	return new Promise((resolve, reject) => {
		var that = this;
		var map = new TencentMap({
			key: '' // 此处填写申请下来的开发者密钥key
		})
		// 通过这个方法来实现经纬度反推省市区
		map.reverseGeocoder({
			location: {
				latitude: latitude,
				longitude: longitude
			},
			success: function (res) {
				// console.log('腾讯获取城市名', res)
				resolve(res.result)
			}
		})
	})
}

3.H5端

H5端腾讯地图开发者文档
注意H5端编译时若使用的谷歌最新款浏览器可能会出现获取不到经纬度的情况,建议在调试H5端的时候使用其他浏览器

  1. 因为H5端编译至浏览器后会存在跨域问题,所以我们需要先解决跨域问题,现在根目录中找到manifest.json文件,然后选择最后一项源码视图,找到最后H5配置,将腾讯接口进行跨域代理(使用HBuilder X内部浏览器不会出现跨域问题)
    在这里插入图片描述
"h5" : {
        "router" : {
            "mode" : "hash"
        },
        "devServer" : {
            "https" : false,
            "port" : 8080,
            "disableHostCheck" : true,
            "proxy" : { // 可代理多个
                "/TencentGet" : {
                    "target" : "https://apis.map.qq.com/ws/geocoder/v1/", // 腾讯地图逆地址解析
                    "changeOrigin" : true,
                    "secure" : false,
                    "pathRewrite" : {
                        "^/TencentGet" : ""
                    }
                }
            }
        }
    }

2.使用uni.request请求数据并封装方法

// 根据经纬度获取当前城市信息腾讯地图
const TencentGetLocalCity = function(latitude, longitude) {
	console.log(latitude, longitude)
	// 存在跨域需要在manifest中代理一下
	let baseUrl = `/TencentGet/?location=${latitude},${longitude}&key=此处填写开发者密钥key`
	// console.log(url)
	return new Promise((resolve, reject) => {
		uni.request({
			url: baseUrl,
			method: 'GET'
		}).then(res => {
			// console.log(res[1].statusCode)
			// console.log(res[1].data.result)
			resolve(res[1].data.result)
		}).catch(err => {
			
		})
	})
}

4.条件编译整合

import TencentMap from "../lib/qqmap-wx-jssdk.min.js"
// 根据经纬度获取当前城市信息腾讯地图,小程序和H5各一套
const TencentGetLocalCity = function(latitude, longitude) {
	console.log(latitude, longitude)
	// 只编辑H5
	// #ifdef H5
	// 存在跨域需要在manifest中代理一下
	let baseUrl = `/TencentGet/?location=${latitude},${longitude}&key=此处填写开发者密钥key`
	// console.log(url)
	return new Promise((resolve, reject) => {
		uni.request({
			url: baseUrl,
			method: 'GET'
		}).then(res => {
			// console.log(res[1].statusCode)
			// console.log(res[1].data.result)
			resolve(res[1].data.result)
		}).catch(err => {
			
		})
	})
	// #endif
	// 除H5之外
	// #ifndef H5
	return new Promise((resolve, reject) => {
		var that = this;
		var map = new TencentMap({
			key: '' // 此处填写申请下来的开发者密钥key
		})
		// 通过这个方法来实现经纬度反推省市区
		map.reverseGeocoder({
			location: {
				latitude: latitude,
				longitude: longitude
			},
			success: function (res) {
				// console.log('腾讯获取城市名', res)
				resolve(res.result)
			}
		})
	})
	// #endif
}
<think>好的,我现在需要帮助用户在UniApp开发的微信小程序中实现调用高德地图APP的功能,特别是导航打开外部应用。首先,我需要回顾用户提供的引用内容,看看有哪些现有的信息可以利用。 根据引用[1],用户提到了在微信小程序中使用高德地图需要生成key,且导入amap-wx.js SDK。这可能涉及到在小程序配置中正确设置key使用SDK的方法。引用[2]中用户遇到了坐标类型的问题,使用wgs84成功获取经纬度,而逆地理编码时需要JS服务的key。这说明坐标系的转换key的类型选择很重要。 接下来,我需要考虑UniApp调用高德地图APP的具体步骤。通常,微信小程序本身无法直接打开外部APP,但可以通过scheme URL来实现。高德地图应该有相关的scheme协议用于启动导航。同时,UniApp作为跨平台框架,可能需要处理不同平台的兼容性问题,比如H5微信小程序的差异。 用户的需求是导航打开外部应用。因此,我需要分两部分来处理:一是在小程序内使用高德地图SDK实现导航功能,二是如何调起高德地图APP进行更复杂的导航操作。对于第一部分,可能需要使用高德的JS API或者微信小程序的API;对于第二部分,使用scheme URL,但需要注意微信小程序对打开外部应用的限制,可能需要用户手动确认。 另外,坐标系的转换是关键。微信小程序获取的坐标可能是wgs84或gcj02,而高德地图使用的是gcj02,所以需要确保传递的坐标类型正确。引用[2]中提到使用wgs84获取经纬度成功,但逆地理编码需要JS key,这可能意味着在调用高德API时需要转换坐标或使用正确的key类型。 可能的步骤包括:申请高德地图的key(包括JS APIWeb服务的key),配置UniApp项目,处理坐标转换,调用高德地图的导航接口,以及使用scheme调起APP。同时,需要处理用户拒绝授权的情况,提供备用方案如H5页面导航或复制坐标到剪贴板。 需要验证的问题:UniApp中如何集成高德地图的SDK?微信小程序是否允许直接打开外部APP的scheme?如何处理不同平台的兼容性?如何正确传递坐标参数? 总结下来,解决方案可能包括以下几个步骤:配置高德key,获取用户位置转换坐标,在小程序内使用高德SDK进行导航,以及尝试调起高德APP的scheme。同时提供备用方案,处理可能的授权兼容性问题。</think>在UniApp开发的微信小程序中调用高德地图APP实现导航功能,可通过以下分步方案实现: ### 一、基础配置 1. **申请高德地图Key** - 登录高德开放平台控制台,创建新应用绑定微信小程序AppID[^1] - 获取「Web服务」「JS API」两种类型的Key(注意区分使用场景) - 在manifest.json中配置安全域名:`https://restapi.amap.com` 2. **集成SDK** ```javascript // 引入高德地图SDK var amapFile = require('@/common/amap-wx.js'); var myAmap = new amapFile.AMapWX({ key: '您申请的Web服务Key' }); ``` ### 二、核心功能实现 #### () 小程序内地图导航 ```javascript // 获取当前位置 uni.getLocation({ type: 'gcj02', // 必须使用高德坐标系[^2] success: (res) => { const { latitude, longitude } = res; // 调用路径规划 myAmap.getDrivingRoute({ origin: `${longitude},${latitude}`, destination: '目标经度,目标纬度', success: (data) => { // 处理导航结果 } }); } }); ``` #### () 调起高德地图APP ```javascript // Scheme URL示例 const amapScheme = `androidamap://route?sourceApplication=yourAppName&sid=&slat=${latitude}&slon=${longitude}&did=&dlat=目标纬度&dlon=目标经度&dev=0&t=0` uni.navigateToMiniProgram({ appId: '高德地图小程序AppID', path: `pages/route/index?src=${longitude},${latitude}&dest=目标经度,目标纬度`, fail: () => { // 降级处理:打开网页版 uni.setClipboardData({ data: amapScheme }); uni.showToast({ title: '已复制坐标,请手动打开高德地图' }); } }); ``` ### 三、关键问题处理 1. **坐标系转换** - 使用`coordtransform`库进行WGS84到GCJ02的转换 ```javascript import { wgs84togcj02 } from '@/common/coordtransform.js' const [lng, lat] = wgs84togcj02(longitude, latitude) ``` 2. **多平台适配** ```javascript // #ifdef H5 window.location.href = amapScheme // #endif // #ifdef MP-WEIXIN this.openMiniProgram() // #endif ``` ### 四、备选方案 1. 使用`<web-view>`组件加载高德H5导航页 2. 通过云函数中转处理地理编码 3. 集成高德地图小程序插件(需通过微信审核)
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值