diff --git a/src/platforms/h5/helpers/location.js b/src/platforms/h5/helpers/location.js index f00476e9368485db04908553d1a7960d674bb9e2..e7fecbb1256df82a885b5b3d527e2a181659fd3e 100644 --- a/src/platforms/h5/helpers/location.js +++ b/src/platforms/h5/helpers/location.js @@ -1,3 +1,6 @@ +import { getJSONP } from './get-jsonp' +import { loadMaps } from '../view/components/map/maps' + export const ICON_PATH_ORIGIN = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIQAAACECAMAAABmmnOVAAAC01BMVEUAAAAAef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef8Aef96quGStdqStdpbnujMzMzCyM7Gyc7Ky83MzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMwAef8GfP0yjfNWnOp0qOKKsdyYt9mju9aZt9mMstx1qeJYnekyjvIIfP0qivVmouaWttnMzMyat9lppOUujPQKffxhoOfNzc3Y2Njh4eHp6enu7u7y8vL19fXv7+/i4uLZ2dnOzs6auNgOf/sKff15quHR0dHx8fH9/f3////j4+N6quFdn+iywdPb29vw8PD+/v7c3NyywtLa2tr29vbS0tLd3d38/Pzf39/o6Ojc7f+q0v+HwP9rsf9dqv9Hnv9Vpv/q6urj8P+Vx/9Am/8Pgf8Iff/z8/OAvP95uf/n5+c5l//V6f+52v+y1//7+/vt7e0rkP/09PTQ0NDq9P8Whf+cy//W1tbe3t7A3v/m5ubs7OxOov/r6+vk5OQiaPjKAAAAknRSTlMACBZ9oB71/jiqywJBZATT6hBukRXv+zDCAVrkDIf4JbQsTb7eVeJLbwfa8Rh4G/OlPS/6/kxQ9/xdmZudoJxNVhng7B6wtWdzAtQOipcF1329wS44doK/BAkyP1pvgZOsrbnGXArAg34G2IsD1eMRe7bi7k5YnqFT9V0csyPedQyYD3p/Fje+hDpskq/MwpRBC6yKp2MAAAQdSURBVHja7Zn1exMxGIAPHbrhDsPdneHuNtzd3d3dIbjLh93o2o4i7TpgG1Jk0g0mMNwd/gTa5rq129reHnK5e/bk/TFNk/dJ7r5894XjGAwGg8GgTZasCpDIll1+hxw5vXLJLpEboTx5ZXbIhyzkl9fB28cqUaCgrBKFkI3CcjoUKYolihWXUSI7EihRUjaHXF52CVRKLoe8eZIdUOkyMknkRw6UlcehYAFHiXK+skgURk6Ul8OhQjFnCVRRBolKqRxQ5SzUHaqgNGSj7VCmalqJnDkoS5RF6ZCbroNvufQkUD6qEuXTdUA+3hQdqiEXVKfnUKOmK4latalJ1EEuoZZ6162HJ9x/4OChw0eOHj12/MTJU6dxG7XUu751tjNnz4ET5y9ctLZTSr0beKFLl89bpuUDrqgC1RqNWqsKuqqzNFw7e51S6u3tc+OmZUJ9kCHY6ECwOkRvab51iUrqXej2HYDQsHBjWgx3Ae7dppB6N2wEcF9jdMGDUIDGTaR2aNoM9FqjG7QmaN5CWgc/gIePjG559BigpZQOrYB/4jBfRGRUtDkmJjY6KjLCofkpD62lc2gDfMpWPIuLdwyV8XEpHgaddBZ+wBuSFcwJqSN2ovmZ/dfnOvCTxqGtwzq8SEjv4EhISn48eWgnhUP7DvDSvgzxrs6vV6+FLiro2EkCic4QKkzwJsH1KYreCp0eQhfyDl1B/w4P/xa5JVJ4U03QjbRD9x7wXlgH5IE3wmMBHXoSlugFAcI6f/AkkSi8q6HQm6xDn77wEQ8djTwSj3tqAMguRTe4ikeOQyJ4YV+KfkQl+oNW5GbY4gWOWgbwJ+kwAD6Fi90MK2ZsrIeBBCUGwRXbqJ+/iJMQliIEBhOU6AJhtlG/IpHE2bqrYQg5h6HA4yQiRqwEfkGCdTCMmMRw+IbPDCQaHCsCYAQxiZHw3TbmD/ESOHgHwShiEqPhp/gggYkSztIxxCRawy/bmEniJaJtfwiEscQkxkFgRqJESqQwwHhiEuMBp3Vm8RK/cZoHEzKXhCK2QxEPpiJe0YlKCFaKCNv/cYBNUsBRPlkJSc0U+dM7E9H0ThGJbgZT/iR7yj+VqMS06Qr4+OFm2JdCxIa8lugzkJs5K6MfxAaYPUcBpYG5khZJEkUUSb7DPCnKRfPBXj6M8FwuegoLpCgXcQszVjhbJFUJUee2hBhLoYTIcYtB57KY+opSMdVqwatSlZVj05aV//CwJLMX2DluaUcwhXm4ali2XOoLjxUrPV26zFtF4f5p0Gp310+z13BUWNvbehEXona6iAtX/zVZmtfN4WixfsNky4S6gCCVVq3RPLdfSfpv3MRRZfPoLc6Xs/5bt3EyMGzE9h07/Xft2t15z6i9+zgGg8FgMBgMBoPBYDAYDAYj8/APG67Rie8pUDsAAAAASUVORK5CYII=' 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')) + } + } + ) + }) + }) + } +} diff --git a/src/platforms/h5/service/api/location/get-location.js b/src/platforms/h5/service/api/location/get-location.js index 64f40c434eccaf3a8a8e7e0cb6ba3bfbb97f4936..20eaa2db37a2989d4ede34c0f730a59c1ccce88a 100644 --- a/src/platforms/h5/service/api/location/get-location.js +++ b/src/platforms/h5/service/api/location/get-location.js @@ -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 - }) }) } diff --git a/src/platforms/h5/service/api/location/location-change.js b/src/platforms/h5/service/api/location/location-change.js index 75a6d5d7cae7094f9484a6f173cfe0d60d7abaa1..8f412434085b552c1def8c97e1bc88060f064cfa 100644 --- a/src/platforms/h5/service/api/location/location-change.js +++ b/src/platforms/h5/service/api/location/location-change.js @@ -1,3 +1,5 @@ +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' }) }) }