ccren 2024-10-12 11:51 采纳率: 33.3%
浏览 18
已结题

请教两个关于高德地图定位不准的技术问题

img


1、问题一:多个用户在同一个位置,拿着不同的手机会存在经纬度不一致,同一个位置经纬度也会有浮动,当用户位置正好在地图电子围栏的边缘位置不动时,因经纬度存在浮动,就会导致一会定位在地图电子围栏内,一会定位在电子围栏之外。
2、问题二:两个手机放在同一个位置,测试会出现两个手机在定位上导致两个手机的距离存在几十米的距离,甚至上百米的距离,实际两个手机距离就是在同一个位置。

  • 写回答

13条回答 默认 最新

  • 叫兽-郭老师 Java领域新星创作者 2024-10-12 12:12
    关注

    🕒下午好,题主!目前:🟢[在线]
    📢参考通义千问、由郭老师整理提供!
    📣今日诗号:落花人独立,微雨燕双飞。

    高德地图定位不准导致的区域判定问题

    您遇到的问题是由于定位精度不足,导致在区域边缘反复进出。以下针对您提出的两个问题,提供解决方案和代码示例:

    问题一:圆形区域判定

    解决方案:

    1. 增加缓冲区: 将圆形区域的半径扩大一个缓冲值,当定位点进入缓冲区时,即判定为接近圆形区域。
    2. 位置滤波: 使用移动平均或卡尔曼滤波等算法,对连续的定位结果进行平滑处理,减少定位抖动带来的影响。
    3. 降低判定频率: 不要过于频繁地进行区域判定,例如每隔几秒钟进行一次判定,可以有效减少误判。

    代码示例 (uni-app):

    // 圆形区域信息
    const circleCenter = { latitude: 39.9087, longitude: 116.3974 }; // 圆心坐标
    const circleRadius = 100; // 圆形半径,单位:米
    const bufferDistance = 10; // 缓冲区距离,单位:米
    
    uni.getLocation({
      type: 'gcj02',
      isHighAccuracy: true,
      highAccuracyExpireTime: 3900,
      success: function (res) {
        if (res.errMsg == "getLocation:ok") {
          const currentLocation = { latitude: res.latitude, longitude: res.longitude };
          const distanceToCenter = calculateDistance(currentLocation, circleCenter);
    
          if (distanceToCenter <= circleRadius + bufferDistance) {
            // 进入缓冲区,视为接近圆形区域
            console.log('接近圆形区域');
            if (distanceToCenter <= circleRadius) {
              // 进入圆形区域
              console.log('进入圆形区域');
            }
          } else {
            // 未进入缓冲区
            console.log('未进入圆形区域');
          }
        }
      }
    });
    
    // 计算两点距离 (参考:https://www.movable-type.co.uk/scripts/latlong.html)
    function calculateDistance(point1, point2) {
      const R = 6371e3; // 地球半径,单位:米
      const φ1 = toRadians(point1.latitude);
      const φ2 = toRadians(point2.latitude);
      const Δφ = toRadians(point2.latitude - point1.latitude);
      const Δλ = toRadians(point2.longitude - point1.longitude);
    
      const a = Math.sin(Δφ/2) * Math.sin(Δφ/2) +
              Math.cos(φ1) * Math.cos(φ2) *
              Math.sin(Δλ/2) * Math.sin(Δλ/2);
      const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    
      return R * c;
    }
    
    function toRadians(degrees) {
      return degrees * Math.PI / 180;
    }
    

    问题二:电子围栏判定

    解决方案:

    1. 使用高德地图SDK: 使用高德地图SDK提供的地理围栏功能,可以更准确地进行区域判定。
    2. 结合其他传感器数据: 可以结合设备的加速度传感器、陀螺仪等数据,辅助判断设备是否真实进入电子围栏。
    3. 服务器端判定: 将定位数据上传至服务器,在服务器端进行区域判定,可以利用更强大的计算资源和更精准的算法。

    代码示例 (使用高德地图SDK):

    // 初始化地图实例
    const map = new AMap.Map('container');
    
    // 创建电子围栏
    const polygon = new AMap.Polygon({
      path: [
        // 电子围栏边界点坐标
      ],
      strokeColor: '#FF0000',
      strokeWeight: 2,
      fillColor: '#1791fc',
      fillOpacity: 0.35
    });
    map.add(polygon);
    
    // 监听位置变化
    AMap.event.addListener(map, 'location', function(e) {
      const currentLocation = e.position;
    
      // 判断当前位置是否在电子围栏内
      if (polygon.contains(currentLocation)) {
        console.log('进入电子围栏');
      } else {
        console.log('未进入电子围栏');
      }
    });
    
    // 启动定位
    map.plugin('AMap.Geolocation', function() {
      const geolocation = new AMap.Geolocation({
        enableHighAccuracy: true,
      });
      map.addControl(geolocation);
      geolocation.getCurrentPosition();
    });
    

    注意: 以上代码示例仅供参考,具体实现需要根据您的实际需求和应用场景进行调整。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(12条)

报告相同问题?

问题事件

  • 系统已结题 10月20日
  • 已采纳回答 10月12日
  • 修改了问题 10月12日
  • 修改了问题 10月12日
  • 展开全部

悬赏问题

  • ¥15 需要写计算过程,求解答
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 C++行情软件的tick数据如何高效的合成K线
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。
  • ¥20 在easyX库下编写C语言扑克游戏跑的快,能实现简单的人机对战