如何找到谷歌折线有曲线或它是直线?

时间:2017-08-04 06:16:21

标签: java google-maps polyline google-polyline

我有一些地理位置的列表,现在我想检查这些地理位置是直线还是有一些曲线。我想拒绝那些有明显曲线的地理点

1 个答案:

答案 0 :(得分:0)

好的,既然你说你在相当小的距离上看,那就不需要考虑地球的曲率了。

如果连接前两个的线段的渐变与连接最后两个的线段的渐变相同,或者如果两个渐变都未定义,则直线上有三个点。

数学上,这个条件相当于说

(y2 - y1)(x3 - x2) = (y3 - y2)(x2 - x1)

将此应用于几个点的纬度和经度,您需要检查第一,第二和第三点的这个条件;然后是第二,第三和第四;然后是第三,第四和第五;等等,直到你到达最后一点。

您还需要考虑在这种平等中您想要多少宽容度。您的点可能不会完全对齐,并且您可能还会在计算中出现一些浮点错误。您需要为自己进行实验,以确定这个等式的两个方面之间的差异是否可以接受。

根据您为变量和方法命名的方式,它的代码可能如下所示。

public static boolean areCollinear(Point[] points, double tolerance) {
    for (int index = 0; index < points.length - 2; index++) {
        double conditionLHS = ( points[index + 1].getLatitude() - points[index].getLatitude()) * points[index + 2].getLongitude() - points[index + 1].getLongitude());
        double conditionRHS = ( points[index + 2].getLatitude() - points[index + 1].getLatitude()) * points[index + 1].getLongitude() - points[index].getLongitude());
        if (Math.abs(conditionRHS - condition.LHS) > tolerance) {
            return false;
        }
    }
    return true;
}

请注意,由于地球的曲率,一旦距离超过100公里,这将无法奏效。在这种情况下,将需要更复杂的公式。