提交 bba3c53a 编写于 作者: C codexu

feat: 更新定位增加坐标转换

上级 bac58ddf
import { getJSONP } from './get-jsonp'
import { loadMaps } from '../view/components/map/maps'
export const ICON_PATH_ORIGIN =
'data:image/png;base64,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'
export const ICON_PATH_TARGET =
......@@ -38,3 +41,74 @@ export function getMapInfo () {
}
export const IS_AMAP = getMapInfo().type === MapType.AMAP
export function translateGeo (type, coords, skip) {
const mapInfo = getMapInfo()
const wgs84Map = [MapType.GOOGLE]
if (
type.toUpperCase() === 'WGS84' ||
wgs84Map.includes(mapInfo.type) ||
skip
) {
return Promise.resolve(coords)
}
if (mapInfo.type === MapType.QQ) {
return new Promise((resolve, reject) => {
getJSONP(
`https://apis.map.qq.com/jsapi?qt=translate&type=1&points=${coords.longitude},${coords.latitude}&key=${mapInfo.key}&output=jsonp&pf=jsapi&ref=jsapi`,
{
callback: 'cb'
},
res => {
if (
'detail' in res &&
'points' in res.detail &&
res.detail.points.length
) {
const location = res.detail.points[0]
resolve({
longitude: location.lng,
latitude: location.lat,
altitude: coords.altitude,
accuracy: coords.accuracy,
altitudeAccuracy: coords.altitudeAccuracy,
heading: coords.heading,
speed: coords.speed
})
} else {
reject(new Error('translate geo fail'))
}
},
() => reject(new Error('translate geo fail'))
)
})
}
if (mapInfo.type === MapType.AMAP) {
return new Promise((resolve, reject) => {
loadMaps([], () => {
window.AMap.convertFrom(
[coords.longitude, coords.latitude],
'gps',
(_, res) => {
if (res.info === 'ok' && res.locations.length) {
const { lat, lng } = res.locations[0]
resolve({
longitude: lng,
latitude: lat,
altitude: coords.altitude,
accuracy: coords.accuracy,
altitudeAccuracy: coords.altitudeAccuracy,
heading: coords.heading,
speed: coords.speed
})
} else {
reject(new Error('translate geo fail'))
}
}
)
})
})
}
}
......@@ -3,9 +3,9 @@ import {
} from '../../../helpers/get-jsonp'
import {
MapType,
getMapInfo
getMapInfo,
translateGeo
} from '../../../helpers/location'
import { loadMaps } from '../../../view/components/map/maps'
/**
* 获取定位信息
......@@ -73,62 +73,22 @@ export function getLocation ({
}
})
}).then((coords, skip) => {
const wgs84Map = [MapType.GOOGLE]
if (type.toUpperCase() === 'WGS84' || wgs84Map.includes(mapInfo.type) || skip) {
return coords
}
if (mapInfo.type === MapType.QQ) {
return new Promise((resolve) => {
getJSONP(`https://apis.map.qq.com/jsapi?qt=translate&type=1&points=${coords.longitude},${coords.latitude}&key=${mapInfo.key}&output=jsonp&pf=jsapi&ref=jsapi`, {
callback: 'cb'
}, (res) => {
if ('detail' in res && 'points' in res.detail && res.detail.points.length) {
const location = res.detail.points[0]
resolve(Object.assign({}, coords, {
longitude: location.lng,
latitude: location.lat
}))
} else {
resolve(coords)
}
}, () => resolve(coords))
translateGeo(type, coords, skip)
.then(coords => {
invoke(
callbackId,
Object.assign(coords, {
errMsg: 'getLocation:ok',
verticalAccuracy: coords.altitudeAccuracy || 0,
// 无专门水平精度,使用位置精度替代
horizontalAccuracy: coords.accuracy
})
)
})
}
if (mapInfo.type === MapType.AMAP) {
return new Promise((resolve) => {
loadMaps([], () => {
window.AMap.convertFrom(
[coords.longitude, coords.latitude],
'gps',
(_, res) => {
if (res.info === 'ok' && res.locations.length) {
const { lat, lng } = res.locations[0]
resolve(
Object.assign({}, coords, {
longitude: lng,
latitude: lat
})
)
} else {
resolve(coords)
}
}
)
.catch(error => {
invoke(callbackId, {
errMsg: 'getLocation:fail ' + error.message
})
})
}
}).then(coords => {
invoke(callbackId, Object.assign(coords, {
errMsg: 'getLocation:ok',
verticalAccuracy: coords.altitudeAccuracy || 0,
// 无专门水平精度,使用位置精度替代
horizontalAccuracy: coords.accuracy
}))
}).catch(error => {
invoke(callbackId, {
errMsg: 'getLocation:fail ' + error.message
})
})
}
import { translateGeo } from '../../../helpers/location'
const { invokeCallbackHandler: invoke } = UniServiceJSBridge
const callbackIds = []
const callbackOnErrorIds = []
......@@ -7,18 +9,27 @@ let watchId
/**
* 开始更新定位
*/
export function startLocationUpdate () {
export function startLocationUpdate ({ type = 'wgs84' }) {
if (navigator.geolocation) {
watchId = navigator.geolocation.watchPosition(
res => {
callbackIds.forEach(callbackId => {
invoke(callbackId, res.coords)
})
translateGeo(type, res.coords)
.then((coords) => {
callbackIds.forEach(callbackId => {
invoke(callbackId, coords)
})
}).catch(error => {
callbackOnErrorIds.forEach(callbackId => {
invoke(callbackId, {
errMsg: 'onLocationChange:fail' + error.message
})
})
})
},
error => {
callbackOnErrorIds.forEach(callbackId => {
invoke(callbackId, {
errMsg: 'getLocation:fail' + error.message
errMsg: 'onLocationChange:fail' + error.message
})
})
}
......@@ -26,7 +37,7 @@ export function startLocationUpdate () {
} else {
callbackOnErrorIds.forEach(callbackId => {
invoke(callbackId, {
errMsg: 'getLocation:fail device nonsupport geolocation'
errMsg: 'onLocationChange:fail device nonsupport geolocation'
})
})
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册