我有一些地理位置的列表,现在我想检查这些地理位置是直线还是有一些曲线。我想拒绝那些有明显曲线的地理点。
答案 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公里,这将无法奏效。在这种情况下,将需要更复杂的公式。