【问题标题】:How to find Google Polyline has Curve or it is a Straight line?如何找到谷歌折线有曲线还是直线?
【发布时间】:2018-01-11 22:59:53
【问题描述】:

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

【问题讨论】:

  • 这是否会是大规模的,需要考虑地球的曲率?还是只是在一个很小的区域内,可以将地球视为平坦的?
  • 如果在这些点上绘制路径呢?
  • 计算每对点之间的方位角,设置阈值,如果相差太大则拒绝该线。
  • @DawoodibnKareem 目前我只考虑有限的差异,即最大 1 公里。
  • @geocodezip for turn 这个逻辑会失败,因为也可能有急转弯

标签: java google-maps polyline google-polyline


【解决方案1】:

好的,既然您已经说过您正在观察相当小的距离,因此无需考虑地球的曲率。

如果连接前两个的线段的梯度与连接后两个的线段的梯度相同,或者如果两个梯度都未定义,则三点线在一条直线上。

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

(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 公里左右,这将不起作用。在这种情况下,将需要一个更复杂的公式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    相关资源
    最近更新 更多