2015-06-14 8 views
8

Używam MKMapView i wysyłam program php w widoczny region (środek lat, centrum lon, span lat, span lon). Muszę ustalić, czy współrzędne znajdują się w tym regionie za pomocą php. Mam nadzieję, że gdzieś istnieje standardowa formuła, ale ja jej nie znalazłem. Będę starał się wymyślić formułę, ale jest to zaskakująco skomplikowane (mam nadzieję, że nie tak bardzo jak haversine, o którym nie wierzę, że mogłem sam się zorientować).Ustal, czy współrzędne znajdują się w regionie (MKMapView, rozwiąż w PHP)

Odpowiedz

1

moje rozwiązanie

$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) 
{ 

} 

To wydaje się działać z MKMapView od szerokości geograficznej regionu są zawsze pomiędzy -90 i 90.

+1

Spojrzałem na ciebie i coś mi się nie podobało, zrobiłem test z centrum (179,89) i rozpiętością (20,20) i punktem (-179, -89) i wyszedłem na zewnątrz, ale punkt jest w środku, ponieważ 179 + 10 = 189 w wyniku -171 i 89 + 10 = 99 w wyniku -81, więc punkt znajduje się pomiędzy środkowym i prawym górnym rogiem. – Macerier

+0

mapView tylko przewija się od lewej do prawej, więc nigdy nie możesz mieć centa lat 89 i rozpiętości większej niż 2. Zasadniczo stworzyłem dwa regiony i przetestowałem je, jeśli region przekroczył 180 lub -180. również twój anwswer jest użyteczny, ale przykładowy punkt wygląda tak, jakby był na zewnątrz przez tę logikę, kiedy jest w środku. ('$ pointLongitude> $ bottomLeftLongitude') –

0

Ta logika powinno działać:

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

Życzę było to proste. Powinienem był wyjaśnić, współrzędne szerokości "mapView.region" wynoszą -90 do 90, a długość geograficzna -180 do 180. To trudna część. Jeśli długość punktu wynosiła -179, a centrum regionu Długość = 179 z 20 rozpiętościami, trzeci warunek powyżej byłby fałszywy, ale punkt mógł nadal być w środku. –

3

spróbujmy Ta logika

$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 

jeśli masz

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

wyniki

$topRightLongitude = -171; 
$bottomLeftLongitude = 169; 

więc chodzi o to, jeśli testować tak:

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

Pracowałem rozwiązanie dla własnego problemu wcześniej, ale dla wartości dziesiętnych współrzędnych i to działa. Może być, jeśli możesz przekonwertować deg na dziesiętny, może to zadziałać.

Zmieniono nazwę zmiennej zgodnie z Twoim problemem.

Oto logika.

if 
(
    (
     ($lat - $spanLat) < $centerLat && 
     $centerLat < ($lat+ $spanLat) 
    ) && 
    (
     ($long - $spanLong) < $centerLong && 
     $centerLong < ($long + $spanLong) 
    ) 
) 
Powiązane problemy