To check if a point belongs to a polygon, you can use this algorithm:
class pointLocation {
var $pointOnVertex = true; // Check if the point sits exactly on one of the vertices?
function pointLocation() {
}
function pointInPolygon($point, $polygon, $pointOnVertex = true) {
$this->pointOnVertex = $pointOnVertex;
// Transform string coordinates into arrays with x and y values
$point = $this->pointStringToCoordinates($point);
$vertices = array();
foreach ($polygon as $vertex) {
$vertices[] = $this->pointStringToCoordinates($vertex);
}
// Check if the point sits exactly on a vertex
if ($this->pointOnVertex == true and $this->pointOnVertex($point, $vertices) == true) {
return "no vértice";
}
// Check if the point is inside the polygon or on the boundary
$intersections = 0;
$vertices_count = count($vertices);
for ($i=1; $i < $vertices_count; $i++) {
$vertex1 = $vertices[$i-1];
$vertex2 = $vertices[$i];
if ($vertex1['y'] == $vertex2['y'] and $vertex1['y'] == $point['y'] and $point['x'] > min($vertex1['x'], $vertex2['x']) and $point['x'] < max($vertex1['x'], $vertex2['x'])) { // Check if point is on an horizontal polygon boundary
return "na borda";
}
if ($point['y'] > min($vertex1['y'], $vertex2['y']) and $point['y'] <= max($vertex1['y'], $vertex2['y']) and $point['x'] <= max($vertex1['x'], $vertex2['x']) and $vertex1['y'] != $vertex2['y']) {
$xinters = ($point['y'] - $vertex1['y']) * ($vertex2['x'] - $vertex1['x']) / ($vertex2['y'] - $vertex1['y']) + $vertex1['x'];
if ($xinters == $point['x']) { // Check if point is on the polygon boundary (other than horizontal)
return "na borda";
}
if ($vertex1['x'] == $vertex2['x'] || $point['x'] <= $xinters) {
$intersections++;
}
}
}
// If the number of edges we passed through is odd, then it's in the polygon.
if ($intersections % 2 != 0) {
return "dentro";
} else {
return "fora";
}
}
function pointOnVertex($point, $vertices) {
foreach($vertices as $vertex) {
if ($point == $vertex) {
return true;
}
}
}
function pointStringToCoordinates($pointString) {
$coordinates = explode(",", $pointString);
return array("x" => $coordinates[0], "y" => $coordinates[1]);
}
}
Credit and implementation details on http://assemblysys.com/php-point-in-polygon-algorithm/
To use it, do something like:
// Obtenha o polígono do banco de dados e salve num array nesse formato, sabendo
// que o último ponto deve ser igual ao primeiro pra fechar o polígono
$poligono = array(
"-22.91602,-41.97678",
"-22.94322,-42.11171",
"-23.02634,-41.99945",
"-22.91602,-41.97678",
);
// Coloque as coordenadas obtidas pelo $_GET assim
$coordenada = "-22.91602,-41.97678";
$pointLocation = new pointLocation();
echo "o ponto ($coordenada): está ".
$pointLocation->pointInPolygon($coordenada, $poligono).
" do polígono";
// Saída: o ponto (-22.91602,-41.97678) está no vertice do polígono
Hello friend, what kind of comparison do you want to perform? If that specific coordinate you received is inside the polygon of the google maps api? Try to detail a little more your goal.
– Daniel Beff
Hello friend, that’s right... in mysql I have a column where is the strings of the Poligono so I just want to check if these coordinates are inside the Poligono
– Fabio Henrique
Have a question like this in this post http://stackoverflow.com/questions/13950062/checking-if-a-longitude-latitude-coordinate-resides-insida-complex-polygon-in the idea is to convert the latitude and longitude into x and y positions within the map, and then compare if these coordinates x and y are within the area of this polygon.
– Daniel Beff
Do you need to check if a point belongs to a specific polygon or find which polygon in a database belongs to the specified coordinate? If it is the second case, it is fundamental to know its data structure.
– rodorgas
Hello Friend above put like this my table. and at first I need to check if a point belongs to a specific polygon . thanks for your attention
– Fabio Henrique
You want to know if a point is within the area of a Poligono, is that it? If so, what I recommend is you record the Poligono in the geometry format that Mysql offers. So you can make queries of this type and others (if a point is in a line, if lines cross, if point is in a Poligono, etc.) see an example:
"SELECT points.name FROM polygons, points WHERE ST_CONTAINS(polygons.geom, Point(points.longitude, points.latitude)) AND polygons.name = 'California'";
– GilCarvalhoDev