<?
/*
 * PHP code snippet to calculate the distance and bearing between two
 * maidenhead QTH locators.
 *
 * Written by Fabian Kurz, DJ1YFK; losely based on wwl+db by VA3DB.
 *
 * You can do whatever you want with this code.
 *
 */
function valid_locator ($loc) {
    if (ereg("^[A-R]{2}[0-9]{2}[A-X]{2}$", $loc)) {
        return 1;
    }
    else {
        return 0;
    }
}
function loc_to_latlon ($loc) {
    /* lat */
    $l[0] =
    (ord(substr($loc, 1, 1))-65) * 10 - 90 +
    (ord(substr($loc, 3, 1))-48) +
    (ord(substr($loc, 5, 1))-65) / 24 + 1/48;
    $l[0] = deg_to_rad($l[0]);
    /* lon */
    $l[1] =
    (ord(substr($loc, 0, 1))-65) * 20 - 180 +
    (ord(substr($loc, 2, 1))-48) * 2 +
    (ord(substr($loc, 4, 1))-65) / 12 + 1/24;
    $l[1] = deg_to_rad($l[1]);
    return $l;
}
function deg_to_rad ($deg) {
    return (M_PI * $deg/180);
}
function rad_to_deg ($rad) {
    return (($rad/M_PI) * 180);
}
function bearing_dist($loc1, $loc2) {
    if (!valid_locator($loc1) || !valid_locator($loc2)) {
        return 0;
    }
       Â
    $l1 = loc_to_latlon($loc1);
    $l2 = loc_to_latlon($loc2);
    $co = cos($l1[1] - $l2[1]) * cos($l1[0]) * cos($l2[0]) +
            sin($l1[0]) * sin($l2[0]);
    $ca = atan2(sqrt(1 - $co*$co), $co);
    $az = atan2(sin($l2[1] - $l1[1]) * cos($l1[0]) * cos($l2[0]),
                sin($l2[0]) - sin($l1[0]) * cos($ca));
    if ($az < 0) {
        $az += 2 * M_PI;
    }
    $ret[km] = round(6371*$ca);
    $ret[deg] = round(rad_to_deg($az));
    return $ret;
}
/* Example usage: Distance and heading from JO60LK to JO61UA: */
$bd = bearing_dist("JO60LK", "JO61UA");
echo "$bd[km]km, $bd[deg]deg";
?>