2010-06-16 14 views
5

sto provando a creare supporto per le posizioni nella mia applicazione e mi aspetto che gli utenti inseriscano le coordinate GPS in vari modi. Devo convertire tutto quanto segue in: latitudine - direzione (N/s), gradi, minuti, secondi; longitudine (E/W) - gradi, minuti, secondi.conversione di latitudine/longitudine GPS da diversi formati in un formato (in PHP)

Nota, ogni input dell'utente sarà in una singola riga. Vorrei che i miei utenti di inserire solo in un unico modo, ma ppl sicuramente entrare come uno dei seguenti ...:

esempio: 9,182, -39,140625
9,182/-39,140625
9,182, -39,140625
9,182 -39,140625
21 ° 16' 674S [some_separator] 27 ° 30' 318E
21 16 674S [some_separator] 27 30 318E

[some_separator] può essere un singolo spazio pure ...

il formato finale ha bisogno di Beas:
latitude.direction = sud
latitude.degrees = 21
latitude.minutes = 16
latitude.seconds = 674
longitude.direction = est
longitude.degrees = 27
longitude.minutes = 30
longitude.seconds = 318

(a) qual è il modo più semplice di chiedere agli utenti ordinario-non-tech per inserire il COORDINA GPS te? s
(b) come faccio a convertire il sopra nel formato finale? funzioni incorporate che gestiscono queste variazioni nell'input dei dati?

ho visto GPS format in PHP - ma ho bisogno di gestire un input più vario.

risposta

11

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 
+0

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

+0

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

0
  1. divisione latitudine e longitudine, utilizzando explode() o preg_split().
  2. Per latitudine e longitudine, determinare se viene fornito come float o con minuti.
  3. convertire il valore in gradi (come float)
1

penso che il modo migliore sarebbe quella di limitare l'input dell'utente, per quanto possibile, in modo che possano entrare solo i dati validi. Chiedere all'utente di separare i dati in token per te, invece di provare a rendere conto di ogni singola possibilità. Usa il maggior numero di caselle di testo/menu a discesa/ecc. Necessari per forzare l'utente a popolare correttamente i dati. Penso che sarebbe auspicabile ridurre al minimo l'importo & variazioni di analisi del testo che farai.

In che formato vengono inseriti i dati degli utenti? Se è solo un decimale lat/long e.g (50.32,123.55), allora semplicemente hanno due input numerici che possono compilare e possibilmente includere un valore di esempio nella casella. Se gli utenti ottengono i loro dati in gradi/minuto/secondo formato, hanno esattamente questi campi che devono compilare per ogni latitudine e longitudine. Se si accettano entrambe le rappresentazioni decimali di &, dovrebbe coprire tutti gli utenti.

avere tanti input come necessario per abbattere i dati in numero sufficiente di gettoni che garantisce la coerenza quando si interpretano nel vostro programma!

MODIFICA: Un'idea funky se la trovi accettabile per il tuo sito sarebbe avere una mappa di Google dove l'utente trascina un indicatore nella posizione desiderata. È quindi possibile ottenere le coordinate GPS in modo coerente da quel marcatore e utilizzarlo per qualsiasi ulteriore lavoro necessario!

0

tuo metodo migliore (ma, certamente, almeno garantito) è quello di guidare il comportamento degli utenti per cercare di farli formattare i dati in un formato standardizzato e facilmente analizzato. Anche solo avere uno o due semplici formati principali per provare a incoraggiarli a convertire sarebbe un passo eccellente e ridurre la quantità di correzione/formattazione degli errori richiesta.

di là di questo, vorrei suggerire che la creazione di espressioni regolari, e le funzioni dietro quelle espressioni regolari per standardizzare i dati che si intende utilizzare sarebbe una soluzione.

Ho eseguito alcuni RegExps rispetto ai dati di test forniti, ma ho problemi a creare una soluzione antiproiettile a tale riguardo (potrebbe essere necessario disporre di alcuni modelli diversi per raccogliere ciascuna combinazione).

Ho anche provato ad analizzare alcuni dei dati di test forniti tramite il Google Geocoding API (che è, di solito, un sistema abbastanza flessibile, che consente l'indirizzamento di testo semplice, nonché più formati Lat/Long), ma, nessuna gioia.

Più standard i dati arrivano, più facile creare informazioni accurate che escano. Forse l'integrazione di una mappa (Google Maps o altro) nella fase di input consentirebbe di convalidare l'input in modo più accurato.

Problemi correlati