Linuchs: Geo-Umrechnung Bogen- in Dezimalgrade

Beitrag lesen

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