2016-07-28 13 views
0

Ich versuche, eine Funktion zu erstellen, die mir zwei Argumente geben lassen, einen neuen Standort und eine Geschwindigkeit, mit zu reisen (in Meter/Sekunde)Wie kann ich mit einer festgelegten Geschwindigkeit zwischen 2 gps-Punkten wechseln?

Es sieht wie folgt aus:

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 


} 

Die Das einzige Problem, mit dem ich Probleme habe, ist, an die Formel zu denken, um die Breite zu bestimmen, an der aktuellen Position zu beginnen und über eine bestimmte Zeit an ihrer neuen Position zu enden.

Also sagen Sie, die Person änderte den Breitengrad von 56.65 zu 58.12 und ich sagte ihm, um 1.3m/s zu reisen, wie kann ich dies erreichen. Vielen Dank.

+0

Was genau soll diese Methode tun? Was sind die gewünschten Ergebnisse/Nebenwirkungen der Funktion? – Nebril

+0

@Nebril die Funktion soll im Grunde die GPS-Koordinaten inkrementell von der einen Stelle auf die andere zu bewegen, ob es in einer Schleife oder auf andere Weise tun muss Ich kann nicht herausfinden, die Formel oder Methode, um es zu erreichen – Datsik

+0

sollten Sie wahrscheinlich einen dritten Parameter für Move angeben, der der Funktion den Zeitrahmen mitteilt, in dem die Position geändert wird. Auch der Rückgabewert sollte wahrscheinlich neue Location-Struktur sein, die den Ort enthält, an dem das Objekt, das von 'l' nach' newLoc' mit 'speed' wandert, nach der im neuen Funktionsargument angegebenen Zeit liegt. – Nebril

Antwort

0

Wenn ich Ihre Frage verstanden habe, besteht Ihr Ziel darin, alle Zwischenpunkte zwischen zwei Orten zu berechnen, angefangen von einem Ort bis hin zum zweiten mit einer bestimmten Geschwindigkeit.

Wenn ich richtig liege, wäre das folgende, wie ich eine erste Lösung bekommen würde. Wenn jemand das verbessern kann, würde ich mich freuen.

On the proj4 documentation, finden Sie viele Informationen zur Berechnung der Entfernung zwischen zwei Punkten.

Beginnend von den Punkten A bis B mit einer bestimmten Geschwindigkeit (m/s) zu erreichen, bedeutet nur jede Sekunde einen Punkt A 'zu berechnen, der in einer Entfernung m von A auf der Linie AB ist.

In einer algorithmischen Weise (basierend auf 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 
     } 
    } 
} 

Ich denke, das ist ein Anfang, jeder Kommentar ist zu dieser Antwort zu schätzen wissen.