Ho lavorato con questo ulteriormente (e ho notato che hai modificato la tua domanda).
A) Qual è il modo più semplice di chiedere utenti ordinari-non-tech per inserire le coordinate GPS?
La moda facile da usare più semplice, e più per ottenere gli utenti non-tech per inserire i dettagli sarebbe utilizzando Google Maps. Ciò ti consentirebbe di utilizzare Google Geocoder per analizzare il loro input (e fornire un output più standardizzato e formattato). Inoltre, se la posizione in cui l'utente sta inserendo è la loro posizione corrente, è possibile utilizzare la funzionalità di geolocalizzazione offerta da alcuni dei browser moderni.
B) Come posso convertire il sopra per il formato finale? Qualche funzione incorporata che gestisce queste variazioni nell'input dei dati?
Sulla base dei dati di test, ho formulato un'espressione regolare PHP per analizzarlo e restituire un output prevedibile e standardizzato.
$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
}
}
Uscite:
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)
)
Esempio:
// 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]=> ""
)
Si potrebbe quindi, in seguito, elaborare i risultati dell'espressione regolare, per la produzione di un galleggiante per il collegamento Lat/Long così :
// (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);
Che produce:
// 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
Tanto di cappello a Lucanos per uno splendido tentativo ...! Devo ancora provarlo ma un rapido sguardo mostra che è esattamente/molto vicino a quello di cui ho bisogno !!! – Dave
si utilizza la moltiplicazione -1 solo sull'ultimo componente durante la conversione in float. Il tuo codice dà risultati diversi da quelli che hai elencato nella risposta, per correggerlo devi cambiare la traduzione in '$ latitude = ($ corrisponde a [1] + ((int) $ corrisponde a [2]/60) + ((int) $ matches [3]/3600)) * (strtolower ($ matches [4]) == 's' - 1: 1); $ longitudine = ($ corrisponde a [5] + ((int) $ corrisponde a [6]/60) + ((int) $ corrisponde a [7]/3600)) * (strtolower ($ corrisponde [8]) == ' w '- 1: 1); ' – Kyborek