Visa ett inlägg
Oläst 2004-04-05, 17:28 #1
lorens lorens är inte uppkopplad
Nykomling
 
Reg.datum: Dec 2003
Inlägg: 24
lorens lorens är inte uppkopplad
Nykomling
 
Reg.datum: Dec 2003
Inlägg: 24
Hejsan...

Jag försöker räkna ut avståndet mellan två Long/Lat punkter men får inte fram avstånden som jag bör få fram! Vet inte vad jag gör fel...

Koden är baserad på följande formel: http://jan.ucc.nau.edu/~cvm/latlon_formula.html
(Fungerande avståndsräknare av samma person finns på http://jan.ucc.nau.edu/~cvm/latlongdist.html

Koden jag använder är följande:

Kod:
	// Define variables for the calculation
	$dist = 0; 	// Distance between source/destination
	$rad_km = 6378; // Earth Radius in kilometers
	$rad_smi = 3963.1;	// Earth Radius in statue miles
	$rad_nmi = 3443.9;	// Earth Radius in nautical miles

	// CONVERT LAT/LONG TO RADIANS!!!!!!!!!!!!!!!!!!!!!!!!!!!1
/*
Source Latitude: 373700N -- 37.6166666667
Source Longitude: 1222200W -- 122.366666667
Destination Latitude: 484400N -- 48.7333333333
Destination Longitude: 022300E -- 2.38333333333
*/
	$slat_deg = 37;
	$slat_min = 37;
	$slat_sec = 0;
	$slat_ns = "N";
	$slon_deg = 122;
	$slon_min = 22;
	$slon_sec = 0;
	$slon_we = "W";
	$dlat_deg = 48;
	$dlat_min = 44;
	$dlat_sec = 0;
	$dlat_ns = "N";
	$dlon_deg = 2;
	$dlon_min = 23;
	$dlon_sec = 0;
	$dlon_we = "E";

	$slat_dec = $slat_deg + ( ( $slat_min + ( $slat_sec / 60 ) ) / 60 );
	$slon_dec = $slon_deg + ( ( $slon_min + ( $slon_sec / 60 ) ) / 60 );
	$dlat_dec = $dlat_deg + ( ( $dlat_min + ( $dlat_sec / 60 ) ) / 60 );
	$dlon_dec = $dlon_deg + ( ( $dlon_min + ( $dlon_sec / 60 ) ) / 60 );
	if( $slat_ns == "S" OR $slat_ns == "s" ) {
 $slat_dec = $slat_dec * -1;
	}
	if( $dlat_ns == "S" OR $dlat_ns == "s" ) {
 $dlat_dec = $dlat_dec * -1;
	}
	if( $slon_we == "W" OR $slon_we == "w" ) {
 $slon_dec = $slon_dec * -1;
	}
	if( $dlon_we == "W" OR $dlon_we == "w" ) {
 $dlon_dec = $dlon_dec * -1;
	}
	$slat_rad = deg2rad( $slat_dec );
	$slon_rad = deg2rad( $slon_dec );
	$dlat_rad = deg2rad( $dlat_dec );
	$dlon_rad = deg2rad( $dlon_dec );

	echo "<p>slat: $slat_dec, slon: $slon_dec,".
 " dlat: $dlat_dec, dlon: $dlon_dec</p>";
	echo "<p>slat (rad): $slat_rad, slon (rad): $slon_rad,".
 " dlat (rad): $dlat_rad, dlon (rad): $dlon_rad</p>";

	$dist = acos(cos($slat_rad)*cos($dlat_rad)*cos($slon_rad)*cos($dlon_rad) + cos($slat_rad)*sin($dlat_rad)*cos($slon_rad)*sin($dlon_rad) + sin($slat_rad)*sin($slon_rad)) * $rad_km;
	echo "<p>Distance (Rad): $dist</p>";

	//	Arccos[
	// Cos[a1] Cos[b1] Cos[a2] Cos[b2] +
	// Cos[a1] Sin[b1] Cos[a2] Sin[b2] +
	// Sin[a1] Sin[a2]
	//	] * r
	// Testar ett annat sätt att skriva koden, ingen skillnad såklart!
	$dist2 = acos(
 ( cos( $slat_rad ) * cos( $dlat_rad ) * cos( $slon_rad ) * cos( $dlon_rad ) ) +
 ( cos( $slat_rad ) * sin( $dlat_rad ) * cos( $slon_rad ) * sin( $dlon_rad ) ) +
 ( sin( $slat_rad ) * sin( $slon_rad ) )
 ) * $rad_km;
	echo "<p>Distance 2 (Rad): $dist2</p>";

	// Testar Decimal istället för Radianer (det är fel, jag vet)
	$dist3 = acos(
 ( cos( $slat_dec ) * cos( $dlat_dec ) * cos( $slon_dec ) * cos( $dlon_dec ) ) +
 ( cos( $slat_dec ) * sin( $dlat_dec ) * cos( $slon_dec ) * sin( $dlon_dec ) ) +
 ( sin( $slat_dec ) * sin( $slon_dec ) )
 ) * $rad_km;
	echo "<p>Distance 3 (Dec): $dist3</p>";
Jag får fram följande resultat:
Citat:

Distance (Rad): 16021.2979554

Distance 2 (Rad): 16021.2979554

Distance 3 (Dec): 4920.09586293
Det jag bör få, enligt kalkylatorn på sidan jag nämde ovan är:

Citat:
Distance Calculation Results


Distance between 37 37' 0"N 122 22' 0"W and 48 44' 0"N 2 23' 0"E is
8987.2353 km

This calculation assumes the earth is a perfect sphere
with a radius of 6378.0 km
Någon som kan förklara vad jag gör fel?

Tacksam för svar

Mvh Lorens
lorens är inte uppkopplad   Svara med citatSvara med citat