我正在尝试创建一个函数,该函数将允许我给出2个参数,一个新位置和一个以(米/秒)为单位的行驶速度

看起来像这样:

func (l *Location) Move(newLoc *Location, speed float64) {
    R := 6371.0 // Kilometers
    lat1 := l.Latitude * math.Pi / 180
    lat2 := l.Longitude * math.Pi / 180
    diffLat := (newLoc.Latitude - l.Latitude) * math.Pi / 180
    diffLon := (newLoc.Longitude - l.Longitude) * math.Pi / 180

    a := math.Sin(diffLat/2)*math.Sin(diffLat/2) +
        math.Cos(lat1)*math.Cos(lat2)*math.Sin(diffLon/2)*math.Sin(diffLon/2)
    c := 2 * math.Atan2(math.Sqrt(a), math.Sqrt(1-a))

    distanceToMove := R * c // Distance to travel in a straight line, in Kilometers


}

我唯一遇到的麻烦是考虑公式在一定的时间范围内进行纬度调整,从当前位置开始,到新位置结束。

所以说这个人将纬度从56.65更改为58.12,我告诉它去1.3m/s旅行,我该如何做到这一点。谢谢。

最佳答案

如果我理解您的问题,您的目标是计算两个位置之间的所有中间点,从一个位置开始,然后以指定的速度转到第二个位置。

如果我是正确的,以下是我将获得第一个解决方案的方法。如果有人可以改善这一点,我将不胜感激。

On the proj4 documentation,您可以找到许多有关如何计算两点之间距离的信息。

从点A开始以给定的速度(m / s)到达点B,仅意味着每秒钟计算一次点A',该点在直线AB上与点A的距离为m。

以更算法的方式(基于Vincenty's formula):

func (l *Location) Move(newLoc *Location, speed float64) Location {
    azimuthA, azimuthB, d := inverseVincenty(l, newLoc)

    // Use the direct vincenty's formula.
    // Here transform speed to get the correct value
    // without transformation, since speed is in m/s,
    // the resulting point will be at speed(m) distance from l.
    res := directVincenty(l, speed, azimuthA)

    // Now res shall contain your new point.
    return res
}

func main() {
    // init A and B and speed values.
    C := A // to conserve A position.
    t := time.Tick(1* time.Second)
    for stop := false; !stop; {
        select {
            case <- t:
            C = C.Move(B, speed)
            case // here a break condition:
                stop = true
        }
    }
}

我认为这是一个开始,对此答案您可以发表任何评论。

关于go - 如何以设定的速度在2 gps点之间移动?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38630661/

10-16 06:34