2011-02-05 9 views
8

Recherche de ressources ou d'un algorithme pour calculer ce qui suit dans une application de navigation:Calculs GPS/SIG: Algorithme pour prédire la position future en fonction du mouvement/mph?

Si ma position GPS actuelle est (0,0) et que je suis à 32 degrés à 15 miles par heure, comment puis-je calculer la position sera dans 10 secondes?

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

Edit: Code actuel basé sur la réponse ci-dessous:

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

Si la voiture est en mouvement sur une rue, vous voudrez peut-être suivre la rue au lieu de extrapolant linéairement. – CodesInChaos

+0

@CodeInChaos dans ce cas, je veux linéaire; cela ne prend des chemins de terre en compte (peut-être plus tard!) – Brandon

+0

pas le code dans la première réponse sur http://stackoverflow.com/questions/3225803/calculate-endpoint-given-distance-bearing-starting-point
Je vais vous expliquer tout ça – faruk

Répondre

10

Voici la réponse paramétrique complète:

variables

  • heading: en-tête . vers l'arrière l'angle d'azimut 0 °, en degrés)
  • speed: vitesse (à savoir la norme du vecteur de vitesse, en miles/heure)
  • lat0, lon0: coordonnées initiales en degrés
  • dtime: intervalle de temps depuis le début la position, en seconde
  • lat
  • , lon: coordonnées prédites en degrés
  • pi: la pi constant (3,14159 ...)
  • Rt: rayon de la Terre à miles (6378137.0 mètres qui rend 3964.037911746 miles)

Dans un cadre local (Est, Nord), la position après l'intervalle de temps est:

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

(avec les coordonnées en miles)

De là, vous pouvez calculer la nouvelle position dans le cadre WGS84 (ie latitude et longitude):

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

Edit: corriger la dernière ligne: * sin (phi) à/sin (phi)

+1

Ne l'essayez pas en expédition polaire: P Le code se décompose à proximité (quelques mètres je suppose) en un pôle – CodesInChaos

+0

Ouais peut-être que j'aurais dû le mentionner ... Mais c'est une bonne approximation tant que vous ne vous approchez pas trop des pôles et que l'ordre des grandeurs reste autour de 10 km ou moins. Merci! –

+1

Bonne réponse, merci. Si je suis toujours en expédition polaire, mon code ne serait pas seulement brisé, mais mon idée d'un bon moment serait aussi ... – Brandon

0

Voici les formules que vous avez besoin.

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

espoir qui aide.

Bob

[mise à jour] Voici les formules en JavaScript (copiés à partir de la source)

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) * Math.sin (lat2));

d = distance parcourue = vitesse x temps R = rayon de la terre

Questions connexes