uni-app在ios手机内嵌h5中使用uni.chooseLocation,打开地图展示位置错误,真实坐标上海却显示在北京

发布于 1周前 作者 songsunli 来自 Uni-App

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的官方支持或地图服务提供商寻求帮助。

回到顶部