Linuchs: Entfernungsformel Großkreis

Hallo,

ich möchte Entfernugen zwischen geografischen Stätten berechnen. Doch schon die zweite Berechnung ergibt NAN - ich übersetze das mit "Not a Number". Aber warum? Die "eingefütterten" Werte sind doch gültig:

$rad_lat_gizeh = deg2rad( 29.975833 );
$rad_lon_gizeh = deg2rad( 31.130833 );
$rad_lat_nazca = deg2rad(-14.720556 );
$rad_lon_nazca = deg2rad(-75.150278 );
$rad_lat_oster = deg2rad(-27.119444 );
$rad_lon_oster = deg2rad(-109.354722 );

$dist_km_gizeh_nasca =
round ( 6366.19773095
* acos( sin( $rad_lat_gizeh )
*       sin( $rad_lat_nazca )
+       cos( $rad_lat_gizeh )
*       cos( $rad_lat_nazca )
*       cos( $rad_lon_nazca ) -$rad_lon_gizeh ));

echo "[".$dist_km_gizeh_nasca."] "; // [13011]
$dist_km_summe = $dist_km_gizeh_nasca;

$dist_km_nasca_oster =
round ( 6366.19773095
* acos( sin( $rad_lat_nazca )
*       sin( $rad_lat_oster )
+       cos( $rad_lat_nazca )
*       cos( $rad_lat_oster )
*       cos( $rad_lon_oster ) -$rad_lon_nazca ));

echo "[".$dist_km_nasca_oster."] "; //  [NAN]
$dist_km_summe += $dist_km_nasca_oster;

Wird da bei PHP ein Wertebereich überschritten? Sonst lasse ich die Entfernungen mit MySQL und der gleichen Formel berechnen, da habe ich keine Probleme.

Linuchs

  1. Hallo Linuchs,

    Wird da bei PHP ein Wertebereich überschritten? Sonst lasse ich die Entfernungen mit MySQL und der gleichen Formel berechnen, da habe ich keine Probleme.

    Es kann ja nur sein, dass du dem acos ein Argument mit einem Betrag > 1 übergibst. Rechne die einzelnen Werte mit einem normalen Taschenrechner Schritt für Schritt nach.

    Bis demnächst
    Matthias

    --
    Signaturen sind bloed (Steel) und Markdown ist mächtig.
    1. Moin!

      Hallo Linuchs,

      Wird da bei PHP ein Wertebereich überschritten? Sonst lasse ich die Entfernungen mit MySQL und der gleichen Formel berechnen, da habe ich keine Probleme.

      Es kann ja nur sein, dass du dem acos ein Argument mit einem Betrag > 1 übergibst. Rechne die einzelnen Werte mit einem normalen Taschenrechner Schritt für Schritt nach.

      Bestätigt:

      $t=sin( -0.25692216992421 ) *  sin( -0.47332358911022 ) + cos( -0.25692216992421 ) * cos( -0.47332358911022 ) *  cos( -1.9085999515031 ) - -1.3116197848891;
      acos(1.14215576803):**NAN**
      
      

      (Aber warum den Taschenrechner? PHP tut doch noch.)

      Jörg Reinholz

  2. Hallo Linuchs,

    r = 6366.19773095

    Den Erdradius auf hunderstel Millimeter genau anzugeben, ist ziemlich sinnfrei. Zudem die Erde gar keine Kugel ist und selbst wenn die Erde eine kugelähnliche Form mit "stetiger" Oberfläche (also ohne Berge usw.) hätte, wüsstest du den Radius des konkreten Großkreises trotzdem nicht.

    Bis demnächst
    Matthias

    --
    Signaturen sind bloed (Steel) und Markdown ist mächtig.
  3. Hallo Linuchs,

    $dist_km_nasca_oster =
    round ( 6366.19773095
    * acos( sin( $rad_lat_nazca )
    *       sin( $rad_lat_oster )
    +       cos( $rad_lat_nazca )
    *       cos( $rad_lat_oster )
    *       cos( $rad_lon_oster ) -$rad_lon_nazca ));
    

    Wenn du die Formel mit der aus dem Wikipediaartikel zur Orthodrome vergleichst

    $$ \zeta =\arccos \Big( \sin(\phi_A) \sin(\phi_B) + \cos(\phi_A)\cos(\phi_B)\cos(\lambda_B - \lambda_A) \Big) $$

    sollte dir dein Fehler auffallen.

    Bis demnächst
    Matthias

    --
    Signaturen sind bloed (Steel) und Markdown ist mächtig.
    1. Hallo Matthias,

      Den Erdradius auf hunderstel Millimeter genau anzugeben, ist ziemlich sinnfrei.

      Geb ich dir ja Recht, ist aber wohl nicht der Grund des Fehlers.

      Wenn du die Formel mit der aus dem Wikipediaartikel zur Orthodrome vergleichst

      $$ \zeta =\arccos \Big( \sin(\phi_A) \sin(\phi_B) + \cos(\phi_A)\cos(\phi_B)\cos(\lambda_B - \lambda_A) \Big) $$

      Uups - hier kann man Formeln eingeben?

      sollte dir dein Fehler auffallen.

      Danke dir. Das richtige Einrücken hilft optisch:

      $dist_km_nasca_oster =
      round ( 6366.19773095
      * acos( sin( $rad_lat_nazca )
      *       sin( $rad_lat_oster )
      +       cos( $rad_lat_nazca )
      *       cos( $rad_lat_oster )
      *       cos( $rad_lon_oster
                  -$rad_lon_nazca )
      ));
      

      Linuchs

      Bis demnächst
      Matthias

      Signaturen sind bloed (Steel) und Markdown ist mächtig.