我将应用中的用户位置跟踪到包含所有坐标的数据库。然后,我做了一些事情来选择时间范围内的一系列坐标,但是当我将它保存到服务器时由于大量数据需要很长时间。 (15分钟是900 CLCoordinate2D
,这是相当多的)。
我想要做的是删除与前后坐标相交的坐标。使用过于简单的坐标进行说明,但想象一下这是在几千个对象的数组中的真实坐标上完成的。
示例:
0,0 //Keep
1,1 //Drop
2,2 //Drop
3,3 //Keep
3,4 //Keep
4,4 //Keep
5,3 //Keep
我知道我应该使用一些矢量东西,但我不擅长数学。 如何减少此数组以删除过时的点?
答案 0 :(得分:2)
你可以试试这样的......
var coordTimes:[(coord: CLLocationCoordinate2D, time: Double)] = []
// ...
func appendCoord(newCoord: CLLocationCoordinate2D, newTime: Double) {
guard coordTimes.count > 1 else {
coordTimes.append((newCoord, newTime))
return
}
let n = coordTimes.count
// So there are at least two already in the array
let c0 = coordTimes[n - 2].coord
let t0 = coordTimes[n - 2].time
let c1 = coordTimes[n - 1].coord
let t1 = coordTimes[n - 1].time
let dt = t1 - t0
let dtNew = newTime - t0
guard (dtNew > 0) && (dt > 0) else {
// decide what to do if zero time intervals. Shouldn't happen
return
}
// Scale the deltas by the time interval...
let dLat = (c1.latitude - c0.latitude) / dt
let dLon = (c1.longitude - c0.longitude) / dt
let dLatNew = (newCoord.latitude - c0.latitude) / dtNew
let dLonNew = (newCoord.longitude - c0.longitude) / dtNew
let tolerance = 0.00001 // arbitrary - choose your own
if (abs(dLat - dLatNew) <= tolerance) && (abs(dLon - dLonNew) <= tolerance) {
// Can be interpolated - replace the last one
coordTimes[n - 1] = (newCoord, newTime)
} else {
// Can't be interpolated, append new point
coordTimes.append((newCoord, newTime))
}
}
容差很重要,因为您不太可能获得完全匹配的间隔。此外,对于您之间的地理测量师,无需转换为地图坐标或计算真实距离,因为OP只是想知道坐标是否可以插值。