1、问题一:多个用户在同一个位置,拿着不同的手机会存在经纬度不一致,同一个位置经纬度也会有浮动,当用户位置正好在地图电子围栏的边缘位置不动时,因经纬度存在浮动,就会导致一会定位在地图电子围栏内,一会定位在电子围栏之外。
2、问题二:两个手机放在同一个位置,测试会出现两个手机在定位上导致两个手机的距离存在几十米的距离,甚至上百米的距离,实际两个手机距离就是在同一个位置。
🕒下午好,题主!目前:🟢[在线]
📢参考通义千问、由郭老师整理提供!
📣今日诗号:落花人独立,微雨燕双飞。
您遇到的问题是由于定位精度不足,导致在区域边缘反复进出。以下针对您提出的两个问题,提供解决方案和代码示例:
问题一:圆形区域判定
解决方案:
代码示例 (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;
}
问题二:电子围栏判定
解决方案:
代码示例 (使用高德地图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();
});
注意: 以上代码示例仅供参考,具体实现需要根据您的实际需求和应用场景进行调整。