Benutzer-Werkzeuge

Webseiten-Werkzeuge


programmieren:amateurfunk:locator

Locator Berechnung

Quelle: https://www.giangrandi.org/electronics/radio/qthloccalc.shtml

QTH locator calculator

QTH locator calculator


Degrees-minutes-seconds format:
Latitude:    °  '  "
Longitude:    °  '  "
Decimal format:
Latitude:  °  Positive: North, negative: South.
Longitude  °  Positive: East, negative: West.
QTH locator:
Locator string:

Auch eine gute Quelle um die Entfernung zwischen zwei Locator's zu berechnen
https://www.karhukoti.com/Maidenhead-Grid-Square-Locator

<html lang="en">

<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<meta name="author" content="Iacopo Giangrandi" />
<title>QTH locator calculator</title>
<style>
body { background-color:#c0c0c0; color:#000000; }
img { border:none; vertical-align:middle; }
table { border:none; }
table td { border:none; vertical-align:top; text-align:left; }
.table_with_border { border-style:outset; border-width:1px; border-spacing:2px; }
.table_with_border td { border-style:inset; border-width:1px; vertical-align:top; text-align:left; }
.table_footer { border:none; width:100%; text-align:center; }
.table_footer td { border:none; text-align:center; }
</style>
</head>

<body>
<!-- Written by Iacopo Giangrandi, http://www.giangrandi.ch -->
<h1>QTH locator calculator</h1>
<hr />

<form id="qth_locator">
<table class=table_with_border>
<tr>
    <td colspan=3><b>Degrees-minutes-seconds format:</b></td>
</tr>
<tr>
    <td style="text-align:right;">Latitude:</td>
    <td><input size="1" id="lat_NS" type="text" />&nbsp;
        <input size="3" id="lat_deg" type="text" />&nbsp;&deg;
        <input size="3" id="lat_min" type="text" />&nbsp;'
        <input size="8" id="lat_sec" type="text" />&nbsp;&quot;</td>
    <td rowspan=2 style="vertical-align:middle;"><input id="CalculateQTH" value="Convert" onclick="return cmd_calculate_qth_dec()" type="button" /></td>
</tr>
<tr>
    <td style="text-align:right;">Longitude:</td>
    <td><input size="1" id="lon_EW" type="text" />&nbsp;
        <input size="3" id="lon_deg" type="text" />&nbsp;&deg;
        <input size="3" id="lon_min" type="text" />&nbsp;'
        <input size="8" id="lon_sec" type="text" />&nbsp;&quot;</td>
</tr>
<tr>
    <td colspan=3><b>Decimal format:</b></td>
</tr>
<tr>
    <td style="text-align:right;">Latitude:</td>
    <td><input size="10" id="lat_dec" type="text" />&nbsp;&deg;&nbsp;&nbsp;Positive: North, negative: South.</td>
    <td rowspan=2 style="vertical-align:middle;"><input id="CalculateQTHbis" value="Convert" onclick="return cmd_calculate_qth_dms()" type="button" /></td>
</tr>
<tr>
    <td style="text-align:right;">Longitude</td>
    <td><input size="10" id="lon_dec" type="text" />&nbsp;&deg;&nbsp;&nbsp;Positive: East, negative: West.</td>
</tr>
<tr>
    <td colspan=3><b>QTH locator:</b></td>
</tr>
<tr>
    <td>Locator string:</td>
    <td><input size="10" id="qth_loc" type="text" /></td>
    <td><input id="CalculateLatLon" value="Convert" onclick="return cmd_calculate_dec_dms()" type="button" /></td>
</tr>
<tr>
    <td colspan=3><input id="get_location" onclick="return cmd_get_location()" type=button value="Get current location" /></td>
</tr>
</table>
</form>
<hr />

<script>
<!--

// --------------------------------------------------------------------------
// A few points to check if the algorithm works:
// N 48.396, E 11.458, JN58rj
// S 30.688, E 25.208, KF29oh
// S 47.229, W 67.625, FE62es
// N 45.021, W 117.458, DN15ga
// --------------------------------------------------------------------------



var str_chr_up = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";                          // Constants.
var str_chr_lo = "abcdefghijklmnopqrstuvwxyz";
var str_num = "0123456789";



// --------------------------------------------------------------------------



function cmd_calculate_qth_dec()
{
    var lat, lat_NS, lat_deg, lat_min, lat_sec;
    var lon, lon_EW, lon_deg, lon_min, lon_sec
    var qth;

    lat_NS = document.getElementById('lat_NS').value;           // Get data from the form.
    lat_deg = document.getElementById('lat_deg').value;
    lat_min = document.getElementById('lat_min').value;
    lat_sec = document.getElementById('lat_sec').value;
    lon_EW = document.getElementById('lon_EW').value;
    lon_deg = document.getElementById('lon_deg').value;
    lon_min = document.getElementById('lon_min').value;
    lon_sec = document.getElementById('lon_sec').value;

    lat_NS = lat_NS.toUpperCase();
    lon_EW = lon_EW.toUpperCase();


    if ((lat_NS != "N") && (lat_NS != "S"))                     // Check for valid latitude.
    {
        document.getElementById('lat_NS').value = "";
        document.getElementById('lat_dec').value = "";
        document.getElementById('lon_dec').value = "";
        document.getElementById('qth_loc').value = "";
        alert('Invalid latitude: only "N" (North) or "S" (South)');
        return(1);
    }

    if (isNaN(lat_deg) || (lat_deg > 90) || (lat_deg < 0) || (lat_deg == "") || (lat_deg != Math.floor(lat_deg)))
    {
        document.getElementById('lat_deg').value = "";
        document.getElementById('lat_dec').value = "";
        document.getElementById('lon_dec').value = "";
        document.getElementById('qth_loc').value = "";
        alert("Invalid latitude: please enter degrees between 0 and 90 (integer)");
        return(1);
    }

    if (isNaN(lat_min) || (lat_min >= 60) || (lat_min < 0) || (lat_min == "") || (lat_min != Math.floor(lat_min)))
    {
        document.getElementById('lat_min').value = "";
        document.getElementById('lat_dec').value = "";
        document.getElementById('lon_dec').value = "";
        document.getElementById('qth_loc').value = "";
        alert("Invalid latitude: please enter minutes between 0 and 59 (integer)");
        return(1);
    }

    if (isNaN(lat_sec) || (lat_sec >= 60) || (lat_sec < 0) || (lat_sec == ""))
    {
        document.getElementById('lat_sec').value = "";
        document.getElementById('lat_dec').value = "";
        document.getElementById('lon_dec').value = "";
        document.getElementById('qth_loc').value = "";
        alert("Invalid latitude: please enter seconds between 0 and 60");
        return(1);
    }

    if ((lon_EW != "E") && (lon_EW != "W"))                     // Check for valid longitude.
    {
        document.getElementById('lon_EW').value = "";
        document.getElementById('lat_dec').value = "";
        document.getElementById('lon_dec').value = "";
        document.getElementById('qth_loc').value = "";
        alert('Invalid longitude: only "E" (East) or "W" (West)');
        return(1);
    }

    if (isNaN(lon_deg) || (lon_deg > 180) || (lon_deg < 0) || (lon_deg == "") || (lon_deg != Math.floor(lon_deg)))
    {
        document.getElementById('lon_deg').value = "";
        document.getElementById('lat_dec').value = "";
        document.getElementById('lon_dec').value = "";
        document.getElementById('qth_loc').value = "";
        alert("Invalid longitude: please enter degrees between 0 and 180 (integer)");
        return(1);
    }

    if (isNaN(lon_min) || (lon_min >= 60) || (lon_min < 0) || (lon_min == "") || (lon_min != Math.floor(lon_min)))
    {
        document.getElementById('lon_min').value = "";
        document.getElementById('lat_dec').value = "";
        document.getElementById('lon_dec').value = "";
        document.getElementById('qth_loc').value = "";
        alert("Invalid longitude: please enter minutes between 0 and 59 (integer)");
        return(1);
    }

    if (isNaN(lon_sec) || (lon_sec >= 60) || (lon_sec < 0) || (lon_sec == ""))
    {
        document.getElementById('lon_sec').value = "";
        document.getElementById('lat_dec').value = "";
        document.getElementById('lon_dec').value = "";
        document.getElementById('qth_loc').value = "";
        alert("Invalid longitude: please enter seconds between 0 and 60");
        return(1);
    }


    lat_deg = lat_deg * 1;                                      // Make sure lat/lon are numbers.
    lat_min = lat_min * 1;
    lat_sec = lat_sec * 1;
    lon_deg = lon_deg * 1;
    lon_min = lon_min * 1;
    lon_sec = lon_sec * 1;

    lat = lat_deg + lat_min / 60 + lat_sec / 3600;              // Calculate decimal lat/lon.
    if (lat_NS == "S")
        lat *= -1;
    lon = lon_deg + lon_min / 60 + lon_sec / 3600;
    if (lon_EW == "W")
        lon *= -1;

    document.getElementById('lat_dec').value = lat.toFixed(3);  // Display decimal lat/lon (rounded to 3 decimal digits).
    document.getElementById('lon_dec').value = lon.toFixed(3);


    lat += 90;                                                  // Locator lat/lon origin shift.
    lon += 180;

    qth = str_chr_up.charAt(Math.floor(lon / 20));              // 1st digit: 20deg longitude slot.
    qth += str_chr_up.charAt(Math.floor(lat / 10));             // 2nd digit: 10deg latitude slot.
    qth += str_num.charAt(Math.floor((lon % 20) / 2));          // 3rd digit: 2deg longitude slot.
    qth += str_num.charAt(Math.floor((lat % 10) / 1));          // 4th digit: 1deg latitude slot.
    qth += str_chr_lo.charAt(Math.floor((lon % 2) * (60 / 5))); // 5th digit: 5min longitude slot.
    qth += str_chr_lo.charAt(Math.floor((lat % 1) * (60 / 2.5)));   // 6th digit: 2.5min latitude slot.

    document.getElementById('qth_loc').value = qth;             // Display QTH locator.

    return(0);
}



// --------------------------------------------------------------------------



function cmd_calculate_qth_dms()
{
    var lat, lon, qth;
    var deg, min, sec;

    lat = document.getElementById('lat_dec').value;             // Get data from the form.
    lon = document.getElementById('lon_dec').value;

    if (isNaN(lat) || (lat > 90) || (lat < -90) || (lat == "")) // Check for valid latitude.
    {
        document.getElementById('lat_dec').value = "";
        document.getElementById('qth_loc').value = "";
        document.getElementById('lat_NS').value = "";
        document.getElementById('lat_deg').value = "";
        document.getElementById('lat_min').value = "";
        document.getElementById('lat_sec').value = "";
        document.getElementById('lon_EW').value = "";
        document.getElementById('lon_deg').value = "";
        document.getElementById('lon_min').value = "";
        document.getElementById('lon_sec').value = "";
        alert("Invalid latitude: please enter a value between -90 (S) and 90 (N) degrees");
        return(1);
    }

    if (isNaN(lon) || (lon > 180) || (lon < -180) || (lon == ""))   // Check for valid longitude.
    {
        document.getElementById('lon_dec').value = "";
        document.getElementById('qth_loc').value = "";
        document.getElementById('lat_NS').value = "";
        document.getElementById('lat_deg').value = "";
        document.getElementById('lat_min').value = "";
        document.getElementById('lat_sec').value = "";
        document.getElementById('lon_EW').value = "";
        document.getElementById('lon_deg').value = "";
        document.getElementById('lon_min').value = "";
        document.getElementById('lon_sec').value = "";
        alert("Invalid longitude: please enter a value between -180 (W) and 180 (E) degrees");
        return(1);
    }

    lat = lat * 1;                                              // Make sure lat/lon are numbers.
    lon = lon * 1;

    deg = Math.floor(Math.abs(lat));                            // Convert latitude to deg/min/sec.
    min = Math.floor((Math.abs(lat) - deg) * 60);
    sec = Math.floor(((Math.abs(lat) - deg) * 60 - min) * 60);
    if (lat >= 0)
        document.getElementById('lat_NS').value = "N";
    else
        document.getElementById('lat_NS').value = "S";
    document.getElementById('lat_deg').value = deg;
    document.getElementById('lat_min').value = (min < 10 ? "0" : "") + min.toString();
    document.getElementById('lat_sec').value = (sec < 10 ? "0" : "") + sec.toString();

    deg = Math.floor(Math.abs(lon));                            // Convert longitude to deg/min/sec.
    min = Math.floor((Math.abs(lon) - deg) * 60);
    sec = Math.floor(((Math.abs(lon) - deg) * 60 - min) * 60);
    if (lon >= 0)
        document.getElementById('lon_EW').value = "E";
    else
        document.getElementById('lon_EW').value = "W";
    document.getElementById('lon_deg').value = deg;
    document.getElementById('lon_min').value = (min < 10 ? "0" : "") + min.toString();
    document.getElementById('lon_sec').value = (sec < 10 ? "0" : "") + sec.toString();


    lat += 90;                                                  // Locator lat/lon shift.
    lon += 180;

    qth = str_chr_up.charAt(Math.floor(lon / 20));              // 1st digit: 20deg longitude slot.
    qth += str_chr_up.charAt(Math.floor(lat / 10));             // 2nd digit: 10deg latitude slot.
    qth += str_num.charAt(Math.floor((lon % 20) / 2));          // 3rd digit: 2deg longitude slot.
    qth += str_num.charAt(Math.floor((lat % 10) / 1));          // 4th digit: 1deg latitude slot.
    qth += str_chr_lo.charAt(Math.floor((lon % 2) * (60 / 5))); // 5th digit: 5min longitude slot.
    qth += str_chr_lo.charAt(Math.floor((lat % 1) * (60 / 2.5)));  // 6th digit: 2.5min latitude slot.

    document.getElementById('qth_loc').value = qth;             // Display result.

    return(0);
}



// --------------------------------------------------------------------------



function cmd_calculate_dec_dms()
{
    var lat, lon, qth;
    var deg, min, sec;

    qth = document.getElementById('qth_loc').value;             // Get data from the form.

    if ((qth.length != 4) && (qth.length != 6))                 // Verify string length: only 4 and 6 character strings are accepted.
    {
        document.getElementById('lat_dec').value = "";
        document.getElementById('lon_dec').value = "";
        document.getElementById('lat_NS').value = "";
        document.getElementById('lat_deg').value = "";
        document.getElementById('lat_min').value = "";
        document.getElementById('lat_sec').value = "";
        document.getElementById('lon_EW').value = "";
        document.getElementById('lon_deg').value = "";
        document.getElementById('lon_min').value = "";
        document.getElementById('lon_sec').value = "";
        document.getElementById('qth_loc').value = "";
        alert("Please enter a valid 4 or 6 characters QTH locator.");
        return(1);
    }

    qth = qth.toUpperCase();                                    // Convert to upper case.

    if ((qth.charAt(0) < 'A') || (qth.charAt(0) > 'S') || (qth.charAt(1) < 'A') || (qth.charAt(1) > 'S') ||
        (qth.charAt(2) < '0') || (qth.charAt(2) > '9') || (qth.charAt(3) < '0') || (qth.charAt(3) > '9'))
    {                                                           // Make sure the locator is composed by twho characters and two digits.
        document.getElementById('lat_dec').value = "";
        document.getElementById('lon_dec').value = "";
        document.getElementById('lat_NS').value = "";
        document.getElementById('lat_deg').value = "";
        document.getElementById('lat_min').value = "";
        document.getElementById('lat_sec').value = "";
        document.getElementById('lon_EW').value = "";
        document.getElementById('lon_deg').value = "";
        document.getElementById('lon_min').value = "";
        document.getElementById('lon_sec').value = "";
        document.getElementById('qth_loc').value = "";
        alert("Please enter a valid 4 or 6 characters QTH locator.");
        return(1);
    }

    if ((qth.length == 6) && (qth.charAt(4) < 'A') || (qth.charAt(4) > 'X') ||
        (qth.charAt(5) < 'A') || (qth.charAt(5) > 'X'))         // For 6 characters locators, make sure the last two are letters.
    {
        document.getElementById('lat_dec').value = "";
        document.getElementById('lon_dec').value = "";
        document.getElementById('lat_NS').value = "";
        document.getElementById('lat_deg').value = "";
        document.getElementById('lat_min').value = "";
        document.getElementById('lat_sec').value = "";
        document.getElementById('lon_EW').value = "";
        document.getElementById('lon_deg').value = "";
        document.getElementById('lon_min').value = "";
        document.getElementById('lon_sec').value = "";
        document.getElementById('qth_loc').value = "";
        alert("Please enter a valid 4 or 6 characters QTH locator.");
        return(1);
    }

    lat = str_chr_up.indexOf(qth.charAt(1)) * 10;               // 2nd digit: 10deg latitude slot.
    lon = str_chr_up.indexOf(qth.charAt(0)) * 20;               // 1st digit: 20deg longitude slot.
    lat += str_num.indexOf(qth.charAt(3)) * 1;                  // 4th digit: 1deg latitude slot.
    lon += str_num.indexOf(qth.charAt(2)) * 2;                  // 3rd digit: 2deg longitude slot.
    if (qth.length == 6)
    {
        lat += str_chr_up.indexOf(qth.charAt(5)) * 2.5 / 60;    // 6th digit: 2.5min latitude slot.
        lon += str_chr_up.indexOf(qth.charAt(4)) * 5 / 60;      // 5th digit: 5min longitude slot.
    }

    if (qth.length == 4)                                        // Get coordinates of the center of the square.
    {
        lat += 0.5 * 1;
        lon += 0.5 * 2;
    }
    else
    {
        lat += 0.5 * 2.5 / 60;
        lon += 0.5 * 5 / 60;
    }

    lat -= 90;                                                  // Locator lat/lon origin shift.
    lon -= 180;

    document.getElementById('lat_dec').value = lat.toFixed(3);  // Display result (rounded to 3 decimal digits).
    document.getElementById('lon_dec').value = lon.toFixed(3);

    deg = Math.floor(Math.abs(lat));                            // Convert latitude to deg/min/sec.
    min = Math.floor((Math.abs(lat) - deg) * 60);
    sec = Math.floor(((Math.abs(lat) - deg) * 60 - min) * 60);
    if (lat >= 0)
        document.getElementById('lat_NS').value = "N";
    else
        document.getElementById('lat_NS').value = "S";
    document.getElementById('lat_deg').value = deg;
    document.getElementById('lat_min').value = (min < 10 ? "0" : "") + min.toString();
    document.getElementById('lat_sec').value = (sec < 10 ? "0" : "") + sec.toString();

    deg = Math.floor(Math.abs(lon));                            // Convert longitude to deg/min/sec.
    min = Math.floor((Math.abs(lon) - deg) * 60);
    sec = Math.floor(((Math.abs(lon) - deg) * 60 - min) * 60);
    if (lon >= 0)
        document.getElementById('lon_EW').value = "E";
    else
        document.getElementById('lon_EW').value = "W";
    document.getElementById('lon_deg').value = deg;
    document.getElementById('lon_min').value = (min < 10 ? "0" : "") + min.toString();
    document.getElementById('lon_sec').value = (sec < 10 ? "0" : "") + sec.toString();

    return(0);
}



// --------------------------------------------------------------------------
// Geolocation functions.
// --------------------------------------------------------------------------



// This function, called by the "Get current location" button, will try to 
// find the current coordinates, if supported by the browser.
// If the browser supports geolocation, the function show_position() is 
// called, if not, show_error() is called instead.
function cmd_get_location()
{
    document.getElementById('lat_dec').value = "";              // Erase current coordinates.
    document.getElementById('lon_dec').value = "";

    document.getElementById('lat_NS').value = "";               // Erase corresponding results.
    document.getElementById('lat_deg').value = "";
    document.getElementById('lat_min').value = "";
    document.getElementById('lat_sec').value = "";

    document.getElementById('lon_EW').value = "";
    document.getElementById('lon_deg').value = "";
    document.getElementById('lon_min').value = "";
    document.getElementById('lon_sec').value = "";

    document.getElementById('qth_loc').value = "";

    if (navigator.geolocation)                                  // Check if geolocation is supported.
        navigator.geolocation.getCurrentPosition(show_position, show_error);
    else 
        window.alert("Geolocation is not supported by this browser.");
}



// --------------------------------------------------------------------------



// This function is called by the cmd_get_location() function only if the 
// browser supports geolocation. It updates the coordinates field with the
// current position and calculates the coordinate conversion.
function show_position(position)
{
    document.getElementById('lat_dec').value = position.coords.latitude.toFixed(6);
    document.getElementById('lon_dec').value = position.coords.longitude.toFixed(6);

    cmd_calculate_qth_dms();
}



// --------------------------------------------------------------------------



// This function is called by cmd_get_location() when an error occurred while
// determining the current location.
function show_error(error)
{
    switch(error.code) 
    {
        case error.PERMISSION_DENIED:
            window.alert("User denied the request for Geolocation.");
            break;
        case error.POSITION_UNAVAILABLE:
            window.alert("Location information is unavailable.");
            break;
        case error.TIMEOUT:
            window.alert("The request to get user location timed out.");
            break;
        case error.UNKNOWN_ERROR:
            window.alert("An unknown error occurred.");
            break;
    }
}



// --------------------------------------------------------------------------



// Init form values
document.getElementById('lat_NS').value = "N";
document.getElementById('lat_deg').value = "46";
document.getElementById('lat_min').value = "57";
document.getElementById('lat_sec').value = "04";

document.getElementById('lon_EW').value = "E";
document.getElementById('lon_deg').value = "7";
document.getElementById('lon_min').value = "26";
document.getElementById('lon_sec').value = "19";

document.getElementById('lat_dec').value = "";
document.getElementById('lon_dec').value = "";

document.getElementById('qth_loc').value = "";



// --------------------------------------------------------------------------

// -->
</script>


</body>
</html>
Diese Website verwendet nur für den Betrieb notwendige Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer sowie den Datenschutzbestimmungen zu. Wenn Sie nicht einverstanden sind, verlassen Sie die Website. Weitere Information
programmieren:amateurfunk (189 views) · Zuletzt geändert: 06/01/2022 13:45 von conny

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki