【发布时间】:2013-04-20 14:09:04
【问题描述】:
我有一些我记录的坐标数据。不幸的是,他们似乎不是很好。他们有时会跳过地图。所以现在我正在寻找一些可以使路线看起来更真实的扁平化或过滤算法。
目前我唯一的过滤器是计算一秒钟内可能行驶的最大米数(在公共汽车、汽车或步行中),并将它们与坐标进行比较,然后将它们扔掉,这在时间范围内是不可能的。因此,如果一个人一秒钟能走 2.5 米,而我有两个相距 10 米的坐标,并且它们在两秒钟内被记录下来,我会尝试找到它们并将它们扔掉。这有点帮助。
这是代码:
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 秒帧分组,并尝试确定此块中最相关的坐标。不幸的是,我不知道如何:(
所以我认为这是一个非常有趣的问题,我希望你能理解我所说的一切。我感谢你们的任何帮助!
编辑:我发现了一些关于线性最小二乘法和卡尔曼滤波器的信息。我很喜欢它,但因为我绝对不是数学专家,我会很感激这方面的任何帮助。
编辑 2 进展 :) 我实现了 @geocodezip 向我推广的 DouglasPeucker 算法。单独的算法并不能解决所有问题,但是结合我当前的“max_possible_travel”它看起来几乎完美。如果我稍微玩一下第二个参数,它会变得很有趣。请查看新的小提琴并确保检查过滤器“walkfilter”和“gdouglaspeucker”。 http://jsfiddle.net/z4hB7/8/
【问题讨论】:
标签: javascript google-maps polyline geography