Compare Coordinates

5

In my mysql I have a column where it contains positioning coordinates coming from a polygon, drawn in google maps api, the question is how can I compare the coordinates I have inside the column with a specified coordinate coming from a GET

I'll give you an example:

// Exemplo
$lat  = $_GET['lat'];  // -22.970981
$long = $_GET['long']; // -43.217496 

$cordenada = $lat.','.$long;

$sql = "SELECT * FROM gps Where poligono = '$cordenada' ";
$resultado = mysql_query($sql) or die( mysql_error());

// ai daqui pra frente eu vou sozinho
if ($result existir ){
faço alguma coisa
}

This is just a grotesque example to get my idea across.

mysql table

  +----------+--------+------+------------------------+-----+
  | id_cerca | in_out | nome |       poligono         | id  |
  +----------+--------+------+------------------------+-----+
  |     01   |  in    | Fim  | (-22.91602,-41.97678), |  2  |
  |          |        |      | (-22.94322,-42.11171), |     |
  |          |        |      | (-23.02634,-41.99945)  |     |
  +----------+--------+------+------------------------+-----+
    
asked by anonymous 26.03.2016 / 20:46

1 answer

3

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 at link

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
    
01.04.2016 / 00:30