Distanzberechnung

Malchor

Erfahrenes Mitglied
Hllo Gemeinde,
ich habe mal wieder eine Frage. Diessmal geht es um die Distanzberechnung zwischen zwei Orten an Hand von Lat und Lon. In meinem Fall geht es um die Distanz zwischen zwei Flughäfen. Ich habe schon vieles gegoogelt komme damit allerdings nicht zurecht, auch habe ich mir einiges zur Haversine-Formel durchgelesen.
Und das soll passieren. Man hat die Möglichkeit einen Flug aus einem Flugplan auszuwählen, dann wird man dort auf eine weitere Seite geleitet wo diverse Informationen zum Flug angegeben werden. Dort soll auch die Distanz angezweigt werden.

Die Struktur der einzelnen Tabellen:

Flughafen:
PHP:
CREATE TABLE IF NOT EXISTS `Flughafen` (
  `flughafenid` varchar(5) NOT NULL default '',
  `flughname` varchar(25) NOT NULL,
  `sid` text NOT NULL,
  `scenery` text NOT NULL,
  `landekosten` varchar(10) NOT NULL default '',
  `kateringkostenA` varchar(5) NOT NULL default '3.78',
  `kateringkostenB` varchar(5) NOT NULL default '5.88',
  `kateringkostenC` varchar(5) NOT NULL default '8.08',
  `kategorieindex` varchar(5) NOT NULL default '',
  `paxe` varchar(10) NOT NULL default '5000',
  `cargo` varchar(10) NOT NULL default '500000',
  `gatepax` varchar(10) NOT NULL COMMENT 'Gate Pax',
  `gatecargo` varchar(10) NOT NULL COMMENT 'Gate Cargo',
  `benutzung_arr` int(10) NOT NULL default '0',
  `benutzung_dep` int(10) NOT NULL default '0',
  `bemerkung` varchar(10) NOT NULL default '',
  `lat` varchar(100) NOT NULL COMMENT 'Breite',
  `lon` varchar(100) NOT NULL COMMENT 'Länge',
  PRIMARY KEY  (`flughafenid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Flugplan:
PHP:
CREATE TABLE IF NOT EXISTS `Flugplan` (
  `flugnummer` varchar(12) NOT NULL default '',
  `registrierung` varchar(8) NOT NULL,
  `flugzeug_id` varchar(10) NOT NULL,
  `hersteller_name` varchar(20) NOT NULL,
  `comment_charter` varchar(640) NOT NULL,
  `comment` varchar(640) NOT NULL,
  `paxe` varchar(10) NOT NULL,
  `timestamp` varchar(30) NOT NULL,
  `flughafenid1` varchar(5) NOT NULL default '',
  `alt1` text NOT NULL,
  `dep_time` varchar(10) NOT NULL default '',
  `flughafenid2` varchar(5) NOT NULL default '',
  `arr_time` varchar(8) NOT NULL,
  `alt2` text NOT NULL,
  `via` varchar(5) NOT NULL,
  `days` varchar(10) NOT NULL default '',
  `company` varchar(4) NOT NULL default '',
  `gebucht` char(2) NOT NULL default 'F',
  `pilotid` varchar(30) NOT NULL,
  `zeit` varchar(14) NOT NULL default '',
  `date` date NOT NULL default '0000-00-00',
  `benutzung` varchar(10) NOT NULL default '',
  PRIMARY KEY  (`flugnummer`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Der Quelltext den ich bisher gebastelt habe:
PHP:
Fluginfo
<?php 
$flugnummer = isset($_GET['flugnummer']) ? $_GET['flugnummer'] : null;  
$abfrage = "SELECT 
										`piloten`.`pilot_id` , 
					`Flugplan`.`flughafenid1` , 
					`Flugplan`.`dep_time` , 
					`Flugplan`.`flughafenid2` , 
					`Flugplan`.`arr_time` , 			
					`Flugplan`.`flugnummer`,
					`Flugplan`.`days`,
					`Flugplan`.`registrierung`,
					`Flugplan`.`hersteller_name`,
					`Flugplan`.`comment_charter`,
					`Flugplan`.`gebucht`,
					`Flugplan`.`pilotid`,
					`Flughafen`.`flughafenid`,
					`Flughafen`.`lat`,	
					`Flughafen`.`lon`
 FROM 
 					piloten,
					Flughafen, 
					Flugplan 
WHERE 
					(pilot_id = '$pilot_id') AND(flughafenid1 = 'flughafenid') AND(flughafenid2 = 'flughafenid')";
$ergebnis = mysql_query($abfrage);
echo "$flugnummer";
if ($ergebnis)
	

{
	   print "<table border=\"0\" cellspacing=\"2\" ".
	   "cellpadding=\"5\" WIDTH=\"63\%\" class=\"tableLine\">\n";

	   
	   
	   while ($dataset = mysql_fetch_array($ergebnis))

           {
	    print "<tr>";
	    print "<td>Flugnummer:</td><td>".$dataset['flugnummer']."</td><td></td><td></td><td></td>
		</tr>";;  
		print "<tr>";
		print "<td>Abflug:</td><td>".$dataset['flughafenid1']."&nbsp;"."</td><td></td><td>Ankunft:</td><td>".$dataset['flughafenid2']."&nbsp;"."</td>
		</tr>";; 
	    print "<tr>";
		print "<td>Abflugzeit:</td><td>".$dataset['dep_time']."</td><td></td><td></td><td></td>
		</tr>";; 
		print "<tr>";
		print "<td></td><td></td><td></td><td>Ankunftszeit:</td><td>".$dataset['arr_time']."</td>
		</tr>";; 
		print "<td>Flungtage:</td><td>".$dataset['days']."&nbsp;"."</td><td></td><td>Regestrierung:</td><td>".$dataset['registrierung']."&nbsp;"."</td>
		</tr>";; 
		print "<tr>";
	    print "<td>Route:</td><td colspan=\"4\">".$dataset['route']."&nbsp;"."</td>
		</tr>";;
		print "<tr>";
	    print "<td></td><td></td><td></td><td></td><td></td>
		</tr>";;
        print "<tr>";
	    print "<td>Anmerkung:</td><td colspan=\"4\">".$dataset['comment_charter']."&nbsp;"."</td>
		</tr>";;  

	     	}
	print "</td></tr>\n";
	print "</table>\n";
      }

?>

Kann mir jmd. helfen wie ich dort eine Distanzberechnung hinein bekomme.
 
Wenn ich mich recht entsinne müsstest du so eine Funktion einbauen um auf einer Sphäre Entfernungen zu messen:
Code:
round ( 
   Erdumfang * acos( 
      cos( rad( lat1 ) ) * cos( rad( lat2 ) ) + sin( rad( lat1 ) ) * sin( rad( lat2 ) ) * cos( rad( lon1 - lon2 ) )
   ) ) / 2 / PI
) => Entfernung in km

Ich hoffe, ich hab mich nicht vertan.

Edit: Die Entfernung ist natürlich Luftlinie.
 
Du musst auf die Tabelle "Flughafen" zwei Queries ausführen, den ersten, der die Latitude und Longitude vom ersten Flughafen und den zweiten dito abholt. Dann hast du lat1, lat2, lon1 und lon2. Du müsstest du in die Formel einbinden. Du könntest auch einen komplizierten SELECT absetzen, was ich hier aber nicht empfehle.

Zuerst solltest du aus einem SELECT die lat und lon entfernen. Innerhalb der while-Schleife machst du dann die beiden SELECT auf Flughafen. Mit den Results kannst du die Formel füttern.
 
So schwer ist das nicht. Du hast alles was du brauchst:

PHP:
<?php 
function calculate_spheric_distance($lat1, $lat2, $lon1, $lon2)
{
	// Die Implementierung überlasse ich dir
	return $distance;
}

$flugnummer = isset($_GET['flugnummer']) ? $_GET['flugnummer'] : null;  
$abfrage = "SELECT 
                                        `piloten`.`pilot_id` , 
                    `Flugplan`.`flughafenid1` , 
                    `Flugplan`.`dep_time` , 
                    `Flugplan`.`flughafenid2` , 
                    `Flugplan`.`arr_time` ,             
                    `Flugplan`.`flugnummer`,
                    `Flugplan`.`days`,
                    `Flugplan`.`registrierung`,
                    `Flugplan`.`hersteller_name`,
                    `Flugplan`.`comment_charter`,
                    `Flugplan`.`gebucht`,
                    `Flugplan`.`pilotid`,
 FROM 
                     piloten,
                    Flughafen, 
                    Flugplan 
WHERE 
                    (pilot_id = '$pilot_id') AND(flughafenid1 = 'flughafenid') AND(flughafenid2 = 'flughafenid')";
$ergebnis = mysql_query($abfrage);
echo "$flugnummer";
if ($ergebnis)
{
	     // Geo-Koordinaten der Flughäfen besorgen
			 $airport1Query = sprintf("SELECT lat,lon FROM Flughafen WHERE flughafenid = '%s'", $flughafenid1);
			 $airport2Query = sprintf("SELECT lat,lon FROM Flughafen WHERE flughafenid = '%s'", $flughafenid2);
			 
			 $airport1Result = mysql_query($airport1Query) or die( mysql_error() ); 
			 $airport2Result = mysql_query($airport2Query) or die( mysql_error() ); 
			 
			 $airport1Data   = mysql_fetch_assoc($airport1Result);
			 $airport2Data	 = mysql_fetch_assoc($airport2Result);
			 
			 $lat1 = $airport1Data['lat'];
			 $lat2 = $airport2Data['lat'];
			 $lon1 = $airport1Data['lon'];
			 $lon2 = $airport2Data['lon'];
	     // Fertig: Geo-Koordinaten der Flughäfen besorgen
	     
			 $entfernung = calculate_spheric_distance($lat1, $lat2, $lon1, $lon2);
			 
       print "<table border=\"0\" cellspacing=\"2\" ".
       "cellpadding=\"5\" WIDTH=\"63\%\" class=\"tableLine\">\n";

       
       
       while ($dataset = mysql_fetch_array($ergebnis))

           {
        print "<tr>";
        print "<td>Flugnummer:</td><td>".$dataset['flugnummer']."</td><td></td><td></td><td></td>
        </tr>";;  
        print "<tr>";
        print "<td>Abflug:</td><td>".$dataset['flughafenid1']."&nbsp;"."</td><td></td><td>Ankunft:</td><td>".$dataset['flughafenid2']."&nbsp;"."</td>
        </tr>";; 
        print "<tr>";
        print "<td>Abflugzeit:</td><td>".$dataset['dep_time']."</td><td></td><td></td><td></td>
        </tr>";; 
        print "<tr>";
        print "<td></td><td></td><td></td><td>Ankunftszeit:</td><td>".$dataset['arr_time']."</td>
        </tr>";; 
        print "<td>Flungtage:</td><td>".$dataset['days']."&nbsp;"."</td><td></td><td>Regestrierung:</td><td>".$dataset['registrierung']."&nbsp;"."</td>
        </tr>";; 
        print "<tr>";
        print "<td>Route:</td><td colspan=\"4\">".$dataset['route']."&nbsp;"."</td>
        </tr>";;
        print "<tr>";
        print "<td></td><td></td><td></td><td></td><td></td>
        </tr>";;
        print "<tr>";
        print "<td>Anmerkung:</td><td colspan=\"4\">".$dataset['comment_charter']."&nbsp;"."</td>
        </tr>";;  

             }
    print "</td></tr>\n";
    print "</table>\n";
      }
 
Ich habe es probiert, leider zeigt er es nicht an mit der Entfernung!

PHP:
<?php 
function calculate_spheric_distance($lat1, $lat2, $lon1, $lon2)
{
    // Die Implementierung überlasse ich dir
    return $distance;
}
 
$flugnummer = isset($_GET['flugnummer']) ? $_GET['flugnummer'] : null;  
$abfrage = "SELECT 
                                        `piloten`.`pilot_id` , 
                    `Flugplan`.`flughafenid1` , 
                    `Flugplan`.`dep_time` , 
                    `Flugplan`.`flughafenid2` , 
                    `Flugplan`.`arr_time` ,             
                    `Flugplan`.`flugnummer`,
                    `Flugplan`.`days`,
                    `Flugplan`.`registrierung`,
                    `Flugplan`.`hersteller_name`,
                    `Flugplan`.`comment_charter`,
                    `Flugplan`.`gebucht`,
                    `Flugplan`.`pilotid`,
 FROM 
                     piloten,
                    Flughafen, 
                    Flugplan 
WHERE 
                    (pilot_id = '$pilot_id') AND(flughafenid1 = 'flughafenid') AND(flughafenid2 = 'flughafenid')";
$ergebnis = mysql_query($abfrage);
echo "$flugnummer";
if ($ergebnis)
{
         // Geo-Koordinaten der Flughäfen besorgen
             $airport1Query = sprintf("SELECT lat,lon FROM Flughafen WHERE flughafenid = '%s'", $flughafenid1);
             $airport2Query = sprintf("SELECT lat,lon FROM Flughafen WHERE flughafenid = '%s'", $flughafenid2);
             
             $airport1Result = mysql_query($airport1Query) or die( mysql_error() ); 
             $airport2Result = mysql_query($airport2Query) or die( mysql_error() ); 
             
             $airport1Data   = mysql_fetch_assoc($airport1Result);
             $airport2Data   = mysql_fetch_assoc($airport2Result);
             
             $lat1 = $airport1Data['lat'];
             $lat2 = $airport2Data['lat'];
             $lon1 = $airport1Data['lon'];
             $lon2 = $airport2Data['lon'];
         // Fertig: Geo-Koordinaten der Flughäfen besorgen
         
             $entfernung = calculate_spheric_distance($lat1, $lat2, $lon1, $lon2);
             
       print "<table border=\"0\" cellspacing=\"2\" ".
       "cellpadding=\"5\" WIDTH=\"63\%\" class=\"tableLine\">\n";
 
       
       
       while ($dataset = mysql_fetch_array($ergebnis))
 
           {
        print "<tr>";
        print "<td>Flugnummer:</td><td>".$dataset['flugnummer']."</td><td></td><td></td><td></td>
        </tr>";;  
        print "<tr>";
        print "<td>Abflug:</td><td>".$dataset['flughafenid1']."&nbsp;"."</td><td></td><td>Ankunft:</td><td>".$dataset['flughafenid2']."&nbsp;"."</td>
        </tr>";; 
        print "<tr>";
        print "<td>Abflugzeit:</td><td>".$dataset['dep_time']."</td><td></td><td></td><td></td>
        </tr>";; 
        print "<tr>";
        print "<td></td><td></td><td></td><td>Ankunftszeit:</td><td>".$dataset['arr_time']."</td>
        </tr>";; 
        print "<td>Flungtage:</td><td>".$dataset['days']."&nbsp;"."</td><td></td><td>Regestrierung:</td><td>".$dataset['registrierung']."&nbsp;"."</td>
        </tr>";; 
        print "<tr>";
        print "<td>Route:</td><td colspan=\"4\">".$dataset['route']."&nbsp;"."</td>
        </tr>";;
        print "<tr>";
        print "<td></td><td></td><td></td><td></td><td></td>
        </tr>";;
        print "<tr>";
        print "<td>Anmerkung:</td><td colspan=\"4\">".$dataset['comment_charter']."&nbsp;"."</td>
        </tr>";;
		print "<tr>";
        print "<td>Anmerkung:</td><td colspan=\"4\">".$dataset['$entfernung']."&nbsp;"."</td>
        </tr>";;   
 
             }
    print "</td></tr>\n";
    print "</table>\n";
      }?>
 
$dataset['entfernung'] ist nirgends definiert. Die richtige Variable dafür wäre $entfernung. Außerdem musst du noch den Code der Funktion calculate_spheric_distance() einbauen. Da steht extra ein Kommentar drin, das die Implementierung dir überlassen ist.
 
du müsstest sie auch erst mal mit Code füllen. Bisher hat sie ja nur einen namen ;)
Pack die Formel in die Function, füge long, lat usw ein und fertig.
 
Zurück