Ich habe damit weiter gearbeitet (und ich merke, dass Sie Ihre Frage bearbeitet haben).
A) Was ist die einfachste Art, Benutzer von normalen Nicht-Technikern zu bitten, die GPS-Koordinaten einzugeben?
Die einfachste und benutzerfreundlichste Methode, um Nichttechniker zur Eingabe von Details zu bewegen, wäre die Verwendung von Google Maps. Auf diese Weise können Sie den Google Geocoder verwenden, um ihre Eingaben zu analysieren (und eine standardisierte und formatierte Ausgabe bereitzustellen). Wenn der Ort, den der Benutzer eingibt, sein aktueller Standort ist, könnten Sie sich außerdem die Geolocation-Funktionalität einiger moderner Browser ansehen.
B) Wie konvertiere ich das oben genannte in das endgültige Format? Irgendwelche eingebauten Funktionen, die diese Variationen in der Dateneingabe handhaben?
Basierend auf Ihren Testdaten habe ich einen regulären PHP-Ausdruck formuliert, um ihn zu parsen und eine vorhersehbare und standardisierte Ausgabe zu liefern.
$rexp = '/^(\-?\d+(?:\.\d+)?)(?:\D+(\d+)\D+(\d+)([NS]?))?[^\d\-]+(\-?\d+(?:\.\d+)?)(?:\D+(\d+)\D+(\d+)([EW]?))?$/i';
$data = array(
"21° 16' 674S, 27° 30' 318E" ,
'21 16 674S, 27 30 318E' ,
'9.182, -39.140625' ,
'9.182/-39.140625' ,
'9.182,-39.140625' ,
'9.182 -39.140625'
);
foreach($data as $test) {
if(!preg_match($rexp , $test , $matches)) {
echo '<b>Failed</b>';
} else {
// Match Found
}
}
Ausgänge:
array(
[0] => Matched Text ,
[1] => Full Degrees ,
[2] => Minutes ,
[3] => Seconds ,
[4] => Hemisphere (N or S) ,
[5] => Full Degrees ,
[6] => Minutes ,
[7] => Seconds ,
[8] => Hemisphere (E or W)
)
Beispiel:
// Matching 21° 16' 674S, 27° 30' 318E
array(
[0] => "21° 16' 674S, 27° 30' 318E" ,
[1] => "21" , [2] => "16" , [3] => "674" , [4] => "S" ,
[5] => "27" , [6] => "30" , [7] => "318" , [8] => "E"
)
// Matching 21 16 674S, 27 30 318E
array(
[0]=> "21 16 674S, 27 30 318E" ,
[1]=> "21" , [2]=> "16" , [3]=> "674" , [4]=> "S" ,
[5]=> "27" , [6]=> "30" , [7]=> "318" , [8]=> "E"
)
// Matching 9.182, -39.140625
array(
[0]=> "9.182, -39.140625" ,
[1]=> "9.182" , [2]=> "" , [3]=> "" , [4]=> "" ,
[5]=> "-39.140625" , [6]=> "" , [7]=> "" , [8]=> ""
)
// Matching 9.182/-39.140625
array(
[0]=> "9.182/-39.140625" ,
[1]=> "9.182" , [2]=> "" , [3]=> "" , [4]=> "" ,
[5]=> "-39.140625" , [6]=> "" , [7]=> "" , [8]=> ""
)
// Matching 9.182,-39.140625
array(
[0]=> "9.182,-39.140625" ,
[1]=> "9.182" , [2]=> "" , [3]=> "" , [4]=> "" ,
[5]=> "-39.140625" , [6]=> "" , [7]=> "" , [8]=> ""
)
// Matching 9.182 -39.140625
array(
[0]=> "9.182 -39.140625" ,
[1]=> "9.182" , [2]=> "" , [3]=> "" , [4]=> "" ,
[5]=> "-39.140625" , [6]=> "" , [7]=> "" , [8]=> ""
)
Sie dann könnte anschließend Prozess die Ergebnisse der Regular Expression, einen Schwimmer für die Breite/Länge Link zu erzeugen, so :
// (Replacing the "Match Found" comment)
$latitude = $matches[1]+((int)$matches[2]/60)+((int)$matches[3]/3600)*(strtolower($matches[4])=='s'?-1:1);
$longitude = $matches[5]+((int)$matches[6]/60)+((int)$matches[7]/3600)*(strtolower($matches[8])=='w'?-1:1);
Who produziert:
// Matching 21° 16' 674S, 27° 30' 318E
$latitude = -21.4538888889
$longitude = 27.5883333333
// Matching 21 16 674S, 27 30 318E
$latitude = -21.4538888889
$longitude = 27.5883333333
// Matching 9.182, -39.140625
$latitude = 9.182
$longitude = -39.140625
// Matching 9.182/-39.140625
$latitude = 9.182
$longitude = -39.140625
// Matching 9.182,-39.140625
$latitude = 9.182
$longitude = -39.140625
// Matching 9.182 -39.140625
$latitude = 9.182
$longitude = -39.140625
Hut ab nach Lucanos für einen wunderbaren Versuch ...! Ich muss es noch testen, aber ein kurzer Blick zeigt, dass es genau/sehr nah an dem ist, was ich brauche !!! – Dave
Sie verwenden -1 Multiplikation nur für die letzte Komponente beim Übersetzen in float. Ihr Code gibt andere Ergebnisse als die, die Sie in der Antwort aufgelistet haben. Um ihn zu beheben, müssen Sie die Übersetzung in '$ latitude = ändern ($ matches [1] + ((int) $ matches [2]/60) + ((int) $ matches [3]/3600)) * (strtolower ($ matches [4]) == 's'? - 1: 1); $ longitude = ($ Übereinstimmungen [5] + ((int) $ Übereinstimmungen [6]/60) + ((int) $ Übereinstimmungen [7]/3600)) * (strtolower ($ matches [8]) == ' w '? - 1: 1); ' – Kyborek