减少坐标数组

时间:2016-05-23 07:50:36

标签: ios swift coordinates

我将应用中的用户位置跟踪到包含所有坐标的数据库。然后,我做了一些事情来选择时间范围内的一系列坐标,但是当我将它保存到服务器时由于大量数据需要很长时间。 (15分钟是900 CLCoordinate2D,这是相当多的)。

我想要做的是删除与前后坐标相交的坐标。使用过于简单的坐标进行说明,但想象一下这是在几千个对象的数组中的真实坐标上完成的。

示例:

0,0 //Keep
1,1 //Drop
2,2 //Drop
3,3 //Keep
3,4 //Keep
4,4 //Keep
5,3 //Keep

或者,糟透的可视化:  enter image description here

我知道我应该使用一些矢量东西,但我不擅长数学。 如何减少此数组以删除过时的点?

1 个答案:

答案 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只是想知道坐标是否可以插值。