I will post another answer to presents a new way to do this, since my first way may be useful to other users that uses GIS software.
Well, try this PHP function to help you in the ST_Azimut and ST_Distance_Sphere. This will give you the distance and the azimuth if you pass the two coordinates of source and target. Please check if its in miles, kilometers or nautical miles ( I don't know ).
Sorry about some portuguese var names.
PHP:
function CalcDistAndAzimuth($lat1, $lon1, $lat2, $lon2) {
$dlat = 0.0;
$dlon = 0.0;
$apart = 0.0;
$alfa = 0.0;
$latm = 0.0;
$rumo = 0.0;
$distancia = 0.0;
if (($lon1 == $lon2) && ($lat1 == $lat2)) {
$rumo = 0;
$distancia = 0.0;
} else {
$dlat = $lat2 - $lat1;
$dlon = $lon2 - $lon1;
$latm = abs(($lat1 + $lat2) / 2.0);
$apart = $dlon * cos($latm * pi() / 648000); // 180*3600
// calc distance and azimuth
if ($dlat == 0) {
$distancia = abs(($apart) / 60);
if ($lon2 > $lon1)
$rumo = 90;
else
$rumo = 270;
}
if ($dlon == 0) {
$distancia = abs(($dlat) / 60.0);
if ($lat2 > $lat1)
$rumo = 0;
else
$rumo = 180;
}
if (($dlat != 0) && ($dlon != 0)) {
$alfa = atan(abs($apart / $dlat));
$distancia = abs(($apart / (sin($alfa))) / 60);
if ($dlat <= 0) {
if ($dlon <= 0)
$rumo = 180.0 + ($alfa * 180.0 / pi());
else
$rumo = 180.0 - ($alfa * 180.0 / pi());
} else {
if ($dlon <= 0)
$rumo = 360.0 - + ($alfa * 180.0 / pi());
else
$rumo = ($alfa * 180.0 / pi());
}
}
}
$rumodistancia["distance"] = $distancia;
$rumodistancia["azimuth"] = $rumo;
return $rumodistancia;
}
This is other helpful function. Given a point, an azimuth and a distance, return a new point.
function CalcCinematic($lat1, $lon1, $azimuth, $dist) {
// $dist is in miles
// $azimuth is in degrees
$dlat = 0.0;
$dlon = 0.0;
$apart = 0.0;
$alfa = 0.0;
$latm = 0.0;
$delta = 0.0;
if ($rumo <= 90.0) {
// convert azimuth from degrees to radians
$alfa = $rumo * pi() / 180.0;
$dlat = $dist * cos($alfa);
$apart = $dist * sin($alfa);
} else
if ($rumo <= 180.0) {
$alfa = (180.0 - $rumo) * pi() / 180.0;
$dlat = (-1) * $dist * cos($alfa);
$apart = $dist * sin($alfa);
} else
if ($rumo <= 270.0) {
$alfa = ($rumo -180.0) * pi() / 180.0;
$dlat = (-1) * $dist * cos($alfa);
$apart = (-1) * $dist * sin($alfa);
} else
if ($rumo <= 360.0) {
$alfa = (360.0 - $rumo) * pi() / 180.0;
$dlat = $dist * cos($alfa);
$apart = (-1) * $dist * sin($alfa);
}
$lat2 = $lat1 +round($dlat * 60);
if ($lat2 < -324000) {
$lat2 = (-1) * 648000 + $lat2;
$delta = 648000;
} else
if ($lat2 > 324000) {
$lat2 = 648000 - $lat2;
$delta = 648000;
}
$latm = abs(($lat1 + $lat2) / 2.0);
$dlon = ($apart * 60.0) / cos($latm * pi() / 648000);
$lon2 = $lon1 +round($dlon);
if ($lon2 > 648000)
$lon2 = -1296000 + $lon2;
else
if ($lon2 < -648000)
$lon2 = 1296000 - $lon2;
if ($delta == 648000) {
$lon2 = $lon2 +round($delta);
if ($lon2 > 648000) {
$lon2 = -1296000 + $lon2;
}
}
$newpoint["lat"] = $lat2
$newpoint["lon"] = $lon2;
return $newpoint;
}