topical media & game development
lib-js-math-calculator-latlong.htm / htm
<!-- TWO STEPS TO INSTALL LATITUDE-LONGITUDE CONVERTER:
1. Copy the coding into the HEAD of your HTML document
2. Add the last code into the BODY of your HTML document -->
<!-- STEP ONE: Paste this code into the HEAD of your HTML document -->
<HEAD>
<script type="text/javascript">
<!--
/* This script and many more are available free online at
The JavaScript Source!! http://javascript.internet.com
Created by: Joe Ho */
function calc(Location) {
// Retrieve the DD/DMS option
for (var i=0;i<Location.inputType.length;i++) {
if (Location.inputType[i].checked)
{
var inputed = Location.inputType[i].value;
}
}
if (inputed == "DD")
{
// Retrieve Lat and Lon information
var lat = Location.Latitude.value;
var lon = Location.Longitude.value;
if (lat==null)
var lat=0;
if (lon==null)
var lon=0;
// Check if any error occurred
if (isNaN(Location.Latitude.value) || isNaN(Location.Longitude.value)) {
alert("Latitude and Longitude must be numeric");
} else if (lat < -90 || lat > 90 || lon < -180 || lon > 180) {
alert("ERROR");
} else {
//Retrieve the latitude direction for Degrees Decimal
for (var i=0;i<Location.LatDirect.length;i++) {
if (Location.LatDirect[i].checked)
{
var LatDirect = Location.LatDirect[i].value;
}
}
// If the user does not click direct button,
// then a positive latitude value regards North, negative latitude value regards South
if (LatDirect==null) {
if (lat<0) {
LatDirect = "S";
Location.LatDirect[1].click();
}
else {
LatDirect ="N";
Location.LatDirect[0].click();
}
}
// Retrieve the longitude direction for Deg/Min/Sec
for (var i=0;i<Location.LonDirect.length;i++) {
if (Location.LonDirect[i].checked)
{
var LonDirect = Location.LonDirect[i].value;
}
}
// If the user does not click direct button,
// then a positive latitude value regards East, negative latitude value regards West
if (LonDirect==null) {
if (lon<0) {
LonDirect = "W";
Location.LonDirect[1].click();
}
else {
LonDirect ="E";
Location.LonDirect[0].click();
}
}
// Change to absolute value
lat = Math.abs(lat);
lon = Math.abs(lon);
Location.Latitude.value=lat;
Location.Longitude.value=lon;
setAllEnabled(Location);
// Convert to Degree Minutes Seconds Representation
LatDeg = Math.floor(lat);
LatMin = Math.floor((lat-LatDeg)*60);
LatSec = (Math.round((((lat - LatDeg) - (LatMin/60)) * 60 * 60) * 100) / 100 ) ;
LonDeg = Math.floor(lon);
LonMin = Math.floor((lon-LonDeg)*60);
LonSec = (Math.round((((lon - LonDeg) - (LonMin / 60 )) * 60 * 60) * 100 ) / 100);
// Copy result to the board
Location.LatDeg.value=LatDeg;
Location.LatMin.value=LatMin;
Location.LatSec.value=LatSec;
Location.LonDeg.value=LonDeg;
Location.LonMin.value=LonMin;
Location.LonSec.value=LonSec;
if (LatDirect == "N") {
Location.LatDMSDirect[0].click();
} else {
Location.LatDMSDirect[1].click();
}
if (LonDirect == "E") {
Location.LonDMSDirect[0].click();
} else {
Location.LonDMSDirect[1].click();
}
clickedOption(Location);
// Find the farthest Point Location
farthestPoint(lat,lon,LatDeg,LonDeg,LatMin,LonMin,LatSec,LonSec,LatDirect,LonDirect);
}
} else if (inputed == "DMS") {
// Retrieve Lat and Lon information
var LatDeg = Location.LatDeg.value;
var LatMin = Location.LatMin.value;
var LatSec = Location.LatSec.value;
var LonDeg = Location.LonDeg.value;
var LonMin = Location.LonMin.value;
var LonSec = Location.LonSec.value;
// Assume the value to be zero if the user does not enter value
if (LatDeg==null)
LatDeg=0;
if (LatMin==null) {
LatMin=0;
}
if (LatSec==null) {
LatSec=0;
}
if (LonDeg==null)
LonDeg=0;
if (LonMin==null) {
LonMin=0
}
if (LonSec==null){
LonSec=0;
}
// Check if any error occurred
if (isNaN(Location.LatDeg.value) || isNaN(Location.LonDeg.value) || isNaN(Location.LatMin.value) || isNaN(Location.LonMin.value) || isNaN(Location.LatSec.value) || isNaN(Location.LonSec.value)) {
alert("Latitude and Longitude must be numeric");
} else if (LatDeg != Math.round(LatDeg) || LonDeg != Math.round(LonDeg) || LatMin != Math.round(LatMin) || LonMin != Math.round(LonMin)) {
alert("ERROR");
} else if (LatDeg < -90 || LatDeg > 90 || LonDeg < -180 || LonDeg > 180 || LatMin < -60 || LatMin > 60 || LonMin < -60 || LonMin > 60 || LatSec < -60 || LatSec > 60 || LonSec < -60 || LonSec > 60) {
alert("ERROR");
} else {
// If no error, then go on
// Retrieve the latitude direction for Degrees Decimal
for (var i=0;i<Location.LatDMSDirect.length;i++) {
if (Location.LatDMSDirect[i].checked)
{
var LatDMSDirect = Location.LatDMSDirect[i].value;
}
}
// If the user does not click direct button,
// then a postive latitude value regards North, negative latitude value regards South
if (LatDMSDirect==null) {
if (LatDeg<0 || Location.LatDeg.value=="-0") {
LatDMSDirect = "S";
Location.LatDMSDirect[1].click();
}
else {
LatDMSDirect ="N";
Location.LatDMSDirect[0].click();
}
}
// Retrieve the longitude direction for Deg/Min/Sec
for (var i=0;i<Location.LonDMSDirect.length;i++) {
if (Location.LonDMSDirect[i].checked)
{
var LonDMSDirect = Location.LonDMSDirect[i].value;
}
}
// If the user does not click direct button,
// then a positive latitude value regards East, negative latitude value regards West
if (LonDMSDirect==null) {
if (LonDeg<0 || Location.LonDeg.value=="-0") {
LonDMSDirect = "W";
Location.LonDMSDirect[1].click();
} else {
LonDMSDirect ="E";
Location.LonDMSDirect[0].click();
}
}
// Change to absolute value
LatDeg = Math.abs(LatDeg);
LonDeg = Math.abs(LonDeg);
LatMin = Math.abs(LatMin);
LonMin = Math.abs(LonMin);
LatSec = Math.abs(LatSec);
LonSec = Math.abs(LonSec);
setAllEnabled(Location);
// Convert to Decimal Degrees Representation
var lat = LatDeg + (LatMin/60) + (LatSec / 60 / 60);
var lon = LonDeg + (LonMin/60) + (LonSec / 60 / 60);
if ( lat <= 90 && lon <= 180 && lat >=0 && lon >= 0 )
{
// Copy the absolute value to the board
Location.LatDeg.value=LatDeg;
Location.LonDeg.value=LonDeg;
Location.LatMin.value=LatMin;
Location.LonMin.value=LonMin;
Location.LatSec.value=LatSec;
Location.LonSec.value=LonSec;
// Rounding off
lat = (Math.round(lat*1000000)/1000000);
lon = (Math.round(lon*1000000)/1000000);
// Copy result to the board
Location.Latitude.value=lat;
Location.Longitude.value=lon;
if (LatDMSDirect == "N") {
Location.LatDirect[0].click();
} else {
Location.LatDirect[1].click();
}
if (LonDMSDirect == "E") {
Location.LonDirect[0].click();
} else {
Location.LonDirect[1].click();
}
clickedOption(Location);
farthestPoint(lat,lon,LatDeg,LonDeg,LatMin,LonMin,LatSec,LonSec,LatDMSDirect,LonDMSDirect);
} else
alert("ERROR!!");
}
}
}
function clickedOption(Location) {
// Retrieve The DD/DMS Option
for (var i=0;i<Location.inputType.length;i++) {
if (Location.inputType[i].checked)
{
var inputed = Location.inputType[i].value;
}
}
changeOption(Location,inputed);
}
function resetForm(Location) {
changeOption(Location,"DD");
}
function changeOption(Location,inputed) {
if (inputed=="DD") {
with (Location) {
LatDeg.disabled=true;
LonDeg.disabled=true;
LatMin.disabled=true;
LonMin.disabled=true;
LatSec.disabled=true;
LonSec.disabled=true;
Latitude.disabled=false;
Longitude.disabled=false;
LatDirect[0].disabled=false;
LonDirect[0].disabled=false;
LatDirect[1].disabled=false;
LonDirect[1].disabled=false;
LatDMSDirect[0].disabled=true;
LonDMSDirect[0].disabled=true;
LatDMSDirect[1].disabled=true;
LonDMSDirect[1].disabled=true;
}
} else if (inputed =="DMS") {
with (Location){
Latitude.disabled=true;
Longitude.disabled=true;
LatDeg.disabled=false;
LonDeg.disabled=false;
LatMin.disabled=false;
LonMin.disabled=false;
LatSec.disabled=false;
LonSec.disabled=false;
LatDMSDirect[0].disabled=false;
LonDMSDirect[0].disabled=false;
LatDMSDirect[1].disabled=false;
LonDMSDirect[1].disabled=false;
LatDirect[0].disabled=true;
LonDirect[0].disabled=true;
LatDirect[1].disabled=true;
LonDirect[1].disabled=true;
}
}
}
function setAllEnabled(Location) {
with (Location) {
Latitude.disabled=false;
Longitude.disabled=false;
LatDeg.disabled=false;
LonDeg.disabled=false;
LatMin.disabled=false;
LonMin.disabled=false;
LatSec.disabled=false;
LonSec.disabled=false;
LatDMSDirect[0].disabled=false;
LonDMSDirect[0].disabled=false;
LatDMSDirect[1].disabled=false;
LonDMSDirect[1].disabled=false;
LatDirect[0].disabled=false;
LonDirect[0].disabled=false;
LatDirect[1].disabled=false;
LonDirect[1].disabled=false;
}
}
function farthestPoint(lat,lon,LatDeg,LonDeg,LatMin,LonMin,LatSec,LonSec,LatDirect,LonDirect) {
var farLat,farLon,farLat2,farLon2,farLatDeg,farLonDeg;
var farLatMin,farLonMin,farLatSec,farLonSec,farLatDirect,farLonDirect;
var dist;
if (LatDirect == "N") {
farLatDirect = "S";
} else {
farLatDirect = "N";
}
if (LonDirect == "E") {
farLonDirect = "W";
} else {
farLonDirect = "E";
}
farLat = lat;
farLatDeg = LatDeg;
farLatMin = LatMin;
farLatSec = LatSec;
farLon = 180 - Math.abs(lon);
// Method 1
farLonDeg = Math.floor(farLon);
farLonMin = Math.floor((farLon-farLonDeg)*60);
farLonSec = (Math.round((((farLon - farLonDeg) - (farLonMin / 60 )) * 60 * 60) * 100 ) / 100);
// Method 2
/*
farLonSec = 60 - LonSec;
if (farLonSec == 60) {
farLonSec=0;
}
if (farLonSec >0) {
farLonMin = 60 - LonMin - 1;
} else {
farLonMin = 60 - LonMin ;
}
if (farLonMin ==60) {
farLonMin =0;
}
if (farLonMin >0) {
farLonDeg = 180 - Math.abs(farLonDeg) - 1;
} else {
farLonDeg = 180 - Math.abs(farLonDeg);
}
*/
farLon = Math.round(farLon*1000000)/1000000;
farLonSec = Math.round(farLonSec*100)/100;
elev = 200;
farElev = 200;
var dist = distance(lat,LatDirect,lon,LonDirect,elev,farLat,farLatDirect,farLon,farLonDirect,farElev);
var alertMsg="";
alertMsg+=("The location you entered is : " + "\n\n" +
"Latitude: " + lat + " " + LatDirect + "\n" + "Degrees: " + LatDeg + " Minutes: " + LatMin + " Seconds: " + LatSec + " " + LatDirect + "\n\n" +
"Longitude: " + lon + " " + LonDirect + "\n" + "Degrees: " + LonDeg + " Minutes: " + LonMin + " Seconds: " + LonSec + " " + LonDirect + "\n\n" +
"---------------------------------------------------------------" + "\n");
alertMsg+=("The farthest location from the point you entered is : " + "\n\n" +
"Latitude: " + farLat + " " + farLatDirect + "\n" + "Degrees: " + farLatDeg + " Minutes: " + farLatMin + " Seconds: " + farLatSec + " " + farLatDirect + "\n\n" +
"Longitude: " + farLon + " " + farLonDirect + "\n" + "Degrees: " + farLonDeg + " Minutes: " + farLonMin + " Seconds: " + farLonSec + " " + farLonDirect + "\n\n");
alertMsg+=("---------------------------------------------------------------" + "\n");
alertMsg+=("Distance: " + dist + " km ");
alert(alertMsg);
}
function distance(lat,LatDirect,lon,LonDirect,elev,lat2,ptDirect,lon2,ptLonDirect,ptElev) {
var radLat,radLon,radLat2,radLon2;
if (ptDirect == "S")
lat2 = lat2*-1;
if (ptLonDirect == "W")
lon2 = lon2*-1;
if (LatDirect == "S")
lat = lat*-1;
if (LonDirect == "W")
lon = lon*-1;
var radian = 180/Math.PI;
radLat=lat/radian;
radLon=lon/radian;
radLat2=lat2/radian;
radLon2=lon2/radian;
var dist = calcDistance(radLat,radLon,elev,radLat2,radLon2,ptElev);
dist = Math.round(dist*100)/100;
return dist;
}
// calculate the distance between two coordinates
function calcDistance(lat1,long1,elev,lat2,long2,ptElev) {
var earthEquatorialRadius = 6378.14; // in kilometers
var earthFlattened = 1/298.257;
var exCentricityEarth = 0.08181922;
var radian = 180/Math.PI;
meanPosLat = (lat1+lat2)/2;
meanNegLat = (lat1-lat2)/2;
lambda = (long1-long2)/2;
with(Math) {
si = pow(sin(meanNegLat)*cos(lambda),2)+pow(cos(meanPosLat)*sin(lambda),2);
co = pow(cos(meanNegLat)*cos(lambda),2)+pow(sin(meanPosLat)*sin(lambda),2);
delta = atan(sqrt(si/co));
ra = sqrt(si*co)/delta;
di = 2*delta*earthEquatorialRadius;
ha =(3*ra-1)/2/co;
hb =(3*ra+1)/2/si;
distances = di*(1+earthFlattened*ha*pow(sin(meanPosLat)*cos(meanNegLat),2)-earthFlattened*hb*pow(cos(meanPosLat)*sin(meanNegLat),2));
}
// Taking elevation into consideration
var totalElev, elevDist
totalElevDist = Math.abs(elev - ptElev);
// Convert back to km
totalElevDist = totalElevDist / 1000;
elevDist = Math.sqrt((distances * distances) + (totalElevDist * totalElevDist));
return elevDist;
}
// -->
</script>
</HEAD>
<!-- STEP TWO: Copy this code into the BODY of your HTML document -->
<BODY>
<div id="demo">
<form name="Locations">
<input class="script" type="radio" name="inputType" value="DD" checked onclick="clickedOption(this.form)"> <strong>Degrees Decimal</strong>
<br>Latitude : <input class="script" name="Latitude" type="text" size="5"> North <input class="script" type="radio" name="LatDirect" value="N"> South <input class="script" type="radio" name="LatDirect" value="S">
<br>Longitude: <input class="script" name="Longitude" type="text" size="5"> East <input class="script" type="radio" name="LonDirect" value="E"> West <input class="script" type="radio" name="LonDirect" value="W">
<br>
<br><input class="script" type="radio" name="inputType" value="DMS" onclick="clickedOption(this.form)"> <strong>Degrees, Minutes, & Seconds</strong>
<br><strong>Latitude:</strong>
<br>Degrees: <input class="script" name="LatDeg" type="text" size="5" disabled> Minutes: <input class="script" name="LatMin" type="text" size="5" disabled> Seconds: <input class="script" name="LatSec" type="text" size="5" disabled>
<br> North <input class="script" type="radio" name="LatDMSDirect" value="N" disabled> South <input class="script" type="radio" name="LatDMSDirect" value="S" disabled>
<br><strong>Longitude:</strong>
<br>Degrees: <input class="script" name="LonDeg" type="text" size="5" disabled> Minutes: <input class="script" name="LonMin" type="text" size="5" disabled> Seconds: <input class="script" name="LonSec" type="text" size="5" disabled>
<br> East <input class="script" type="radio" name="LonDMSDirect" value="E" disabled> West <input class="script" type="radio" name="LonDMSDirect" value="W" disabled>
<br><br><input class="script" value="Calculate" type="button" onclick="calc(this.form)">
<input class="script" name="Reset" type="reset" value="Clear" onclick="resetForm(this.form)">
</form>
</div>
<p><center>
<font face="arial, helvetica" size"-2">Free JavaScripts provided<br>
by <a href="http://javascriptsource.com">The JavaScript Source</a></font>
</center><p>
<!-- Script Size: 16.48 KB -->
(C) Æliens
20/2/2008
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.