Compare Coordinates

Asked

Viewed 1,838 times

5

In my mysql I have a column containing positioning coordinates coming from a polygon, drawn in the google maps api, the question is how can I compare the coordinates I have within the column with coordinate specific coming from a GET

I will illustrate:

// 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 pass on my idea

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)  |     |
  +----------+--------+------+------------------------+-----+
  • 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.

  • 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

  • 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.

  • 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.

  • 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

  • 1

    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'";

Show 1 more comment

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 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
  • Hey, buddy, uh, uh... Perfect That’s just what I needed, now just a doubt... when I consult the Bank Post the coordinates come without QUOTES how can I treat this?

  • What is the type of polygon column data? When you get it in php, how exactly does it present itself?

  • So is he in the column (-22.891996181150216, -43.127254512695345), (-22.86529776201615, -43.09548266210936)

  • If it is a string, you can do so https://gist.github.com/rodorgas/db0128db300445a6eb5dee9fe6319339 . If that’s not right, the ideal is to open another question, so we can discuss the problem better without shifting the focus of discussion here.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.