Google Directions APIPolyline - overview_polyline
によって改ざんされたものを既存のポリラインのセットと比較し、新しいポリラインのどの部分がこれらのポリラインの 1 つに既に含まれているかを確認しようとしています。私にとってポリラインは、Google Directions API から取得した運転ルートの表現です。基本的には世界中のどのルートでも構いません。簡単にするために、具体的な都市または国に属するルートをいつでも見つけて、これだけを比較できます。また、現時点では最大で 250km の長さになる可能性があります。次に例を示します。
ここに既存のルートと新しいルートは関係ありません。いずれにせよ、このルートが類似しているという結果を取得したいと思います(OK、90%類似していない可能性がありますが、類似していると仮定しましょう)。
現時点では、新しいポリラインを既存のポリラインと 1 つずつ比較するためにブルート フォースを使用しています。その前に、このアルゴリズムを使用してポリラインをポイントに分割し、各ポイントを比較して一致するかどうかを確認します。このポイント間の距離が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;
}
2 つの多くのサイクルがあり、比較するにはポイントが多すぎる可能性があるため、明らかに、このアルゴリズムは適切ではありません (特に最悪の場合、新しいポリラインに一致するものがない場合)。
それで、ポリラインを互いに比較するためのより効率的なアプローチがあるかどうか疑問に思っていました。