uni-app在ios手机内嵌h5中使用uni.chooseLocation,打开地图展示位置错误,真实坐标上海却显示在北京
uni-app在ios手机内嵌h5中使用uni.chooseLocation,打开地图展示位置错误,真实坐标上海却显示在北京
ios手机,内嵌在原生app里的h5,使用了uni.chooseLocation,打开地图后,展示的位置一直在北京,真实坐标是在上海
1 回复
针对你提到的uni-app在iOS手机内嵌H5中使用uni.chooseLocation
时,展示位置错误的问题,这通常与地图服务定位、坐标转换或API调用方式有关。由于uni.chooseLocation
是uni-app的原生接口,在内嵌H5中使用可能会遇到兼容性问题。以下是一些可能的解决方案和代码示例,供你参考和调试。
1. 确保定位权限和地图服务正常
首先,确保你的应用已经获得了定位权限,并且地图服务(如高德地图、百度地图等)的SDK已经正确集成并配置。
2. 使用原生地图组件而非H5内嵌
在uni-app中,尽量避免在H5环境中直接使用原生API,因为可能存在兼容性问题。可以考虑使用uni-app提供的原生地图组件来展示位置。
<template>
<view>
<map :longitude="longitude" :latitude="latitude" scale="18" markers="[{id: 1, latitude: latitude, longitude: longitude}]"></map>
<button @click="chooseLocation">选择位置</button>
</view>
</template>
<script>
export default {
data() {
return {
longitude: 0,
latitude: 0
};
},
methods: {
chooseLocation() {
uni.chooseLocation({
success: (res) => {
this.latitude = res.latitude;
this.longitude = res.longitude;
},
fail: (err) => {
console.error(err);
}
});
}
}
};
</script>
3. 坐标转换
如果uni.chooseLocation
返回的坐标是WGS-84(GPS坐标),而你的地图服务使用的是GCJ-02(国测局坐标),需要进行坐标转换。以下是一个简单的坐标转换示例(使用JavaScript实现):
function transformLat(x, y) {
let ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x));
ret += (20.0 * Math.sin(6.0 * x * Math.PI) + 20.0 * Math.sin(2.0 * x * Math.PI)) * 2.0 / 3.0;
ret += (20.0 * Math.sin(y * Math.PI) + 40.0 * Math.sin(y / 3.0 * Math.PI)) * 2.0 / 3.0;
ret += (160.0 * Math.sin(y / 12.0 * Math.PI) + 320 * Math.sin(y * Math.PI / 30.0)) * 2.0 / 3.0;
return ret;
}
function transformLon(x, y) {
let ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x));
ret += (20.0 * Math.sin(6.0 * x * Math.PI) + 20.0 * Math.sin(2.0 * x * Math.PI)) * 2.0 / 3.0;
ret += (20.0 * Math.sin(x * Math.PI) + 40.0 * Math.sin(x / 3.0 * Math.PI)) * 2.0 / 3.0;
ret += (150.0 * Math.sin(x / 12.0 * Math.PI) + 300.0 * Math.sin(x / 30.0 * Math.PI)) * 2.0 / 3.0;
return ret;
}
// 使用示例
let gpsLat = 31.2304; // GPS纬度
let gpsLon = 121.4737; // GPS经度
let gcjLat = transformLat(gpsLat - 35.0, gpsLon - 105.0);
let gcjLon = transformLon(gpsLat - 35.0, gpsLon - 105.0);
请注意,上述坐标转换代码仅为示例,实际使用时可能需要更精确的转换算法。如果问题仍然存在,建议联系uni-app的官方支持或地图服务提供商寻求帮助。