1、先在项目的manifest.json文件配置定位和地图,这里我使用的是腾讯地图
2、看uniapp官网的uni.getLocation的使用说明
链接:https://uniapp.dcloud.net.cn/api/location/location.html
3、使用
(1)封装了一下uni.getLocation,放在工具函数文件中
// 获取定位信息
export function getLocation() {
return new Promise((resolve, reject) => {
uni.getLocation({
type: 'gcj02',
// type: 'wgs84',
geocode: true,
accuracy: 'best',
isHighAccuracy: true,
success: (res) => {
resolve(res)
},
fail: (err) => {
reject(err)
},
complete: (res) => {}
})
})
}
注意:默认为 wgs84 返回 gps 坐标,gcj02 返回国测局坐标,可用于 uni.openLocation
和 map 组件坐标,App 和 H5 需配置定位 SDK 信息才可支持 gcj02。
(2)引入使用:
<script>
import { getLocation } from '@/static/utils/getLocation.js'
export default {
data() {
return {
uniLatitude: "",
uniLongitude: "",
translateLocation: "",
}
},
onLoad() { },
methods: {
async getLocation() {
let that = this
let position = await getLocation()
console.log(position)
that.uniLatitude = position.latitude
that.uniLongitude = position.longitude
}
}
}
</script>
获取到gcj02的坐标:
注意:使用PC端获取的坐标会有偏差,需使用手机进行获取
验证一下:https://map.jiqrxx.com/jingweidu/
(3)坐标系的转换:这里把gcj02坐标转为百度坐标
各坐标转换的工具函数(放在工具函数文件):
//定义一些常量
var x_PI = 3.14159265358979324 * 3000.0 / 180.0;
var PI = 3.1415926535897932384626;
var a = 6378245.0;
var ee = 0.00669342162296594323;
/**
* 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换
* 即 百度 转 谷歌、高德
*/
export function bd09togcj02(bd_lon, bd_lat) {
var x_pi = 3.14159265358979324 * 3000.0 / 180.0;
var x = bd_lon - 0.0065;
var y = bd_lat - 0.006;
var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
var gg_lng = z * Math.cos(theta);
var gg_lat = z * Math.sin(theta);
return [gg_lng, gg_lat]
}
/**
* 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换
* 即谷歌、高德 转 百度
*/
export function gcj02tobd09(lng, lat) {
var z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_PI);
var theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_PI);
var bd_lng = z * Math.cos(theta) + 0.0065;
var bd_lat = z * Math.sin(theta) + 0.006;
return [bd_lng, bd_lat]
}
/**
* WGS84转GCj02
*/
export function wgs84togcj02(lng, lat) {
if (out_of_china(lng, lat)) {
return [lng, lat]
} else {
var dlat = transformlat(lng - 105.0, lat - 35.0);
var dlng = transformlng(lng - 105.0, lat - 35.0);
var radlat = lat / 180.0 * PI;
var magic = Math.sin(radlat);
magic = 1 - ee * magic * magic;
var sqrtmagic = Math.sqrt(magic);
dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
var mglat = lat + dlat;
var mglng = lng + dlng;
return [mglng, mglat]
}
}
/**
* GCJ02 转换为 WGS84
*/
export function gcj02towgs84(lng, lat) {
if (out_of_china(lng, lat)) {
return [lng, lat]
} else {
var dlat = transformlat(lng - 105.0, lat - 35.0);
var dlng = transformlng(lng - 105.0, lat - 35.0);
var radlat = lat / 180.0 * PI;
var magic = Math.sin(radlat);
magic = 1 - ee * magic * magic;
var sqrtmagic = Math.sqrt(magic);
dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
mglat = lat + dlat;
mglng = lng + dlng;
return [lng * 2 - mglng, lat * 2 - mglat]
}
}
function transformlat(lng, lat) {
var ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;
ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;
return ret
}
function transformlng(lng, lat) {
var ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;
ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;
return ret
}
/**
* 判断是否在国内,不在国内则不做偏移
*/
function out_of_china(lng, lat) {
return (lng < 72.004 || lng > 137.8347) || ((lat < 0.8293 || lat > 55.8271) || false);
}
<script>
import { getLocation } from '@/static/utils/getLocation.js'
import { gcj02tobd09 } from '@/static/utils/cooTrans.js'
export default {
data() {
return {
uniLatitude: "",
uniLongitude: "",
translateLocation: "",
translateAddress: "",
bdLog: "",
bdLat: ""
}
},
onLoad() {},
methods: {
async getLocation() {
let that = this
let position = await getLocation()
console.log(position)
that.uniLatitude = position.latitude
that.uniLongitude = position.longitude
let res = gcj02tobd09(position.longitude, position.latitude)
console.log('res', res)
that.bdLog = res[0]
that.bdLat = res[1]
}
}
}
</script>
验证一下:https://lbsyun.baidu.com/jsdemo/demo/yLngLatLocation.htm