Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Distanzberechnung zweier Orte über Längen und Breitengrade [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Distanzberechnung zweier Orte über Längen und Breitengrade


 
Malchor
13-10-2009, 13:05 
 
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

 
unset
13-10-2009, 13:10 
 
Dafür gibt es zum Beispiel die Haversine-Formel. Einfach mal nach Googlen, ist recht easy umzusetzen …*bzw. gibts schon tausend mal als Snippet.

 
Malchor
13-10-2009, 13:14 
 
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)

 
unset
13-10-2009, 13:17 
 
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 …

 
Malchor
13-10-2009, 13:25 
 
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>&nbsp"."</td>";
print "<td>".$dataset['dep_time']."</td>";
print "<td>".$dataset['flughafenid2']."&nbsp;"."</td>";
print "<td>".$dataset['arr_time']."&nbsp;"."</td>";
print "<td>".$dataset['days']."&nbsp;"."</td>";
print "<td>".$dataset['registrierung']."&nbsp;"."</td>";
print "<td>".$dataset['hersteller_name']."&nbsp;"."</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

 
Malchor
13-10-2009, 13:48 
 
Naja woher soll den PHP wissen welche ID er aus der Tabelle als A und B nehmen soll wenn beide im gleichen Tabellenverzeichnis stehen

 
unset
13-10-2009, 13:50 
 
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.

 
pekka
13-10-2009, 15:59 
 
Hast du die Koordinaten der Flughäfen denn schon in der Tabelle parat?

 
Malchor
13-10-2009, 23:06 
 
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.

 
Peacie
14-10-2009, 00:38 
 
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 ....

 
Malchor
14-10-2009, 01:01 
 
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.

 
pekka
14-10-2009, 01:04 
 
Peacie hat dir ja schon einen Ansatz geliefert.

 
Malchor
14-10-2009, 01:11 
 
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.

 
Malchor
14-10-2009, 01:41 
 
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

 
Malchor
14-10-2009, 01:53 
 
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).

 
Malchor
14-10-2009, 02:21 
 
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.

 
Malchor
14-10-2009, 03:48 
 
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!

 
Peacie
14-10-2009, 09:48 
 
... 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....

 
Malchor
14-10-2009, 11:14 
 
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.

 
unset
14-10-2009, 11:28 
 
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

 
pekka
14-10-2009, 13:11 
 
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.

 
Malchor
14-10-2009, 13:15 
 
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*

 
dhvh
29-04-2010, 17:07 
 
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.

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 08:45 Uhr.