PHP function to detect Point in Polygon:
function contains($point, $polygon) { if($polygon[0] != $polygon[count($polygon)-1]) $polygon[count($polygon)] = $polygon[0]; $j = 0; $oddNodes = false; $x = $point[1]; $y = $point[0]; $n = count($polygon); for ($i = 0; $i < $n; $i++) { $j++; if ($j == $n) { $j = 0; } if ((($polygon[$i][0] < $y) && ($polygon[$j][0] >= $y)) || (($polygon[$j][0] < $y) && ($polygon[$i][0] >= $y))) { if ($polygon[$i][1] + ($y - $polygon[$i][0]) / ($polygon[$j][0] - $polygon[$i][0]) * ($polygon[$j][1] - $polygon[$i][1]) < $x) { $oddNodes = !$oddNodes; } } } return $oddNodes; }
Test for convex polygon:
$polygon = array( array(0,0), array(0,5), array(4,3), array(3,0), array(0,0), ); $point1 = array(3,3); echo contains($point1,$polygon)?'IN':'OUT'; echo "<br />"; $point2 = array(4,4); echo contains($point2,$polygon)?'IN':'OUT';
Result:
IN
OUT
Test for concave polygon:
$polygon = array( array(0,0), array(0,5), array(2,2), array(4,3), array(4,0), array(2,1), array(0,0), ); $point1 = array(1,4); echo contains($point1,$polygon)?'IN':'OUT'; echo "<br />"; $point2 = array(3,2); echo contains($point2,$polygon)?'IN':'OUT'; echo "<br />"; $point3 = array(2,0.5); echo contains($point3,$polygon)?'IN':'OUT';
Result:
OUT
IN
OUT
Note: we only apply this method for simple polygon (non-self-intersecting polygon).
Test for complex polygon (self-intersecting polygon)
$polygon = array( array(0,5), array(3,5), array(3,0), array(4,3), array(0,5), ); $point1 = array(1,4); echo contains($point1,$polygon)?'IN':'OUT'; echo "<br />"; $point2 = array(3,2); echo contains($point2,$polygon)?'IN':'OUT'; echo "<br />"; $point3 = array(2,0.5); echo contains($point3,$polygon)?'IN':'OUT';
Result:
OUT
OUT
OUT
Error for point 2.