2013-08-03 3 views
3

Comment calculer toutes les coordonnées Lat/Long entre deux coordonnées Lat/Long en PHP?Calculer toutes les coordonnées à x positions décimales entre deux coordonnées Lat/Long

Disons que je coordonne A:

(39.126331, -84.113288) 

et coordonnées B:

(39.526331, -84.213288) 

Comment puis-je calculer toutes les coordonnées possibles entre ces deux LAT/coordonnées longues (en ligne directe) vers le haut à cinq décimales (par exemple 39.12633, -84.11328) et obtenir la liste des coordonnées entre les deux?

En outre, j'ai un autre ensemble de coordonnées (coordonnées C) qui sont légèrement en retrait et non sur la piste de coordonnées entre A et B.

Comment puis-je calculer la distance entre les coordonnées C et les coordonnées les plus proches entre A et B?

+0

Que voulez-vous dire par une « liste » de coordonnées. Voulez-vous toutes les coordonnées possibles entre les deux, avec 6 chiffres significatifs? Ou voulez-vous l'équation d'une ligne entre les deux points? Ou voulez-vous quelque chose d'autre entièrement? –

+0

Oui, toutes les coordonnées possibles entre les deux, avec 5 chiffres significatifs suffiraient. Je vais clarifier ma question. Merci. –

+0

Cela aiderait les utilisateurs de SO si vous incluez votre utilisation finale et ce que vous avez déjà essayé. Votre calcul va donner une liste terriblement grande de permutations. Pourquoi voulez-vous les lister tous quand un algorithme fonctionnerait mieux? – nickhar

Répondre

0

Voici ce qui a résolu ce pour moi,

function point_to_line_segment_distance($startX,$startY, $endX,$endY, $pointX,$pointY) 
{ 

     $r_numerator = ($pointX - $startX) * ($endX - $startX) + ($pointY - $startY) * ($endY - $startY); 
     $r_denominator = ($endX - $startX) * ($endX - $startX) + ($endY - $startY) * ($endY - $startY); 
     $r = $r_numerator/$r_denominator; 

     $px = $startX + $r * ($endX - $startX); 
     $py = $startY + $r * ($endY - $startY); 

     $closest_point_on_segment_X = $px; 
     $closest_point_on_segment_Y = $py; 

     $distance = user_bomb_distance_calc($closest_point_on_segment_X, $closest_point_on_segment_Y, $pointX, $pointY); 

     return array($distance, $closest_point_on_segment_X, $closest_point_on_segment_Y); 
} 

function user_bomb_distance_calc($uLat , $uLong , $bLat , $bLong) 
{ 
    $earthRadius = 6371; #km 
    $dLat = deg2rad((double)$bLat - (double) $uLat); 
    $dlong = deg2rad((double)$bLong - (double) $uLong); 

    $a = sin($dLat/2) * sin($dLat/2) + cos(deg2rad((double)$uLat)) * cos(deg2rad((double)$bLat)) * sin($dlong/2) * sin($dlong/2); 


    $c = 2 * atan2(sqrt($a), sqrt(1 - $a)); 
    $distance = $earthRadius * $c; 

    $meter = 1000; //convert to meter 1KM = 1000M 

    return intval($distance * $meter) ; 
} 
0

Vous pouvez calculer un diagramme de Voronoi à partir de toutes les paires de latons, puis rechercher une cellule adjacente. Notez également que lat lon sont des angles et non des coordonnées mondiales ou des coordonnées cartésiennes. Vous pouvez télécharger mon diagramme PHP voronoi @ phpclasses.org.

Questions connexes