2011-03-23 6 views
2

Je dois obtenir de nouvelles coordonnées à 500 mètres au nord, sud, ouest et est à partir de quelques coordonnées GPS.coordonnées GPS + mètres

Lat: 45,815005 longue: 15,978501

il peut être aproximate

Merci

+1

duplication possible: http://stackoverflow.com/questions/5390497/calculating-gps-coordinate-radius – Czechnology

+1

Si vous utilisez une base de données MySQL, la question SO ci-dessus peut vous aider. Si vous utilisez PHP seul, faites une recherche pour le "Great Circle Calculator" - il vous permettra de calculer les co-ords lat/long basés sur le relèvement et la distance, et vice-versa. –

+0

merci, c'est ce dont j'avais besoin – mgalesic

Répondre

4

Eh bien, sans aucune connaissance de la façon de le faire pour commencer, nous allons voir quel genre de solution I peut venir avec. La recherche de Nord/Sud devrait être une arithmétique facile, car la longueur de chaque ligne de longitude est toujours la même, ainsi la distance et les degrés devraient être liés et ainsi peuvent être faits en calculant la circonférence de la terre autour des pôles en mètres divisé par 360 degrés pour donner des degrés par mètre. Mais les degrés latitudinaux par mètre changeraient puisque la longueur des lignes de latitude diminue d'autant plus loin que vous êtes de l'équateur, ce qui équivaudrait à une fonction géométrique/trigonométrique. Maintenant, d'après ce que je sais de la trigonométrie avec sphères, cos (deg) * (pi * d) = circonférence du cercle qui est parallèle au plan de l'équateur de la sphère à degrés deg, où deg est le degré nord ou sud de l'équateur de la sphère et d est le diamètre de la sphère.

Alors, voyons.

<?php 
$lat = 45.815005; 
$long = 15.978501; 
$meters = 500; //Number of meters to calculate coords for north/south/east/west 

$equator_circumference = 6371000; //meters 
$polar_circumference = 6356800; //meters 

$m_per_deg_long = 360/$polar_circumference; 

$rad_lat = ($lat * M_PI/180); //convert to radians, cosine takes a radian argument and not a degree argument 
$m_per_deg_lat = 360/(cos($rad_lat) * $equator_circumference); 

$deg_diff_long = $meters * $m_per_deg_long; //Number of degrees latitude as you move north/south along the line of longitude 
$deg_diff_lat = $meters * $m_per_deg_lat; //Number of degrees longitude as you move east/west along the line of latitude 

//changing north/south moves along longitude and alters latitudinal coordinates by $meters * meters per degree longitude, moving east/west moves along latitude and changes longitudinal coordinates in much the same way. 

$coordinates['north']['lat'] = $lat + $deg_diff_long; 
$coordinates['north']['long'] = $long; 
$coordinates['south']['lat'] = $lat - $deg_diff_long; 
$coordinates['south']['long'] = $long; 

$coordinates['east']['lat'] = $lat; 
$coordinates['east']['long'] = $long + $deg_diff_lat; //Might need to swith the long equations for these two depending on whether coordinates are east or west of the prime meridian 
$coordinates['west']['lat'] = $lat; 
$coordinates['west']['long'] = $long - $deg_diff_lat; 

?> 

Au moins, je pense que ça va l'obtenir. Je peux me tromper totalement. Il semble générer des coordonnées avec des différences de l'origine assez petit pour être à seulement 500 mètres de lui.

Je suis également passé en degrés par mètre plutôt qu'en mètres par degré, mais j'ai laissé les noms de variables identiques.

+0

Cette réponse m'a été très utile. Ce que j'essayais de faire était de dessiner des cercles en KML pour google earth. J'ai donc utilisé $ deg_diff_long et $ deg_diff_lat pour les deux rayons. Mais de cette façon le rayon était trop grand, si je les divise avec 2 * M_PI ils deviennent parfaits (ils sont d'accord avec les cicles que mon projet dessine sur Heremap). Si vous savez pourquoi, s'il vous plaît, éclairez-moi. – soger

Questions connexes