2015-06-14 11 views
8

Sto usando MKMapView e invio il mio programma php alla regione visibile (centro lat, centro lon, span lat, span lon). Devo determinare se una coordinata si trova all'interno di quella regione usando php. Spero che ci sia una formula standard da qualche parte, ma non l'ho trovata. Continuerò a cercare di trovare una formula, ma è sorprendentemente complicata (spero non tanto quanto la haversine, che non credo di aver capito da solo).Determina se la coordinata è all'interno della regione (MKMapView, risolvi in ​​PHP)

risposta

1

mia soluzione

$top = $c_lat + ($d_lat/2.0); 
$bottom = $c_lat - ($d_lat/2.0); 
$left = $c_lon - ($d_lon/2.0); 
$right = $c_lon + ($d_lon/2.0); 
if($left < -180) 
{ 
    $second_left = $left + 360.0; 
    $second_right = 180.0; 
    $left = -180; 
} 
elseif($right > 180) 
{ 
    $second_right = $right - 360.0; 
    $second_left = -180.0; 
    $right = 180.0; 
} 
$inside = false; 
if($t_lat > $bottom && $t_lat < $top && $t_lon > $left && $t_lon < $right) 
    $inside = true; 
else if($second_right && $second_left) 
{ 
    if($t_lat > $bottom && $t_lat < $top && $t_lon > $second_left && $t_lon < $second_right) 
     $inside = true; 
} 

if($inside) 
{ 

} 

Questo sembra funzionare con MKMapView dal momento che le latitudini regione sia sempre compresa tra -90 e 90.

+1

ho guardato il tuo codice e qualcosa mi sembrava sbagliato, ho fatto un test con il centro (179,89) e l'intervallo (20,20) e il punto (-179, -89) e sono uscito fuori ma il punto è all'interno perché 179 + 10 = 189 risultante -171 e 89 + 10 = 99 risultante -81 quindi il punto è tra il centro e l'angolo in alto a destra. – Macerier

+0

mapView scorre solo da sinistra a destra in modo da non avere mai un centro lat di 89 e uno span di più di 2. In pratica ho appena creato due regioni e le ho provate entrambe se la regione ha superato 180 o -180. inoltre, la tua risposta è utile, ma il punto di esempio sembra essere fuori da quella logica, quando è effettivamente dentro. ('$ pointLongitude> $ bottomLeftLongitude') –

0

Questa logica dovrebbe funzionare:

if (($X > $center_lat - $span_lat/2) && 
     ($X < $center_lat + $span_lat/2) && 
     ($Y > $center_lon - $span_lon/2) && 
     ($Y < $center_lon + $span_lon/2)) { 
    echo "It's inside!"; 
} else { 
    echo "It's outside ..."; 
} 
+0

Vorrei che fosse così semplice. Avrei dovuto chiarire, le coordinate di latitudine 'mapView.region' sono da -90 a 90 e la longitudine da -180 a 180. Questa è la parte difficile. Se la longitudine puntuale era -179 e la regione centerLongitude = 179 con 20 span, la terza condizione precedente sarebbe falsa, ma il punto potrebbe ancora essere all'interno. –

3

Proviamo questa logica

$topRightLongitude = $centerLongitude + $spanLongitude/2; 
if($topRightLongitude > 180 and ($pointLongitude < 0)) 
    $topRightLongitude = $topRightLongitude - 360; // (180*2) - positive becomes negative 

$bottomLeftLongitude = $centerLongitude - $spanLongitude/2; 
if($bottomLeftLongitude< -180 and ($pointLongitude > 0)) 
    $bottomLeftLongitude= 360 + $bottomLeftLongitude; // now is negative and will become positive 

$topRightLatitude = $centerLatitude + $spanLatitude/2; 
if($topRightLatitude > 90 and ($pointLatitude < 0)) 
    $topRightLatitude = $topRightLatitude - 180; // (90*2) - positive becomes negative 

$bottomLeftLatitude = $centerLatitude - $spanLatitude/2; 
if($bottomLeftLatitude< -90 and ($pointLatitude > 0)) 
    $bottomLeftLatitude= 180 + $bottomLeftLongitude; // now is negative and will become positive 

se avete

$centerLongitude = 179; 
$spanLongitude = 20; 
$pointLongitude = -179; 

risultati

$topRightLongitude = -171; 
$bottomLeftLongitude = 169; 

in modo che il punto è se si prova in questo modo:

if($pointLongitude < $topRightLongitude && 
    $pointLongitude > $bottomLeftLongitude && 
    $pointLatitude < $topRightLatitude && 
    $pointLatitude > $bottomLeftLatitude){ 
    echo 'in'; 
}else{ 
    echo 'out'; 
} 
0

avevo lavorato una soluzione per il mio problema prima, ma per i valori decimali di coordinate e funziona. Può essere se puoi convertire deg in decimale potrebbe funzionare.

Ho rinominato la variabile in base al problema.

Ecco la logica.

if 
(
    (
     ($lat - $spanLat) < $centerLat && 
     $centerLat < ($lat+ $spanLat) 
    ) && 
    (
     ($long - $spanLong) < $centerLong && 
     $centerLong < ($long + $spanLong) 
    ) 
) 
Problemi correlati