記録した座標のデータがいくつかあります。残念ながら、それらはあまり良くないようです。彼らは時々マップを飛び越えます。そこで、ルートをよりリアルに見せる平坦化またはフィルタリング アルゴリズムを探しています。
現在、私の唯一のフィルターは、1 秒間に (バス、車、または徒歩で) 移動可能な最大メートルを計算し、それらを座標と比較して、時間枠内では不可能であることを捨てることです。したがって、人が 1 秒間に最大 2.5 メートル歩くことができ、互いに 10 メートル離れた 2 つの座標があり、それらが 2 秒以内に記録された場合、それらを見つけて捨てようとします。これは少し役立ちます。
これはコードです:
filters.max_possible_travel = function(data) {
//http://en.wikipedia.org/wiki/Preferred_walking_speed
//I switched to 16, as the route was made by driving with a bus...
var maxMetersPerSec = 16,
i, m, last, result = [];
for(i=0;i<data.length;i++) {
m = data[i];
if (last) {
// seconds between current and last coord
var diff = (m.created.getTime() - last.created.getTime()) / 1000;
// the maximum amount of meters a person,bus,car etc can make per sec.
var maxDistance = diff * maxMetersPerSec;
// the actual distance traveled
var traveledDistance = google.maps.geometry.spherical.computeDistanceBetween(last.googLatLng, m.googLatLng);
if (traveledDistance > maxDistance) {
continue;
} else {
result.push(m);
}
}
last = m;
}
return result;
};
作業を簡単にするために、最初のフィルターを既に実装しており、新しいフィルターを追加する機能も提供するこのフィドルを作成しました。
私が持っているいくつかのさらなるアイデア:
- 特定の半径内にあるすべての座標を捨てます。これにより、数分間立っているだけで、最終的にいくつかの邪魔な座標が削除されます
- すべての座標を n 秒のフレームでグループ化し、このブロックで最も関連性の高いものを決定しようとします。残念ながら、私には方法がわかりません:(
ですから、これは非常に興味深い問題だと思います。私が話したことをすべて理解していただければ幸いです。助けてくれてありがとう!
編集: 線形最小二乗法とカルマン フィルターについて何かを見つけました。私はそれに興味がありますが、私は数学の専門家ではないので、これについて何か助けていただければ幸いです.
EDIT 2 Progress :) @geocodezip が私に宣伝した DouglasPeucker アルゴリズムを実装しました。アルゴリズムだけですべてが解決するわけではありませんが、現在の "max_possible_travel" の組み合わせにより、ほぼ完璧に見えます。2 番目のパラメーターを少しいじると、面白くなります。新しいフィドルを見て、「walkfilter」と「gdouglaspeucker」の両方のフィルターを確認してください。 http://jsfiddle.net/z4hB7/8/