-
Hi,
ich habe die Semiversus Formel (s. JPG-Datei im Anhang), die ich für eine Berechnung in PHP "übersetzen" muss, allerdings schier daran verzweifle.
Ich habe mir folgendes vorgestellt (wobei ich weiss, dass es fehlerhaft ist, daher bitte ich ja dringendst um Hilfe) - zumindest müsste es sinngemäß so in etwa umgesetzt werden:
Code :1
d = 2arcsin(sqrt(((sin^2*(($phi_2-$phi_1)/2))+cos($phi_1)*cos($phi_2)*(sin^2*(($lambda_2-$lambda_1)/2))))
Der Code, den ich bisher habe sieht im Prinzip so aus:
Hat jemand (bitte) die rettende Lösung - hänge jetzt schon den ganzen Nachmittag dran?PHP-Code:<?php
include("class.inc.php");
//Koordinaten Ort Nr. 1 LAT (Breitengrad)
$phi_1 = '50.93895982764574';
//Koordinaten Ort Nr. 1 LONG (Laengengrad)
$phi_2 = '6.9577789306640625';
//Koordinaten Ort Nr. 2 LAT (Breitengrad)
$lambda_1 = '51.22279768927183';
//Koordinaten Ort Nr. 2 LONG (Laengengrad)
$lambda_2 = '6.785430908203125';
//Erdradius 6378.137 km
$erdradius = '6378.137';
// Hier soll die o. g. Formel erscheinen
$d = 2arcsin(sqrt(((sin^2*(($phi_2-$phi_1)/2))+cos($phi_1)*cos($phi_2)*(sin^2*(($lambda_2-$lambda_1)/2))));
// Oberflaechenentfernung
$entfernung = $erdradius*$d;
echo "Entfernung: ".$entfernung." km";
?>
Beste Grüße,
prekoWem das Wasser bis zum Hals steht, sollte den Kopf nicht hängen lassen.
Was man heute Rap-Musik nennt, hieß früher Stottern und war heilbar...
Es gibt zwei Wege im Leben - den schweren und den falschen!
-----------------------------------------------------------------------------------------------------
http://www.prenociste-mir.com
-----------------------------------------------------------------------------------------------------
-
16.04.09 21:26 #2
Da muss ich doch mal in meine Trickkiste greifen - und ich erinnere mich an einen Thread von mir.
http://www.tutorials.de/forum/php/21...db-suchen.htmlIch würde mich über die Bewertung meiner Beiträge mit Kurzkommentar sehr freuen!
Die "dumme Frage" ist gewöhnlich das erste Anzeichen einer völlig neuen Entwicklung!
-------------------
Es ist immer Zeit etwas zu verändern ....
.... das alles so bleibt wie es ist!
-------------------
Homepage Landshut
-------------------
/voodoo.css
#meinFeind {position: absolute; bottom: -6ft;}
-
16.04.09 21:44 #3
- Registriert seit
- Dec 2007
- Ort
- Bremen
- Beiträge
- 3.418
Hi,
wenn ich die Formel richtig lese:
Die Zeilenumbrüche und Einrückungen sind natürlich nur gegen Augenkrebs.PHP-Code:$d = 2 * asin(
sqrt(
pow(sin(($phi_2-$phi_1)/2), 2)
+ cos($phi_1)*cos($phi_2)
)
* pow(sin(($lambda_2-$lambda_1)/2), 2)
);
LGDa es nötig zu werden scheint: Ich leiste hier keinen Support über PN. Stellt Rückfragen zu Euren Problemen bitte in Eurem Thread, dann können alle helfen.
-
@ kuddeldaddeldu:
Super, die Umsetzung ist, soweit ich es beurteilen kann absolut richtig, allerdings habe ich einen Fehler gemacht bei der Grafik. Die Wurzel war - aus welchen Gründen auch immer - nicht richtig dargestellt. Ich habe die korrigierte Grafik in den Anhang gepackt.
Ich habe mich auch an die Umsetzung/Änderung der Formel gemacht, allerdings kann das Ergebnis nicht richtig sein, da es viel zu hoch ausfällt:
Gibt es vielleicht eine Idee dazu?PHP-Code:$d = 2 * asin(
sqrt(
(
pow(sin(($phi_2-$phi_1)/2), 2)
+ cos($phi_1)*cos($phi_2)
)
* pow(sin(($lambda_2-$lambda_1)/2), 2)
)
);
Beste Grüße,
preko
Sorry, Anhang fehlte im Eifer des Gefechts.
Wird hiermit nachgeliefert.
Wem das Wasser bis zum Hals steht, sollte den Kopf nicht hängen lassen.
Was man heute Rap-Musik nennt, hieß früher Stottern und war heilbar...
Es gibt zwei Wege im Leben - den schweren und den falschen!
-----------------------------------------------------------------------------------------------------
http://www.prenociste-mir.com
-----------------------------------------------------------------------------------------------------
-
16.04.09 23:47 #5
- Registriert seit
- Dec 2007
- Ort
- Bremen
- Beiträge
- 3.418
Hi,
eigentlich hast Du die Klammern gemäß der Formel gesetzt. Kann es sein, dass die Formel noch nicht stimmt? Hier unter Punkt 2 z.B. fehlen die Klammern, die Du da im Code noch eingefügt hast.
Das sähe dann so aus:
LGPHP-Code:$d = 2 * asin(
sqrt(
pow(sin(($phi_2-$phi_1)/2), 2)
+ cos($phi_1) * cos($phi_2) * pow(sin(($lambda_2-$lambda_1)/2), 2)
)
);
EDIT//
Übrigens sind die Phi-Platzhalter die Lat-Werte und die Lambda-Platzhalter die Lon-Werte. Demnach müssten Deine Variablen eigentlich so gefüllt werden:
PHP-Code://Koordinaten Ort Nr. 1 LAT (Breitengrad)
$phi_1 = '50.93895982764574';
//Koordinaten Ort Nr. 1 LONG (Laengengrad)
$lambda_1 = '6.9577789306640625';
//Koordinaten Ort Nr. 2 LAT (Breitengrad)
$phi_2 = '51.22279768927183';
//Koordinaten Ort Nr. 2 LONG (Laengengrad)
$lambda_2 = '6.785430908203125';
Geändert von kuddeldaddeldu (16.04.09 um 23:59 Uhr)
Da es nötig zu werden scheint: Ich leiste hier keinen Support über PN. Stellt Rückfragen zu Euren Problemen bitte in Eurem Thread, dann können alle helfen.
-
17.04.09 09:14 #6
Wie bereits geschrieben - in meinem Link bekommst du die Formel auf Seite 3 geliefert - musst nur noch auf deine Bedürfnisse umbauen.
Eine andere Möglichkeit ist die Funktion getDistance aus der gmapper-Klasse zu verwenden.
Wie du siehst erwartet die Funktion getDistance ein (Mehrdimensionales) Array mit den Koordinaten des Startortes und des Zielortes. Mit dieser Funktion kannst du auch die Distanz über mehrere Punkte ausgeben. Einfach das Array um die weiteren Punkte erweitern.
PHP-Code:function getDistance($koord)
{
if (!is_array($koord))
{
return false;
}
$ent = 0;
$welt = 6378.137; // Erdradius, ca. Angabe
foreach($koord as $key => $fetch)
{
if (isset($koord[$key + 1]))
{
$erste_breite = $koord[$key][0]; // lat
$erste_laenge = $koord[$key][1]; // lon
$erste_breite_rad = deg2rad($erste_breite);
$erste_laenge_rad = deg2rad($erste_laenge);
$zweite_breite = $koord[$key + 1][0]; // lat
$zweite_laenge = $koord[$key + 1][1]; // lon
$zweite_breite_rad = deg2rad($zweite_breite);
$zweite_laenge_rad = deg2rad($zweite_laenge);
$dis = acos(
(sin($erste_breite_rad) * sin($zweite_breite_rad)) +
(cos($erste_breite_rad) * cos($zweite_breite_rad) *
cos($zweite_laenge_rad - $erste_laenge_rad))) * $welt;
$ent = $ent + $dis;
}
}
$entfernung = $ent * 1000;
return round($entfernung, 0);
}
Geändert von dwex (17.04.09 um 16:29 Uhr)
Ich würde mich über die Bewertung meiner Beiträge mit Kurzkommentar sehr freuen!
Die "dumme Frage" ist gewöhnlich das erste Anzeichen einer völlig neuen Entwicklung!
-------------------
Es ist immer Zeit etwas zu verändern ....
.... das alles so bleibt wie es ist!
-------------------
Homepage Landshut
-------------------
/voodoo.css
#meinFeind {position: absolute; bottom: -6ft;}
-
@ dwex:
herzlichen Dank für den Lösungsweg - das war´s was ich gebraucht habe. Ich habe mir erlaubt einige Anpassungen vorzunehmen, wie das nachfolgende Listing zeigt.
Hier die Datenbankstruktur:
Code sql:1 2 3 4 5 6 7 8 9 10 11
CREATE TABLE IF NOT EXISTS `ts_geocoding` ( `id` BIGINT(255) NOT NULL AUTO_INCREMENT, `postalcode` VARCHAR(10) COLLATE utf8_unicode_ci NOT NULL, `lat` VARCHAR(20) COLLATE utf8_unicode_ci NOT NULL, `long` VARCHAR(20) COLLATE utf8_unicode_ci NOT NULL, `city` VARCHAR(30) COLLATE utf8_unicode_ci NOT NULL, `city_int` VARCHAR(50) COLLATE utf8_unicode_ci NOT NULL, `country_short` VARCHAR(5) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`), KEY `city` (`city`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
Und hier die relevanten Codezeilen:
PHP-Code:<?php
include("db_access.php");
// Die Zahl PI als Variable
$pi = '3.1415926535';
// Koordinaten des Ortes
$ort = "Köln";
$ursprungsbreite = 50.9407;
$ursprungslaenge = 6.9599;
// max. Km-Entfernung von Startort
$entf = '100';
echo "<p>Folgende grössere Orte liegen im Radius von $entf km um $ort:</p>";
// Berechnungsvariablen Teil 1
$alpha = 180*$entf/(6378137/1000*$pi);
$geo1 = $ursprungsbreite-$alpha;
$geo2 = $ursprungsbreite+$alpha;
$geo3 = $ursprungslaenge-$alpha;
$geo4 = $ursprungslaenge+$alpha;
$a = $ursprungsbreite/180*$pi;
$b = $ursprungslaenge/180*$pi;
// Zählervariable
$z = 1;
// Datenbankzugriff und Query
$db = @mysql_connect($host1,$user,$password)
or die ("Verbindung mit Datenbankserver fehlgeschlagen!");
@mysql_select_db($database,$db)
or die ("Verbindung mit Datenbank fehlgeschlagen!");
$sql_query = ("SELECT
*
FROM
`db_geocoding`
WHERE
(`lat` >= '$geo1')
AND
(`lat` <= '$geo2')
AND
(`long` >= '$geo3')
AND
(`long` <= '$geo4')
AND
(`city_int` != '$ort')
");
$result = mysql_query($sql_query);
while( $row = mysql_fetch_array($result,MYSQL_ASSOC) ) {
// Berechnungsvariablen Teil 2
$c = $row['lat'];
$d = $row['long'];
$c = $c/180*$pi;
$d = $d/180*$pi;
$e = sin($a)*sin($c);
$f = cos($a)*cos($c)*cos($d-$b);
$g = acos($e + $f);
$h = $g * 6378.137;
$ausgabe = sprintf("%01.2f", $h);
if($ausgabe > $entf) {
continue;
}
$ausgabe = str_replace(".", ",", $ausgabe);
echo "$z - Nach <strong>".$row['city_int']."</strong> sind es $ausgabe km.<br><hr />";
$z++;
}
?>
Beste Grüße,
prekoWem das Wasser bis zum Hals steht, sollte den Kopf nicht hängen lassen.
Was man heute Rap-Musik nennt, hieß früher Stottern und war heilbar...
Es gibt zwei Wege im Leben - den schweren und den falschen!
-----------------------------------------------------------------------------------------------------
http://www.prenociste-mir.com
-----------------------------------------------------------------------------------------------------
-
21.04.09 10:06 #8
Es freut mich, dass ich dir weiterhelfen konnte.
Ich würde mich über eine Bewertung meines Beitrages sehr freuen.Ich würde mich über die Bewertung meiner Beiträge mit Kurzkommentar sehr freuen!
Die "dumme Frage" ist gewöhnlich das erste Anzeichen einer völlig neuen Entwicklung!
-------------------
Es ist immer Zeit etwas zu verändern ....
.... das alles so bleibt wie es ist!
-------------------
Homepage Landshut
-------------------
/voodoo.css
#meinFeind {position: absolute; bottom: -6ft;}
-
@ dwex:
ist schon passiert - nochmals vielen Dank!
Beste Grüße,
prekoWem das Wasser bis zum Hals steht, sollte den Kopf nicht hängen lassen.
Was man heute Rap-Musik nennt, hieß früher Stottern und war heilbar...
Es gibt zwei Wege im Leben - den schweren und den falschen!
-----------------------------------------------------------------------------------------------------
http://www.prenociste-mir.com
-----------------------------------------------------------------------------------------------------
Ähnliche Themen
-
Probleme bei Script umsetzung
Von ulf123 im Forum CGI, Perl, Python, Ruby, Power ShellAntworten: 2Letzter Beitrag: 16.02.06, 11:19 -
Eigenes CMS -> Probleme mit Umsetzung
Von diggity im Forum PHPAntworten: 6Letzter Beitrag: 11.04.05, 18:52 -
probleme mit formel
Von X2k im Forum Visual Basic 6.0Antworten: 8Letzter Beitrag: 23.12.04, 20:12 -
Uploadscript (Probleme mit der umsetzung)
Von cyberking im Forum PHPAntworten: 5Letzter Beitrag: 24.09.02, 19:25 -
Probleme bei umsetzung :(
Von Lykon im Forum PhotoshopAntworten: 8Letzter Beitrag: 11.04.02, 13:10



1Danke

Zitieren
Login






[PHP][Snippet] Array zu XML konvertieren