uniapp 怎么判断某一经纬度是否在当前位置一公里范围内

文章介绍了如何在Vue组件中使用uni.getLocation获取用户位置,并通过calculateDistance方法计算目标位置与当前位置的直线距离,以判断两者是否在一公里范围内。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

export default {
methods: {
checkDistance() {
// 获取当前位置信息
uni.getLocation({
type: ‘gcj02’,
success: (res) => {
const currentLatitude = res.latitude; // 当前位置纬度
const currentLongitude = res.longitude; // 当前位置经度

      // TODO: 根据业务逻辑传入目标经纬度进行比较
      const targetLatitude = ...;     // 目标位置纬度
      const targetLongitude = ...;    // 目标位置经度
      
      // 计算两点之间的直线距离(单位为米)
      const distance = this.calculateDistance(currentLatitude, currentLongitude, targetLatitude, targetLongitude);
      
      if (distance <= 1000) {
        console.log('目标位置在当前位置一公里范围内');
      } else {
        console.log('目标位置不在当前位置一公里范围内');
      }
    },
    fail: () => {
      console.error('获取位置失败')
    }
  })
},
calculateDistance(lat1, lon1, lat2, lon2) {
  const R = 6378137; // 赤道上每个经度对应的平面长度(单位:m)
  
  const radianToDegree = Math.PI / 180;
  const degreeToRadian = 180 / Math.PI;
  
  const dLon = (lon2 - lon1) * radianToDegree;
  const dLat = (lat2 - lat1) * radianToDegree;
  
  const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos((lat1 * radianToDegree)) * Math.cos((lat2 * radianToDegree)) * Math.sin(dLon / 2) * Math.sin(dLon / 2);
  const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  const distance = R * c * degreeToRadian;
  
  return distance;
}

}
}

注意事项:

checkDistance()方法会调用uni.getLocation()函数获取当前位置信息,因此需要确保已开启相关权限;
targetLatitude和targetLongitude分别表示目标位置的纬度和经度,需要根据实际情况传入正确的值;
calculateDistance()方法用于计算两点之间的直线距离,其中R表示地球的半径(单位:米),默认值为6378137;
最后根据返回结果判断目标位置与当前位置的距离是否小于等于1000米(即一公里)。

### 如何在 UniApp 中实现学生签到功能 #### 功能概述 为了提高课堂管理效率并确保学生的出席情况得到准确记录,在基于 Java SSM 和 Android 的课堂学生签到系统中,通过 UniApp 实现了个高效的学生签到模块。此模块不仅支持常规的二维码扫描签到方式,还特别加入了地理位置验证机制来增强系统的安全性和准确性[^1]。 #### 技术栈说明 - **前端框架**: 使用 Vue.js 构建响应式的用户界面。 - **持久层框架**: MyBatis 负责处理数据访问逻辑。 - **小程序开发环境**: 利用 UniApp 开发工具创建适用于多平台的小程序应用。 #### 关键技术点解析 核心在于结合地理围栏技术和唯的签到码完成身份认证过程: - 当教师启动次新的签到活动时,服务器端会自动生成唯有效的签到验证码,并将其发送给参与课程的所有成员; - 同步地,服务端也会捕获当前教室的具体坐标位置作为参考标准; - 学生打开手机上的客户端应用程序后,输入接收到的签到码并通过GPS定位确认自己处于有效范围内即可顺利完成签到操作;如果超出设定范围,则无法提交请求[^2]。 #### 示例代码展示 以下是简化版的 JavaScript 函数用于模拟上述流程中的部分环节——即验证用户提供的签到码是否合法以及其所在地点是否符合条件: ```javascript // 定义个函数用来校验签到信息 function checkIn(signCode, userLocation) { const validSignCodes = ['code1', 'code2']; // 预设的有效签到码列表 let classroomPosition = { latitude: 39.9087, longitude: 116.3975 }; // 教室的实际经纬度 // 检查签到码有效性 if (!validSignCodes.includes(signCode)) { console.log('无效的签到码'); return false; } // 计算两点间距离(这里采用简单的欧氏距离计算方法) function getDistanceFromLatLonInKm(lat1, lon1, lat2, lon2) { var R = 6371; // 地球半径单位为公里 var dLat = deg2rad(lat2-lat1); var dLon = deg2rad(lon2-lon1); var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.sin(dLon/2) * Math.sin(dLon/2); var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); var d = R * c; // 单位为公里的距离 return d; } function deg2rad(deg) { return deg * (Math.PI/180) } // 获取当前位置与目标位置之间的直线距离 let distance = getDistanceFromLatLonInKm(classroomPosition.latitude, classroomPosition.longitude, userLocation.latitude, userLocation.longitude); // 如果距离小于等于预定义的最大允许误差值则认为是在教室内 if(distance <= 0.01){ // 假定最大可接受偏差不超过10米 console.log('签到成功!'); return true; }else{ console.log(`您不在指定区域内 (${distance.toFixed(2)} km away)` ); return false; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值