我正在尝试Polyline - overview_polyline
将由Google Directions API生成的 ruturned与一组已经存在的折线进行比较,并查看新折线的哪一部分已包含在其中一条折线中。对我来说,折线是一种行车路线表示,从 Google Directions API 检索。它基本上是世界上任何地方的任何路线。为了简单起见,我们总能找到属于具体城市或国家的路线,并且只比较这个。此外,目前它最多可能长达 250 公里。下面是一些例子:
此处存在哪条路线以及哪条路线是新路线并不重要。无论如何,我想得到结果,这些路线是相似的(好吧,可能它们不是 90% 相似,但我们假设它们是相似的)。
目前,我正在使用蛮力将新的折线与现有的折线一一进行比较。在此之前,我使用此算法将折线分割成点并比较每个点以查看是否有匹配项。如果这些点之间的距离小于 100 米,我将点视为相同。
如果我发现已经有一些折线,主要覆盖新的折线,我会停止处理。
它看起来像这样:
Polyline findExistingPolyline(Polyline[] polylines, Polyline polyline) {
LatLng[] polylinePoints = PolylineDecoder.toLatLng(polyline);
for (Polyline existing: polylines) {
LatLng[] existingPoints = PolylineDecoder.toLatLng(existing);
if (isMostlyCovered(existingPoints , polylinePoints)) {
return existing;
}
}
return null;
}
boolean isMostlyCovered(LatLng[] existingPoints, LatLng[] polylinePoints) {
int initialSize = polylinePoints.length;
for (LatLng point: polylinePoints) {
for (LatLng existingPoint: existingPoints) {
if (distanceBetween(existingPoint, point) <= 100) {
polylinePoints.remove();// I actually use iterator, here it is just demosnstration
}
}
}
// check how many points are left and decide if polyline is mostly covered
// if 90% of the points is removed - existing polylines covers new polyline
return (polylinePoints.length * 100 / initialSize) <= 10;
}
显然,这个算法很糟糕(特别是在最坏的情况下,当没有匹配新的折线时),因为有两个循环,并且可能有太多的点无法比较。
所以,我想知道是否有更有效的方法来比较折线。