Archiv verlassen und diese Seite im Standarddesign anzeigen : Distanzberechnung zweier Orte über Längen und Breitengrade
Ich habe mal eine Frage, ich bin, wie einigen ja sicher schon bekannt, noch ein relativer Anfänger. Ich habe bereits zu diesem Thema gegoogelt, aber leider noch nicht wirklich was hilfreiches gefunden.
Ich möchte die Distanz zwischen zwei Orten, in meinem Fall zwei Airports ausrechnen lassen via PHP und diese dann von Kilometern in nm (nortische Meilen) umwandeln.
In der Datenbank habe ich bereits die Tabellengeschaffen und gefüllt für die Koordinaten.
flughafenid (http://sys.ws1.optimate-server.de/phpMyAdmin/sql.php?db=usr_web183_1&table=Flughafen&sql_query=SELECT+%2A+FROM+%60Flughafen%60+ORDER+BY+%60Flughafen%60.%60flughafenid%60+ASC&token=647207f664272d1b79f3cad060c89250) flughname (http://sys.ws1.optimate-server.de/phpMyAdmin/sql.php?db=usr_web183_1&table=Flughafen&sql_query=SELECT+%2A+FROM+%60Flughafen%60+ORDER+BY+%60Flughafen%60.%60flughname%60+ASC&token=647207f664272d1b79f3cad060c89250) lat (http://sys.ws1.optimate-server.de/phpMyAdmin/sql.php?db=usr_web183_1&table=Flughafen&sql_query=SELECT+%2A+FROM+%60Flughafen%60+ORDER+BY+%60Flughafen%60.%60lat%60+ASC&token=647207f664272d1b79f3cad060c89250) Breite lon (http://sys.ws1.optimate-server.de/phpMyAdmin/sql.php?db=usr_web183_1&table=Flughafen&sql_query=SELECT+%2A+FROM+%60Flughafen%60+ORDER+BY+%60Flughafen%60.%60lon%60+ASC&token=647207f664272d1b79f3cad060c89250) Länge
EBAW Antwerp 51.1894 4.4602
EBBE Beauvechain 50.7586 4.7683
Leider habe ich nicht den blassesten Schimmer wie ich das umsetzen soll. Da ich ja die Distanz zu einem anderen Airport haben möchte muss ich ja beide Koordinaten irgendwie einbauen.
Kann mir jemand verraten wie man das macht oder mir ein idotensicheres Tutorial geben?
Wäre super dankbar
Dafür gibt es zum Beispiel die Haversine-Formel. Einfach mal nach Googlen, ist recht easy umzusetzen …*bzw. gibts schon tausend mal als Snippet.
Dasheißt ich arbeite nur mit diesen Daten?
aber wie bekomme ich da die beiden Städte so deffiniert da sie beide in der flughafeb_id Spalte stehen!
dlon = B_lon - A_lon
dlat = B_lat - A_lat
a = (sin(dlat/2))^2 + cos(A_lat) * cos(B_lat) * (sin(dlon/2))^2
c = 2 * arcsin(min(1,sqrt(a)))
d = R * c
(R = Erdradius)
Was? Bitte gib dir etwas mehr Mühe beim beschreiben deines Problems. Ich weiß gar nicht, was für Städte du plötzlich meinst und was die Spalte "flughafenb_id" sein soll …
Was? Bitte gib dir etwas mehr Mühe beim beschreiben deines Problems. Ich weiß gar nicht, was für Städte du plötzlich meinst und was die Spalte "flughafenb_id" sein soll …
Also wie oben geschrieben möchte ich die Distanz zweier Flughäfen zueinander ausrechen lassen.
Das oben ist ein Auszug aus der Datenbank!
der PHP Code in den ich das einbauen möchte lautet wie folgt:
<?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` FROM piloten, Flugplan WHERE(pilot_id = '$pilot_id') AND(flugnummer = '$flugnummer')";
$ergebnis = mysql_query($abfrage);
if ($ergebnis)
{
print "<table border=\"0\" cellspacing=\"2\" ".
"cellpadding=\"5\" WIDTH=\"75\%\" class=\"tableLine\">\n";
print "<tr><th>Flugnummer</th><th>Abflugzeit</th><th>Zielflughafen</th>";
print "<th>Ankunftszeit</th><th>Flugtage</th><th>Flugzeugregistrierung</th><th>Flugzeug</th></tr>\n";
while ($dataset = mysql_fetch_array($ergebnis))
{
print "<tr>";
print "<td>".$dataset['flugnummer']."</a> "."</td>";
print "<td>".$dataset['dep_time']."</td>";
print "<td>".$dataset['flughafenid2']." "."</td>";
print "<td>".$dataset['arr_time']." "."</td>";
print "<td>".$dataset['days']." "."</td>";
print "<td>".$dataset['registrierung']." "."</td>";
print "<td>".$dataset['hersteller_name']." "."</td>";
print "</tr>\n";
}
print "</td></tr>\n";
print "</table>\n";
}
?>Und da ich ja weils die Abkürzung in der Flugäfen in derTabelle Flughafen_id drin stehen habe muss ich die ja wahrscheinlich unterschiedlich deklarieren, oder sehe ich das falsch?
onemorenerd 13-10-2009, 13:40 Lies unsere Regeln, brich deinen Code um und formuliere dein Problem so, dass Außenstehende es nachvollziehen können!
Vielleicht möchtest du dich über JOIN (SQL) informieren.
AmicaNoctis 13-10-2009, 13:44 Hallo,
ich hab es mir grad drei mal durchgelesen und verstehe es immer noch nicht. Was musst du unterschiedlich deklarieren? Und unterschiedlich wozu?
Gruß,
Amica
Naja woher soll den PHP wissen welche ID er aus der Tabelle als A und B nehmen soll wenn beide im gleichen Tabellenverzeichnis stehen
Na, genau so, wie PHP alles erfährt, was es tun soll: In dem du es sagst!
onemorenerd 13-10-2009, 13:51 Dann sag es "ihm" eben. :rolleyes:
AmicaNoctis 13-10-2009, 13:51 Naja woher soll den PHP wissen welche ID er aus der Tabelle als A und B nehmen soll wenn beide im gleichen Tabellenverzeichnis stehen
Das wirst du PHP doch bestimmt sagen, indem du deine Distanzfunktion mit 2 IDs aus der Tabelle aufrufst. Ob die jetzt aus einer Tabelle kommen oder aus zwei verschiedenen oder du dir die grad selbst ausgedacht hast ist doch der Distanzfunktion egal, oder?
Edit: Sorry, ich muss einfach diesen Vergleich noch loswerden:
Hast du auch beherzigt, was onemorenerd dir bereits über Joins gesagt hat? Das was du grad mit der DB machst ist, als ob du mit 20 Einkaufswagen und einem vollen Kasten Bier einen Supermarkt stürmst, von jedem einzelnen Produkt eins einpackst, einen Kasten Bier nimmst, der genau so aussieht wie dein mitgebrachter, an die Kasse gehst, alles bezahlst, draußen auf dem Parkplatz alles wegwirfst, was du gar nicht haben wolltest und auf diesen Haufen den mitgebrachten Bierkasten stellst, weil du ja jetzt denselben nochmal hast.
Hast du die Koordinaten der Flughäfen denn schon in der Tabelle parat?
Und genau das "ihm" sagen ist mein Problem. Ich weiß überhaupt nicht wie ich das angehen soll und dann noch die Koordinatenberechnung mit einbinden soll.
Währe nett wenn einer von euch mir mit Scriptschnipseln helfen könntet.
Die Kooardinaten sind eingepflegt ja!
AmicaNoctis 13-10-2009, 23:46 Du hast eine Funktion, welche die Distanz zwischen zwei Punkten berechnet. Also sollte sie mit 2 Punkten aufgerufen werden, oder - der Einfachheit halber - mit vier Komponenten (lat1, lon1, lat2, lon2). Die bekommst du aus der Datenbank, wenn du ein Select auf die beiden IDs machst (where ... in (...)). Ich sehe da keine besondere Schwierigkeit, vielleicht ist es daher besser, dass du nochmal ganz genau formulierst, wo es denn jetzt hapert, wie, warum und wann.
Ansatz für EIN sql query:
select *,
DEGREES(ACOS(SIN(RADIANS(DBLATFELD))
*SIN(RADIANS(".$LAT_Flugplatz1."))
+COS(RADIANS(DBLATFELD))
*COS(RADIANS(".$LAT_Flugplatz1."))
*COS(RADIANS(DBLONFELD - ".$LON_Flugplatz1."))) * 60 * 1.85201)
AS Entfernung from DATENBANK
where flugplatzid = flugplatz2id
so in die Richtung ....
Du hast eine Funktion, welche die Distanz zwischen zwei Punkten berechnet. Also sollte sie mit 2 Punkten aufgerufen werden, oder - der Einfachheit halber - mit vier Komponenten (lat1, lon1, lat2, lon2). Die bekommst du aus der Datenbank, wenn du ein Select auf die beiden IDs machst (where ... in (...)). Ich sehe da keine besondere Schwierigkeit, vielleicht ist es daher besser, dass du nochmal ganz genau formulierst, wo es denn jetzt hapert, wie, warum und wann.
Also das beginnt schon beim "Select" ich weiß nicht ob da schon die lat und lon Spalten einbinden muss und wie ich dann genau lat und lon für den einen flughafen und den anderen Flughafen definiere. flughafen_id kann ich ja nicht so einfach benutzen weil ja beide Ids der Flughäfen in der selben Spalte sind.
Ich kanns nicht genauer erklären.
Peacie hat dir ja schon einen Ansatz geliefert.
Ansatz für EIN sql query:
select *,
DEGREES(ACOS(SIN(RADIANS(DBLATFELD))
*SIN(RADIANS(".$LAT_Flugplatz1."))
+COS(RADIANS(DBLATFELD))
*COS(RADIANS(".$LAT_Flugplatz1."))
*COS(RADIANS(DBLONFELD - ".$LON_Flugplatz1."))) * 60 * 1.85201)
AS Entfernung from DATENBANK
where flugplatzid = flugplatz2id
so in die Richtung ....
Das habe ich mir eben schon 10 min angeschaut aber erstmal wie deklariere ich lat_Flugplat1 und wie bekomme ich den zweiten Flughafen rein mit lat und lon
onemorenerd 14-10-2009, 01:14 Ansatz für EIN sql query
... und eine weitere um an lat,lon von Flugpatz 1 zu kommen.
@Malchor: Google mal nach SELF JOIN.
AmicaNoctis 14-10-2009, 01:16 flughafen_id kann ich ja nicht so einfach benutzen weil ja beide Ids der Flughäfen in der selben Spalte sind.
Da eine Tabelle aber 2-dimensional ist, hat sie auch Zeilen und da stehen die verschiedenen IDs drin, also kannst du ganz leicht darauf zugreifen.
Davon abgesehen brauchst du ja die IDs nicht nochmal, die hast du ja schon, um das Select überhaupt zu machen (siehe "Bierkasten (http://www.php-resource.de/forum/php-developer-forum/97780-distanzberechnung-zweier-orte-ueber-laengen-und-breitengrade.html#post626851)"). Die Geokoordinaten sind es, die ich an deiner Stelle selecten würde, dann bekommst du 2 Datensätze (einen pro Flughafen) und dort hast du dann die jeweiligen Längen- und Breitengrade als Spalten drin.
AmicaNoctis 14-10-2009, 01:35 @Malchor: Google mal nach SELF JOIN.
@onemorenerd: Ich versteh grad nicht, was der Self Join damit zu tun hat. Die Koordinaten-Tabelle ist nicht selbstrefenzierend.
@Malchor: Es würde helfen, wenn du mal die Tabellendefinitionen postest (show create table ...;), dann kann man die hier bereits gelieferten (aber abstrakten) Ansätze konkretisieren.
Habe diese show abfrage bei phpmy admin gemacht. Ich habe aber diese komische Ausgabe bekommen: Table Create Table Flughafen CREATE TABLE
`Flughafen` (
`flughafenid` varchar...
AmicaNoctis 14-10-2009, 01:48 Ich habe aber diese komische Ausgabe bekommen
Genau die meine ich auch, nicht das, was du gerade eben kopiert hast. Wenn du so nett bist und die dann noch formatiert postest (Umbruch nach "(" und ","), bin ich völlig zufrieden. Und das ganze dann bitte noch für die anderen Tabellen, die evtl. benötigt werden.
Dann noch eine Frage: Geht es zufällig gerade darum, dass du zu jeder Route in der Flugplan-Tabelle die Distanz zwischen Start- und Zielflughafen ermitteln willst? Das war mir noch nicht so ganz klar geworden, wofür du das jetzt genau brauchst.
Da es in diesem Thread von Anfang an ziemlich durcheinander ging und du das Vorhaben aus meiner Sicht noch nicht ausreichend geschildert hast, wäre es gut, das nochmal kurz zusammenzufassen. (Darauf wurdest du übrigens bereits mehrfach hingewiesen.)
Gruß,
Amica
genau das möchte ich. Zu jeder Route möchte ich die Distanz errechnen danke.
http://www.usairwings.com/pictures/FSScreen_25.jpg
http://www.usairwings.com/pictures/FSScreen_26.jpg
Ich habe es wirklich mehrfach versucht genau das zu sagen was du nun richtig interpretiert hast
AmicaNoctis 14-10-2009, 01:56 :rolleyes: Setzt du bitte mal den Haken bei "vollständige Textfelder anzeigen"? Dass das ja nicht die komplette Ausgabe sein kann, hätte dir auch auffallen können. Dann bitte nur den Inhalt des Textfeldes kopieren und nicht die ganze Tabelle.
Achso: und am besten benutzt du den "Ändern"-Button und überschreibst das eben gepostete.
AmicaNoctis 14-10-2009, 02:19 Warum hast du jetzt deinen gesamten Desktop als Bild gepostet, statt einfach das bisschen Text zu kopieren? Bitte ändern.
Warum benutzt du MyISAM und nicht InnoDB?
Für die Fremdschlüssel solltest du erstmal einen Index setzen (und im Idealfall einen foreign key constraint, nachdem du auf InnoDB umgestellt hast).
Ich kenne nicht mal den Unterschied zwischen MyISAM und InnoDB
AmicaNoctis 14-10-2009, 02:27 Ich kenne nicht mal den Unterschied zwischen MyISAM und InnoDB
An deiner Stelle hätte ich mir diesen Kommentar verkniffen und schnell mal nachgesehen, was der Unterschied ist. Deine Eigeninitiative ist mehr als dürftig, genau wie die Problembeschreibung. Deine Behauptung, du hättest mehrfach versucht, es zu erklären, kann ich (nach erneuter kompletter Lektüre dieses Threads) leider nur als Unsinn bezeichnen. Statt des geforderten Textes postest du riesige Bilder mit kaum noch lesbar winzigem Text drin. Tut mir leid, aber ich hab grad keine Geduld mehr und ich habe mich die letzten Posts über schon sehr zusammengerissen.
Vielleicht morgen wieder, falls du mal ein paar Hinweise beherzigst, die andere und ich dir bereits gegeben haben.
Also versucht habe ich es schon, aber es scheint mir nicht gelungen. Eigeninitiative habe ich normalerweise schon aber ich stehe total auf dem Schlauch! Aber ich dachte auch ein Foto ist übersichtlicher!
... und eine weitere um an lat,lon von Flugpatz 1 zu kommen.
Jau, dachte, der TE kommt so auf die Lösung.
@Malchor: Was ich nicht nachvollziehen kann ist, du wirst ja irgendwas mit diesen Daten anfangen. Anhand des Flugplanes z.B. die passenden Flughäfen auf einer Seite Ausgeben.
Dort solltest Du doch alle Daten die Du brauchst, zur Verfügung haben.
Der Rest ist doch nur rechnerei....
Also es ist so. Der pilot kann sich aus einem Flugplan einen Flug aussuchen. z.B. Berlin- Frankfurt. Dann klickt er diesen Flug an und eine neue Seite öffnet sich. Dort ist dann eine Karte zu sehen mit der Strecke, einige andere Daten und der Entfernung zu einander.
Und genau da liegt das Problem. Bis auf die Distanz habe ich bereits alles programmiert. Das ich die Tabelle Flughafen ansprechen muss ist mir schon irgendwo klar, weil dort die Daten stehn. Außerdem muss ich denke ich mal auch Flugplan ansprechen damit auch nur die <Daten für einen bestimmten Flug ausgeworfen werden. Oder sehe ich das falsch. Aber wo genau muss ich denn diese Cos Berechnung dann einsetzten. Und vor allem wie mache ich dem System verständlich welche ID nun Stadt A mit Lon und Lat ist und welche Stadt B?
Ich hoffe ich habe es jetzt besser formoliert, was mein Problem ist. Ich bin ja super dankbar das ihr mir versucht zu helfen.
Und da hier nun wirklich ALLE Informationen zur Selbsthilfe gegeben wurde, aber der TO immer noch "auf dem Schlauch steht" und wiederholt nach Quellcode bettelt: Projekthilfe.
onemorenerd 14-10-2009, 13:06 Ich hole jetzt mal etwas weiter aus, um Grundlagen zu vermitteln, die dir offensichtlich fehlen. Also stell dir mal vor ...
Du hast eine Tabelle namens "Flughafen"
ID | Name | Lat | Lon | ...
---------------------------
1 | Foo | ... | ... | ...
2 | Bar | ... | ... | ...
3 | Baz | ... | ... | ...
und eine namens "Flug"
ID | Flughafen_ID | ...
---------------------------
1 | 1 | ...
1 | 2 | ...
2 | 1 | ...
2 | 3 | ...
Du möchtest auf einer Seite die Länge eines Fluges angeben. Dein Skript bekommt eine Flug-ID, die der Pilot auf einer anderen Seite ausgewählt hat.
Nun holst du zu dieser Flug-ID alle Flughafen-IDs aus der Tabelle Flug.
SELECT Flughafen_ID FROM Flug WHERE ID = $IDDas liefert entweder Null Ergebnisse, bei falscher ID, oder exakt zwei Ergebnisse, nämlich Start- und Zielflughafen.
Das Ergebnis kannst du mit einer While-Schleife in ein Array schaufeln oder einfach zweimal hintereinander mysql_fetch_irgendwas() notieren, um die zwei Ergebnisse in getrennte Variablen zu speichern.
Jetzt holst du Lat,Lon aus der Tabelle Flughafen - für alle Flughäfen, deren ID du durch die erste Abfrage erhalten hast.
SELECT Lat, Lon FROM Flughafen WHERE ID = $FHID1 OR ID = $FHID2Das liefert ebenfalls exakt zwei Ergebnisse, zu jeder Flughafen-ID ein Lat-Lon-Päarchen, das du für die Distanzberechnung benutzen kannst.
So einfach ist das. Ich hoffe, du hast es halbwegs verstanden und baust es erstmal so nach. Das ergibt ungefähr folgenden Code
// Auflösung Flug-ID => Flughafen-IDs
mysql_query()
mysql_fetch_irgendwas()
mysql_fetch_irgendwas()
// Auflösung Flughafen-IDs => Lat,Lon
mysql_query()
mysql_fetch_irgendwas()
mysql_fetch_irgendwas()
// Distanzberechnung
distance()Wenn du damit fertig bist und alles so funktioniert wie es soll, können wir nochmal über JOIN sprechen.
@Amica: Wäre das kein self join?
SELECT f1.lat, f1.lon, f2.lat, f2.lon
FROM Flughafen AS f1
JOIN Flughafen AS f2 ON f1.Flughafen_ID = f2.Flughafen_ID
WHERE f1.Flughafen_ID = $ID
Bei der Unterstützung, die der TO hier bekommt, ist eigentlich ein Kasten Bier oder ähnliches für die Beteiligten fällig....
AmicaNoctis 14-10-2009, 13:13 @Amica: Wäre das kein self join?
SELECT f1.lat, f1.lon, f2.lat, f2.lon
FROM Flughafen AS f1
JOIN Flughafen AS f2 ON f1.Flughafen_ID = f2.Flughafen_ID
WHERE f1.Flughafen_ID = $ID
Doch klar, aber der ergibt keinen Sinn, weil f1 exakt derselbe Flughafen ist wie f2. So wird ein Schuh draus:
select f1.lat as lat1, f1.lon as lon1, f2.lat as lat2, f2.lon as lon2
from flugplan as fp
join flughafen as f1 on f1.flughafenid = fp.flughafenid1
join flughafen as f2 on f2.flughafenid = fp.flughafenid2
where fp.flugnummer = $flugnummer
Und das ist übrigens immer noch kein self join, weil beide (auch wenn sie zufällig dieselbe Tabelle betreffen) gegen Flugplan joinen.
Mit all der Hilfe werde ich es in den nächsten Tagen nochmal in Ruhe programmieren und noch mal hier melden. Erstmal Danke nun muss ich selbst mal wieder was tüffteln.
onemorenerd 14-10-2009, 13:33 Oh man, na klar. *schäm*
Hallo Malchor,
solltest du das geschafft haben würde ich dir gerne genau dieses Skript als Lizenz abkaufen. Meld dich doch mal dazu. Ansonsten an Interesssierte die dazu in der Lage währen das nochmal zu programmieren.... Was würde das kosten? Lg Vielen im Voraus.
|
-
- |