2011-02-05 5 views
8

Szukasz zasobów lub algorytm do obliczania następujących w app nawigacji:Obliczenia GPS/GIS: Algorytm przewidywania przyszłej pozycji na podstawie ruchu/mph?

Jeśli moja aktualna pozycja GPS jest (0,0) i ruszam 32 stopni na 15 mil na godzinę, w jaki sposób można obliczyć, co moje pozycja będzie za 10 sekund?

tj: GPSCoordinate predictedCoord = GPSCoordinate.FromLatLong(0, 0).AddByMovement(32, 15, TimeSpan.FromSeconds(10));

Edit: Aktualny kod na podstawie odpowiedzi poniżej:

public GPSCoordinate AddMovementMilesPerHour(double heading, double speedMph, TimeSpan duration) 
{ 
    double x = speedMph * System.Math.Sin(heading * pi/180) * duration.TotalSeconds/3600; 
    double y = speedMph * System.Math.Cos(heading * pi/180) * duration.TotalSeconds/3600; 

    double newLat = this.Latitude + 180/pi * y/earthRadius; 
    double newLong = this.Longitude + 180/pi/System.Math.Sin(this.Latitude * pi/180) * x/earthRadius; 

    return GPSCoordinate.FromLatLong(newLat, newLong); 
} 
+0

Jeżeli samochód jest w ruchu na ulicy może chcesz po ulicy zamiast ekstrapolacji liniowej. – CodesInChaos

+0

@CodeInChaos w tym przypadku, chcę liniowy; ten nie bierze pod uwagę ścieżki naziemne (może później!) – Brandon

+0

Kod w pierwszej odpowiedzi na http://stackoverflow.com/questions/3225803/calculate-endpoint-given-distance-bearing-starting-point
wytłumaczę ci wszystko – faruk

Odpowiedz

10

Oto pełna odpowiedź parametryczne:

zmienne:

  • heading: nagłówek (np . tyłu kąt od azymutu 0 ° C, w stopniach)
  • speed: prędkość (np normą wektora prędkości w mil/h)
  • lat0, lon0: współrzędne początkowego w stopniach
  • dtime: przedział czasowy od początku pozycja w sekundach
  • lat, lon: przewidywane współrzędne w stopniach
  • pi: THE PI stała (...) 3.14159
  • Rt: Ziemia promień w mil (6378137.0 metrów co czyni 3964.037911746 mil)

W lokalnym ramy (wschód, północ), pozycja po interwale czasowym jest:

x = speed * sin(heading*pi/180) * dtime/3600; 
y = speed * cos(heading*pi/180) * dtime/3600; 

(ze współrzędnymi w milach)

Stamtąd można obliczyć nową pozycję w ramce WGS84 (np. szerokość i długość geograficzna):

lat = lat0 + 180/pi * y/Rt; 
lon = lon0 + 180/pi/sin(lat0*pi/180) * x/Rt; 

Edit: Poprawione ostatnią linię: * sin (phi) do/sin (phi)

+1

Nie próbuj tego na wyprawie polarnej: P Kod rozpada się w bliskiej odległości (kilka metrów, jak sądzę) do bieguna – CodesInChaos

+0

Tak, może powinienem był o tym wspomnieć ... Ale to jest dobre przybliżenie tak długo, jak długo nie zbliżasz się zbytnio do biegunów, a rząd wielkości dla odległości wynosi mniej niż 10 km. Dzięki! –

+1

Świetna odpowiedź, dziękuję. Jeśli kiedykolwiek będę na wyprawie polarnej, mój kod będzie nie tylko zepsuty, ale mój pomysł na dobry czas też będzie ... – Brandon

0

Oto wzory, które trzeba.

http://www.movable-type.co.uk/scripts/latlong.html

nadzieję, że pomoże.

Bob

[zmiana] Oto wzory JavaScript (skopiowane źródeł)

var lat2 = Math.asin (Math.sin (lat1) * Math.cos (C/R) + Math.cos (lat1) * Math.sin (d/R) * Math.cos (brng)); var lon2 = lon1 + Math.atan2 (Math.sin (brng) * Math.sin (d/R) * Math.cos (lat1), Math.cos (d/R) -Math.sin (lat1) * Matematyka.sin (lat2));

d = odległość przebyta = prędkość x czas R = promień ziemi

Powiązane problemy