2011-02-05 7 views
8

Ricerca di risorse o algoritmo per calcolare quanto segue in un'app di navigazione:Calcoli GPS/GIS: Algoritmo per prevedere la posizione futura in base al movimento/mph?

Se la mia posizione GPS corrente è (0,0) e sto andando 32 gradi a 15 miglia all'ora, come posso calcolare quello che il mio la posizione sarà tra 10 secondi?

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

Edit: codice di corrente in base alla risposta di seguito:

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

Se la vettura è in movimento su una strada che si potrebbe desiderare di seguire la strada invece di estrapolare in modo lineare. – CodesInChaos

+0

@CodeInChaos in questo caso, voglio lineare; questo non tiene percorsi a terra in considerazione (forse più tardi!) – Brandon

+0

Il codice in prima risposta sul http://stackoverflow.com/questions/3225803/calculate-endpoint-given-distance-bearing-starting-point
ti spiegherò tutto – faruk

risposta

10

Ecco la risposta parametrico completo:

variabili:

  • heading: intestazione (es . all'indietro angolazione da azimut 0 °, in gradi)
  • speed: velocità (cioè norma del vettore velocità, in miglia/ora)
  • lat0, lon0: coordinate iniziali in gradi
  • dtime: intervallo di tempo dall'inizio posizione, in secondi
  • lat, lon: coordinate previste in gradi
  • pi: la pi costante (3.14159 ...)
  • Rt: raggio terrestre in miglia (6378137,0 metri che rende 3964.037911746 miglia)

In una cornice locale (Est, Nord), la posizione dopo l'intervallo di tempo è:

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

(con coordinate in miglia)

Da lì è possibile calcolare la nuova posizione nel frame WGS84 (cioè latitudine e longitudine):

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

Edit: corretto l'ultima riga: * sin (phi) a/sin (phi)

+1

Non provarlo in una spedizione polare: P Il codice si rompe in prossimità (pochi metri credo) a un palo – CodesInChaos

+0

Sì, forse avrei dovuto dirlo ... Ma è una buona approssimazione a patto che non ti avvicini troppo ai poli e che l'ordine di grandezza delle distanze rimanga intorno o sotto i 10 km. Grazie! –

+1

Ottima risposta, grazie. Se mai mi trovassi in una spedizione polare, il mio codice non sarebbe solo rotto, ma la mia idea di un buon momento sarebbe anche ... – Brandon

0

Ecco le formule di cui avete bisogno.

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

Speranza che aiuta.

Bob

[update] Ecco le formule in JavaScript (copiati dalla fonte)

var = Lat2 Math.asin (Math.sin (LAT1) * Math.cos (d/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) * Matematica.sin (Lat2));

d = distanza percorsa = velocità x tempo R = raggio della terra