Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如果POI在阈值范围内,则计算GPS方位_Android_Gps_Geometry_Geospatial - Fatal编程技术网

Android 如果POI在阈值范围内,则计算GPS方位

Android 如果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 这是我目前的解决方案。同时努力简化它

我正在做的用例是基于当前方位显示当前位置内的POI。例如,如果我向北行驶,我将不显示来自南方的POI,而仅根据阈值内的方位显示POI


为了避免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度的角度表示。我添加了一个图像。我尝试了你的公式,有时有效,有时无效。我将发布我的解决方案,但我仍在研究如何简化它。任何建议都将不胜感激。您能否举例说明产生错误结果的数据?