2015-06-14 4 views
8

Ich benutze MKMapView und ich sende meinem PHP-Programm den sichtbaren Bereich (Mitte lat, Mitte lon, span lat, span lon). Ich muss feststellen, ob eine Koordinate innerhalb dieser Region mit PHP ist. Ich hoffe, dass es irgendwo eine Standardformel gibt, aber ich habe keine gefunden. Ich werde immer wieder versuchen, eine Formel zu finden, aber es ist überraschend kompliziert (hoffentlich nicht so sehr wie die Haversine, von der ich nicht glaube, dass ich sie selbst hätte herausfinden können).Ermitteln, ob die Koordinate innerhalb der Region liegt (MKMapView, lösen in PHP)

Antwort

1

Meine Lösung

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

} 

Dies scheint mit MKMapView zu arbeiten, da die Region Breiten immer zwischen -90 und 90.

+1

Ich schaute auf Sie Code und etwas sah falsch zu mir, ich habe einen Test mit Center (179,89) und span (20,20) und Punkt (-179, -89) und ich habe draußen, aber der Punkt ist da drin 179 + 10 = 189 ergibt -171 und 89 + 10 = 99 ergibt -81 also liegt der Punkt zwischen der Mitte und der oberen rechten Ecke. – Macerier

+0

Die mapView scrollt nur von links nach rechts, so dass Sie nie einen mittleren Breitengrad von 89 und einen Bereich von mehr als 2 haben können. Ich habe im Grunde nur zwei Bereiche erstellt und beide getestet, wenn die Region sich über 180 oder 180 kreuzt. Außerdem ist Ihr Antwortsignal nützlich, aber der Beispielpunkt sieht aus, als wäre er außerhalb dieser Logik, wenn er tatsächlich darin ist. ('$ pointLongitude> $ bottomLeftLongitude') –

0

sollten Diese Logik arbeiten:

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

Ich wünschte, es so einfach war. Ich hätte klarstellen sollen, dass die Breitengrade der 'mapView.region' -90 bis 90 und Länge -180 bis 180 sind. Das ist der schwierige Teil. Wenn die Punktlänge -179 und die Region MitteLänge = 179 mit 20 Spanne wäre, wäre die dritte Bedingung oben falsch, aber der Punkt könnte immer noch drin sein. –

3

können diese Logik versuchen

$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 

wenn Sie

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

Ergebnisse haben

$topRightLongitude = -171; 
$bottomLeftLongitude = 169; 

so Ihr Punkt ist, wenn Sie so testen:

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

ich vor, eine Lösung für mein eigenes Problem gearbeitet hatte, aber für Dezimalwerte von Koordinaten und es funktioniert. Kann sein, wenn Sie Grad in Dezimal konvertieren können, könnte es funktionieren.

Ich habe die Variable nach Ihrem Problem umbenannt.

Hier ist die Logik.

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