Android 如果POI在阈值范围内,则计算GPS方位
我正在做的用例是基于当前方位显示当前位置内的POI。例如,如果我向北行驶,我将不显示来自南方的POI,而仅根据阈值内的方位显示POIAndroid 如果POI在阈值范围内,则计算GPS方位,android,gps,geometry,geospatial,Android,Gps,Geometry,Geospatial,我正在做的用例是基于当前方位显示当前位置内的POI。例如,如果我向北行驶,我将不显示来自南方的POI,而仅根据阈值内的方位显示POI 为了避免360/0转换出现问题,可以使用下一个条件来说明周期性 if (Cos(Bearing) * Cos(POI) + Sin(Bearing) * Sin(POI) > Cos(Threshold)) then POI direction lies in range Bearing +- Threshold 这是我目前的解决方案。同时努力简化它
为了避免360/0转换出现问题,可以使用下一个条件来说明周期性
if (Cos(Bearing) * Cos(POI) + Sin(Bearing) * Sin(POI) > Cos(Threshold)) then
POI direction lies in range Bearing +- Threshold
这是我目前的解决方案。同时努力简化它。欢迎提出建议
public static boolean isBearingWithinRange(double heading, double alertHeading, double threshold) {
boolean status = false;
double leftThresholdMin = heading - threshold;
double leftThresholdMax = FULL_CIRCLE;
double rightThresholdMin = 0.0d;
double rightThresholdMax = 0.0d;
double total = heading + threshold;
if(total > FULL_CIRCLE) {
rightThresholdMax = threshold - (FULL_CIRCLE - heading);
if((alertHeading >= leftThresholdMin && alertHeading <= leftThresholdMax) ||
(alertHeading >= rightThresholdMin && alertHeading <= rightThresholdMax)) {
status = true;
}
} else if(heading < threshold) {
double diff = (threshold - heading);
leftThresholdMin = FULL_CIRCLE - diff;
rightThresholdMax = threshold + heading;
if((alertHeading >= leftThresholdMin && alertHeading <= leftThresholdMax) ||
(alertHeading >= rightThresholdMin && alertHeading <= rightThresholdMax)) {
status = true;
}
} else {
rightThresholdMax = heading + threshold;
if(alertHeading >= leftThresholdMin && alertHeading <= rightThresholdMax) {
status = true;
}
}
return status;
}
所以你们需要找出两个方位角的差?是的,类似的。我需要检查POI是否在x1,x2的范围内。我已经用这个计算得到了方位和度数。双学位=Math.toDegreesMath.atan2y,x;双F值=度<0d?度+=360d:度;在进行计算之前,我应该进行一些转换吗?是的,你应该将度转换为弧度。但是你确定atan2y,x在地理坐标下工作得很好吗?谢谢@MBo。是的,它就这样工作。角度以标准化为[0,360]度的角度表示,以360度的角度表示。我添加了一个图像。我尝试了你的公式,有时有效,有时无效。我将发布我的解决方案,但我仍在研究如何简化它。任何建议都将不胜感激。您能否举例说明产生错误结果的数据?