2010-04-23 16 views
1

J'ai cette fonction PHP, mais elle semble donner des résultats erronés. Est-ce que quelqu'un a une idée de ce qui ne va pas avec (en particulier la formule)?Formule de destination géographique

/** 
* Finds a destination given a starting location, bearing and distance. 
* 
* @param array $startingCoordinates The starting coordinates, as non-directional floats in an array with lat and lon keys. 
* @param float $bearing The initial bearing in degrees. 
* @param float $distance The distance to travel in km. 
* 
* @return array The desitination coordinates, as non-directional floats in an array with lat and lon keys. 
*/ 
public static function findDestination(array $startingCoordinates, $bearing, $distance) { 
     $startingCoordinates['lat'] = (float)$startingCoordinates['lat']; 
     $startingCoordinates['lon'] = (float)$startingCoordinates['lon']; 
     $angularDistance = $distance/Maps_EARTH_RADIUS; 
     $lat = asin(
         sin($startingCoordinates['lat']) * cos($angularDistance) + 
         cos($startingCoordinates['lat']) * sin($angularDistance) * cos($bearing) 
     ); 
     return array(
       'lat' => $lat, 
       'lon' => $startingCoordinates['lon'] + atan2(
         sin($bearing) * sin($angularDistance) * cos($startingCoordinates['lat']), 
         cos($angularDistance) - sin($startingCoordinates['lat']) * sin($lat) 
       ) 
     ); 
} 
+0

Pouvez-vous détailler à quoi ressemblent les "mauvais résultats"? Je ne pense pas qu'il y ait trop de gens prêts à installer cela, obtenir des coordonnées réelles, et élaborer une description de l'erreur. –

+0

Cherchez-vous http://stackoverflow.com/questions/2548943/gps-format-in-php/2548996#2548996? Je ne peux pas dire parce que le code ci-dessus a échoué la règle des années 30. – Gordon

+0

Quand je lance ceci avec les coordonnées de new york (40.7142691, -74.0059729), et différentes distances et orientations, je finis par obtenir le même résultat à chaque fois. 0 °, 10 km -> 0,12643539666731, -74,0059729 0 °, 100 km -> 0,12643539666731, -74,0059729 0 °, 100 km -> 0,12643539666731, -74,0059729 90 deg, 10 km -> 0,12643539666731, -74,0059729 90 degrés, 100km -> 0.12643539666731, -74.0059729 90 deg, 100km -> 0.12643539666731, -74.0059729 Cela semble tout à fait incorrect :) –

Répondre

1

Les calculs sur le travail radians donc vous devez d'abord convertir les valeurs en fonction degré à cela, et puis de nouveau pour une valeur significative pour vous. Par exemple:

public static function findDestination(array $startingCoordinates, $bearing, $distance) { 
     $startingCoordinates['lat'] = deg2rad((float)$startingCoordinates['lat']); 
     $startingCoordinates['lon'] = deg2rad((float)$startingCoordinates['lon']); 
     $bearing = deg2rad($bearing); 
     $angularDistance = $distance/Maps_EARTH_RADIUS; 
     $lat = asin(
      sin($startingCoordinates['lat']) * cos($angularDistance) + 
      cos($startingCoordinates['lat']) * sin($angularDistance) * cos($bearing) 
     ); 
     return array(
      'lat' => rad2deg($lat), 
      'lon' => rad2deg($startingCoordinates['lon'] + atan2(
        sin($bearing) * sin($angularDistance) * cos($startingCoordinates['lat']), 
        cos($angularDistance) - sin($startingCoordinates['lat']) * sin($lat) 
      )) 
     ); 
} 

Test avec findDestination(array('lat' => 40.7142691, 'lon' => -74.0059729), 90, 1000) donne le résultat de 40.714268492616,-73.994108059287, qui je pense est plus comme vous cherchez.