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