Linuchs: Geo-Umrechnung Bogen- in Dezimalgrade

Moin,

schon lange rechne ich mit dezimalen Koordinaten, die ich bisher auch dezimal eingegeben und gespeichert habe.

Bei Wikipedia werden Orte aber in Bogengraden angegeben, dummer weise muss eine Fremdseite zur Umrechnung aufgerufen werden.

Nun kommen Benutzerangaben auf mich zu in unüberschaubarer Vielfalt und ich bemühe mich, die umzurechnen in Dezimalwerte.

Kapstadt auf der deutschen Wikipedia-Seite: 33° 55′ S, 18° 25′ O auf der englischsprachigen: 33°55′31″S 18°25′26″E von einem Dortmunder per Mail: 51° 29' 56.0796'' N und 7° 19' 53.328'' E

Wer hat schon Minuten- und Sekundenzeichen auf der Tastatur?

Mein erster Versuch der Umrechnung:

/* ************************
 * geogr. Angabe umrechnen
 * ************************ */
// 51° 29' 56.0796'' N und 7° 19' 53.328'' E
// 33° 55′ 21.6″ S, 18° 25′ 0.08″ E Kapstadt
$lat_lon_in = $_POST['lat_lon'];
$lat_lon    = $_POST['lat_lon'];
if ( $_POST['lat_lon'] > " " ) {
  if ( strpos( $lat_lon_in, ',' ) === FALSE ) {
    $_fgeo_komma  = TRUE;
    $_f00 =( $_f00 || $_fgeo_komma );
  } else {
    $lat_lon  = str_replace( ' ', '', $_POST['lat_lon'] );  // 33°55′21.6″S,18°25′0.08″E (Leerzeichen weg)
    // seltsame Zeichen zu Leerstellen
    $lat_lon  = str_replace( [ '°', "''", "'", "′", '″' ], [ ' ', ' ', ' ', ' ', ' ' ], $lat_lon ); // 33 55 21.6 S,18 25 0.08 E

    $arr_lat_lon  = explode( ',', $lat_lon );

    // Umrechnung erorderlich?
    if ( !is_numeric( $arr_lat_lon[1] )) {

      $arr_lat  = explode( ' ', $arr_lat_lon[0] );                                                  // [ 33, 55, 21.6, "S" ]
      $lat      = round( $arr_lat[0] + $arr_lat[1]/60 + $arr_lat[2]/3600, 6 );
      if ( $arr_lat[count($arr_lat)-1] == 'S' ) $lat = $lat  * (-1.0);

      $arr_lon  = explode( ' ', $arr_lat_lon[1] );                                                  // [ 18, 25, 0.08, "E" ]
      $lon      = round( $arr_lon[0] + $arr_lon[1]/60 + $arr_lon[2]/3600, 6 );
      if ( $arr_lon[count($arr_lon)-1] == 'W' ) $lon = $lon  * (-1.0);

      $lat_lon    = $lat . "," . $lon;
      $_hgeo_umrechnung = TRUE;
      $_h00             =( $_h00 || $_hgeo_umrechnung );
    } else {
      // lat_lon ist fertig
    }
  }
}

wobei $_fxxx Fehlermeldungen und $_hxxx Hinweise sind, die später ausgegeben werden.

Sieht irgendwie kompliziert aus, geht das auch einfacher? Meine Recherche hat nix ergeben, deshalb der Selbstversuch.

fragt Linuchs

  1. @@Linuchs

    schon lange rechne ich mit dezimalen Koordinaten, die ich bisher auch dezimal eingegeben und gespeichert habe.

    Bei Wikipedia werden Orte aber in Bogengraden angegeben

    Du meinst: sexagesimal.

    Bogengrad ist dasselbe wie Grad. Der Ausdruck womöglich benutzt, um es von Grad Celsius zu unterscheiden.
    Bogenminute (Bogensekunde) ist dasselbe wie Winkelminute (Winkelsekunde). Der Ausdruck womöglich benutzt, um sie von der Zeit-Minute (Zeit-Sekunde) zu unterscheiden.

        $lat_lon  = str_replace( ' ', '', $_POST['lat_lon'] );  // 33°55′21.6″S,18°25′0.08″E (Leerzeichen weg)
        // seltsame Zeichen zu Leerstellen
        $lat_lon  = str_replace( [ '°', "''", "'", "′", '″' ], [ ' ', ' ', ' ', ' ', ' ' ], $lat_lon ); // 33 55 21.6 S,18 25 0.08 E
    

    Nein, nicht die „seltsamen“ (hä?) Zeichen raussuchen, sondern die (bis zu 3) Zahlen. Dann kannst du die Umrechnung auch auf 3h 26min 13s oder 3:26:13[1] anwenden.

    😷 LLAP

    --
    „Sag mir, wie Du Deine Maske trägst, und ich sage Dir, ob Du ein Idiot bist.“ —@Ann_Waeltin

    1. Gesamtlänge von Bruce Springsteen & the E Street Band Live/1975–85 ↩︎

    1. Hallo Gunnar,

      Nein, nicht die „seltsamen“ (hä?) Zeichen raussuchen, sondern die (bis zu 3) Zahlen.

      Danke für den Anstoß. Nun lasse ich den String in einer function durchlaufen und suche die Ziffern zusammen. Ich denke, das Ergebnis für Kapstadt (Wikipedia deutsch) kann sich sehen lassen:

      winkel2dezimal( [33° 55′ S, 18° 25′ O] )
      
      array(8) {
        [0]=>
        string(2) "33"
        [1]=>
        string(2) "55"
        [2]=>
        string(0) ""
        [3]=>
        string(1) "S"
        [4]=>
        string(2) "18"
        [5]=>
        string(2) "25"
        [6]=>
        string(0) ""
        [7]=>
        string(1) "E"
      }
      
      lat_lon=[-33.916667,18.416667]
      

      Der Link von Wiki zu geohack.toolforge.org enthält bereits die Umrechnung: params=33.922667_S_18.416689_E

      Wieso 33 +55/60 = 33.922667 sein soll, ist mir nicht klar, Wiki mogelt. Taschenrechner meint auch 33,916666667

      Nun führen auch seltsame Angaben zum Ergebnis:

      winkel2dezimal( [51° 29' 56.0796'' N und 7° 19' 53.328'' E] )
      ...
      lat_lon=[51.498911,7.33148]
      

      Lösungsweg:

      function winkel2dezimal( $str_winkel ) {
      echo "winkel2dezimal( [" .$str_winkel ."] )<br>";
      
        // Leerzeichen raus
        $komprimiert  = str_replace( ' ', '', $str_winkel );  // 33°55′21.6″S,18°25′0.08″E (Leerzeichen weg)
      
        // bis zu 6 Zahlen finden
        $arr_zahlen = [ '', '', '', 'n', '', '' , '', 'e' ];
        $ndx        = (-1);
        $ziffer     = FALSE;
        // String durchlaufen
        for ( $i=0; $i<strlen( $komprimiert ); $i++ ) {
          
          // neue Zahl beginnen
          if ( !$ziffer && ( is_numeric( $komprimiert[$i] ) || $komprimiert[$i] == '.' )) {
            $ziffer = TRUE;
            ++$ndx;
            $arr_zahlen[$ndx] .= $komprimiert[$i];
      
          // vorhandene Zahl ergaenzen, ggf. Dezimalpunkt
          } else if ( $ziffer && ( is_numeric( $komprimiert[$i] ) || $komprimiert[$i] == '.' )) {
            $arr_zahlen[$ndx] .= $komprimiert[$i];
      
          // nicht-numerisch: vorhande Zahl beenden
          } else {
            $ziffer = FALSE;
            switch( $komprimiert[$i] ) {
              case "N" :
                $arr_zahlen[3]  = "N";
                $ndx            = 3;
                break;
              case "S" :
                $arr_zahlen[3]  = "S";
                $ndx            = 3;
                break;
              case "E" :
                $arr_zahlen[7]  = "E";
                break;
              case "O" :
                $arr_zahlen[7]  = "E";
                break;
              case "W" :
                $arr_zahlen[7]  = "W";
                break;
            } // switch
          } // else if
        } // for
        $lat  = round( $arr_zahlen[0] + $arr_zahlen[1]/60 + $arr_zahlen[2]/3600, 6 );
        $lat  =( $arr_zahlen[3] == "S" ) ? $lat = $lat *(-1.0) : $lat;
        $lon  = round( $arr_zahlen[4] + $arr_zahlen[5]/60 + $arr_zahlen[6]/3600, 6 );
        $lon  =( $arr_zahlen[7] == "W" ) ? $lon = $lon *(-1.0) : $lon;
      echo "<pre>";
      var_dump( $arr_zahlen );
      echo "</pre>";
      echo "lat_lon=[" .$lat ."," .$lon ."]<br>";
      }
      

      Linuchs

      1. Hallo Linuchs,

        Wiki mogelt

        Nein, Wiki rundet. Wenn man die Seite bearbeitet, sieht man, dass -33.922667 als Breitengrad eingetragen ist. Das ist 33°55'21.6"S, gerundet 33°55'. Wenn Du auf den Geohack-Link klickst, siehst Du rechts oben den ungerundeten Wert.

        Findest Du sche...ußlich? - ja. Ist es.

        Verstehe ich deinen Code richtig, dass er ohne ein N oder S nach dem Breitengrad in den Wald läuft und deine N bzw. S Eintragung an Index 3 des Werte-Arrays plattbügelt?

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Hallo Rolf,

          Verstehe ich deinen Code richtig, dass er ohne ein N oder S nach dem Breitengrad in den Wald läuft ...

          Erstmal danke, dass du dich (wieder mal) in die Details gekniet hast.

          Nicht ganz. Bevor ich die function aufrufe, prüfe ich:

          $lat_lon_in = $_POST['lat_lon'];
          $lat_lon    = $_POST['lat_lon'];
          // ggf. geogr. Angabe umrechnen
          if ( 
              strpos( $lat_lon_in, "N" ) !== FALSE
          ||  strpos( $lat_lon_in, "S" ) !== FALSE
          ||  strpos( $lat_lon_in, "E" ) !== FALSE
          ||  strpos( $lat_lon_in, "O" ) !== FALSE
          ||  strpos( $lat_lon_in, "W" ) !== FALSE
          ) {
            include_once( "winkel2dezimal.php" );
            $lat_lon  = winkel2dezimal( $lat_lon_in );
          ...
          

          Vielleicht gehört das in die Funktion, die ich in mehreren Programmen verwenden möchte.

          Eine nicht-dezimale Angabe in der Form 33° 55′, 18° 25′ wird nicht bearbeitet. Gibt ja auch keinen Sinn, wenn die Lage N/S und W/O fehlt.

          Linuchs

          1. @@Linuchs

            Vielleicht gehört das in die Funktion, die ich in mehreren Programmen verwenden möchte.

            Entferne „Vielleicht“ und sortiere die restlichen Wörter um!

            Eine nicht-dezimale Angabe in der Form 33° 55′, 18° 25′ wird nicht bearbeitet. Gibt ja auch keinen Sinn, wenn die Lage N/S und W/O fehlt.

            Was genau fehlt bei long: −33° 55′; lat: 18° 25′?

            😷 LLAP

            --
            „Sag mir, wie Du Deine Maske trägst, und ich sage Dir, ob Du ein Idiot bist.“ —@Ann_Waeltin
            1. Hallo Gunnar,

              Eine nicht-dezimale Angabe in der Form 33° 55′, 18° 25′ wird nicht bearbeitet. Gibt ja auch keinen Sinn, wenn die Lage N/S und W/O fehlt.

              Was genau fehlt bei long: −33° 55′; lat: 18° 25′?

              zwei Dumme, ein Gedanke. Oder: Great minds think alike. 😉
              Du warst etwa eine halbe Minute schneller, also hab ich mein angefangenes Posting verworfen.

              Live long and pros healthy,
               Martin

              --
              Paradox: Wieso heißen die Dinger Kühlkörper, obwohl sie höllisch heiß werden?
            2. Hallo Gunnar,

              Was genau fehlt bei long: −33° 55′; lat: 18° 25′ ?

              Die KI, die erkennt, dass die Länge zuerst genannt wurde. Von Präfixen long/lat, die das markieren, war bisher keine Rede. Wenn der Code blind die Zahlen herausfischt, stimmt das Ergebnis nicht.

              Rolf

              --
              sumpsi - posui - obstruxi
              1. n'Abend Rolf,

                Was genau fehlt bei long: −33° 55′; lat: 18° 25′ ?

                Die KI, die erkennt, dass die Länge zuerst genannt wurde.

                die brauchst du aber in jedem anderen Fall auch.

                Von Präfixen long/lat, die das markieren, war bisher keine Rede.

                Nein, aber von Suffixen wie S/N oder W/O. Das ist eigentlich dasselbe in Grün.

                Wenn der Code blind die Zahlen herausfischt, stimmt das Ergebnis nicht.

                Das Risiko besteht. Aber das besteht bei der ursprünglich verwendeten Notation auch. Es ist zwar üblich, dass bei geografischen Koordinaten die Länge zuerst genannt wird (bei Himmelskoordinaten z.B. auch die Rektaszension), aber AFAIK ist das nur eine Konvention und keine verbindliche Regel.

                Live long and pros healthy,
                 Martin

                --
                Wenn drei Leute im Zimmer sind, und fünf gehen raus,
                dann sollten zwei wieder reingehen, damit das Zimmer leer ist.
                1. @@Der Martin

                  Von Präfixen long/lat, die das markieren, war bisher keine Rede.

                  Nein, aber von Suffixen wie S/N oder W/O. Das ist eigentlich dasselbe in Grün.

                  Diesmal warst du schneller.

                  😷 LLAP

                  --
                  „Sag mir, wie Du Deine Maske trägst, und ich sage Dir, ob Du ein Idiot bist.“ —@Ann_Waeltin
                2. Hallo Martin,

                  Es ist zwar üblich, dass bei geografischen Koordinaten die Länge zuerst genannt wird

                  Äh, bin ich jetzt matsche in der Birne? N/S ist doch Breite, und W/O ist Länge, gelle?

                  Schreibt man eher 7°N, 5°W oder 7°W, 5°N? Ich würde das erstere nennen wollen, analog zu Wikipedia oder Google Maps. Weswegen mich Gunnars long/lat Angabe ja auch verwirrt hatte.

                  Rolf

                  --
                  sumpsi - posui - obstruxi
                  1. Hallo,

                    Es ist zwar üblich, dass bei geografischen Koordinaten die Länge zuerst genannt wird

                    Äh, bin ich jetzt matsche in der Birne? N/S ist doch Breite, und W/O ist Länge, gelle?

                    genua. Ähm, genau.

                    Schreibt man eher 7°N, 5°W oder 7°W, 5°N?

                    Mir ist die zweite Variante geläufiger.

                    Ich würde das erstere nennen wollen, analog zu Wikipedia oder Google Maps.

                    Stimmt, OSM macht das auch. Sehr merkwürdig.
                    Mal eben das Kosmos-Himmelsjahr zum Vergleich ... die geben erst RA an (was der geografischen Länge entspricht) und dann Dec. So kenne ich das bei irdischen Koordinaten eigentlich auch.

                    Weswegen mich Gunnars long/lat Angabe ja auch verwirrt hatte.

                    Jetzt hast du mich auch verunsichert.

                    Live long and pros healthy,
                     Martin

                    --
                    Paradox: Wieso heißen die Dinger Kühlkörper, obwohl sie höllisch heiß werden?
  2. @@Linuchs

    Kapstadt auf der deutschen Wikipedia-Seite: 33° 55′ S, 18° 25′ O auf der englischsprachigen: 33°55′31″S 18°25′26″E

    Du könntest auch −33° 55′ +18° 25′ (negative Werte für südliche Breite bzw. westliche Länge) als Werte bekommen.

    von einem Dortmunder per Mail: 51° 29' 56.0796'' N und 7° 19' 53.328'' E

    Du könntest auch 51° 29′ 56,0796″ N 7° 19′ 53,328″ E (mit Komma) als Werte bekommen.

    Wer hat schon Minuten- und Sekundenzeichen auf der Tastatur?

    &, p, r, i, m, e, ; sind auf jeder Tastatur zu finden. 😉

    😷 LLAP

    --
    „Sag mir, wie Du Deine Maske trägst, und ich sage Dir, ob Du ein Idiot bist.“ —@Ann_Waeltin