tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von dwex
ERLEDIGT
JA
ANTWORTEN
8
ZUGRIFFE
1312
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von preko
    preko preko ist offline Mitglied Brokat
    Registriert seit
    Jun 2004
    Ort
    Mönchengladbach
    Beiträge
    397
    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:
    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";
    ?>
    Hat jemand (bitte) die rettende Lösung - hänge jetzt schon den ganzen Nachmittag dran?


    Beste Grüße,
    preko
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken Probleme bei Umsetzung der Semiversus Formel-semiversus_formel.jpg  
     
    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
    -----------------------------------------------------------------------------------------------------

  2. #2
    Avatar von dwex
    dwex dwex ist offline Mitglied Platin
    Registriert seit
    Apr 2005
    Ort
    Landshut (Niederbayern)
    Beiträge
    695
    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.html
     
    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;}

  3. #3
    kuddeldaddeldu kuddeldaddeldu ist offline Mitglied Diamant
    Registriert seit
    Dec 2007
    Ort
    Bremen
    Beiträge
    3.418
    Hi,

    wenn ich die Formel richtig lese:

    PHP-Code:
    $d asin(
       
    sqrt(
          
    pow(sin(($phi_2-$phi_1)/2), 2)
          + 
    cos($phi_1)*cos($phi_2)
       )
       * 
    pow(sin(($lambda_2-$lambda_1)/2), 2)
    ); 
    Die Zeilenumbrüche und Einrückungen sind natürlich nur gegen Augenkrebs.

    LG
     
    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.

  4. #4
    Avatar von preko
    preko preko ist offline Mitglied Brokat
    Registriert seit
    Jun 2004
    Ort
    Mönchengladbach
    Beiträge
    397
    @ 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:
    PHP-Code:
    $d asin
       
    sqrt
          (
            
    pow(sin(($phi_2-$phi_1)/2), 2
            + 
    cos($phi_1)*cos($phi_2)
          )
          * 
    pow(sin(($lambda_2-$lambda_1)/2), 2
       )  
    ); 
    Gibt es vielleicht eine Idee dazu?


    Beste Grüße,
    preko

    Sorry, Anhang fehlte im Eifer des Gefechts.

    Wird hiermit nachgeliefert.
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken Probleme bei Umsetzung der Semiversus Formel-semiversus_formel.jpg  
     
    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
    -----------------------------------------------------------------------------------------------------

  5. #5
    kuddeldaddeldu kuddeldaddeldu ist offline Mitglied Diamant
    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:
    PHP-Code:
    $d asin
       
    sqrt
            
    pow(sin(($phi_2-$phi_1)/2), 2
            + 
    cos($phi_1) * cos($phi_2) * pow(sin(($lambda_2-$lambda_1)/2), 2
       )  
    ); 
    LG

    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.

  6. #6
    Avatar von dwex
    dwex dwex ist offline Mitglied Platin
    Registriert seit
    Apr 2005
    Ort
    Landshut (Niederbayern)
    Beiträge
    695
    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($entfernung0);
        } 
    Geändert von dwex (17.04.09 um 16:29 Uhr)
    preko bedankt sich. 
    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;}

  7. #7
    Avatar von preko
    preko preko ist offline Mitglied Brokat
    Registriert seit
    Jun 2004
    Ort
    Mönchengladbach
    Beiträge
    397
    @ 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&ouml;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,
    preko
     
    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
    -----------------------------------------------------------------------------------------------------

  8. #8
    Avatar von dwex
    dwex dwex ist offline Mitglied Platin
    Registriert seit
    Apr 2005
    Ort
    Landshut (Niederbayern)
    Beiträge
    695
    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;}

  9. #9
    Avatar von preko
    preko preko ist offline Mitglied Brokat
    Registriert seit
    Jun 2004
    Ort
    Mönchengladbach
    Beiträge
    397
    @ dwex:

    ist schon passiert - nochmals vielen Dank!


    Beste Grüße,
    preko
     
    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
    -----------------------------------------------------------------------------------------------------

Ähnliche Themen

  1. Probleme bei Script umsetzung
    Von ulf123 im Forum CGI, Perl, Python, Ruby, Power Shell
    Antworten: 2
    Letzter Beitrag: 16.02.06, 11:19
  2. Eigenes CMS -> Probleme mit Umsetzung
    Von diggity im Forum PHP
    Antworten: 6
    Letzter Beitrag: 11.04.05, 18:52
  3. probleme mit formel
    Von X2k im Forum Visual Basic 6.0
    Antworten: 8
    Letzter Beitrag: 23.12.04, 20:12
  4. Uploadscript (Probleme mit der umsetzung)
    Von cyberking im Forum PHP
    Antworten: 5
    Letzter Beitrag: 24.09.02, 19:25
  5. Probleme bei umsetzung :(
    Von Lykon im Forum Photoshop
    Antworten: 8
    Letzter Beitrag: 11.04.02, 13:10

Stichworte