export const openLocation = (paras: any) => {
// openLocation打开的腾讯地图为火星坐标,需转换
const type = paras.type || 'wgs84'
const gcj02 = togcj02(type, paras)
uni.openLocation({
latitude: gcj02.latitude, // 纬度,浮点数,范围为90 ~ -90
longitude: gcj02.longitude, // 经度,浮点数,范围为180 ~ -180。
name: paras.name, // 位置名
address: paras.address || '', // 地址详情说明
scale: 15, // 地图缩放级别,整形值,范围从1~28。默认为最大,
fail: (err) => {
log('openLocation fail: ', err)
}
})
}
const detectKeys = (pt: any) => {
const keys = [
{ lon: 'longitude', lat: 'latitude' },
{ lon: 'lon', lat: 'lat' },
{ lon: 'lng', lat: 'lat' }
]
for (let i = 0; i < keys.length; i++) {
if (pt[keys[i].lon] !== undefined && pt[keys[i].lat] !== undefined) {
return keys[i]
}
}
throw new Error('找不到坐标相关键值')
}
export const togcj02 = (type: string, pt: any) => {
const keys = detectKeys(pt)
if (hasNoValues(pt, keys)) return pt
let gcj02 = null
switch (type) {
case 'wgs84':
gcj02 = coordtransform.wgs84togcj02(pt[keys.lon], pt[keys.lat])
break
case 'bd09':
gcj02 = coordtransform.bd09togcj02(pt[keys.lon], pt[keys.lat])
break
case 'gcj02':
gcj02 = [pt[keys.lon], pt[keys.lat]]
break
default:
throw new Error('togcj02 not implement, type:' + type)
}
const final: any = {}
final[keys.lon] = gcj02[0]
final[keys.lat] = gcj02[1]
return final
}/**
- WGS84转GCj02
- @param lng
- @param lat
- @returns {[]}
/
const wgs84togcj02 = (lng, lat) => {
lat = +lat;
lng = +lng;
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]
}
};/** - 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换
- 即 百度 转 谷歌、高德
- @param bd_lon
- @param bd_lat
- @returns {[]}
/
const bd09togcj02 = (bd_lon, bd_lat) => {
bd_lon = +bd_lon;
bd_lat = +bd_lat;
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]
};