st_within st_geomfromtext st_covers st_contains example polygon postgis

polygon - st_geomfromtext - En PostGIS, ¿cómo encuentro todos los puntos dentro de un polígono?



st_covers (3)

Creo que ST_Contains reescribe automáticamente la consulta para usar el cuadro delimitador indexado con GiST, como se observa:

"Esta llamada a la función incluirá automáticamente una comparación de cuadro de límite que hará uso de los índices disponibles en las geometrías. Para evitar el uso del índice, use la función _ST_Contains".

http://postgis.refractions.net/docs/ST_Contains.html

Estoy usando PostgreSQL con la extensión GIS para almacenar datos de mapas, junto con OpenLayers, GeoServer, etc. Dado un polígono, por ejemplo, de un vecindario, necesito encontrar todos los puntos LAT / LONG almacenados en alguna tabla (por ejemplo, semáforos, restaurantes) que Están dentro del polígono. Alternativamente, dado un conjunto de polígonos, me gustaría encontrar el conjunto de puntos dentro de cada polígono (como una consulta GRUPO POR, en lugar de iterar sobre cada polígono).

¿Son estas funciones algo que necesito programar, o está disponible la funcionalidad (como SQL extendido)? Por favor elabora.

También para los datos 2D simples que tengo, ¿realmente necesito la extensión GIS (la licencia GPL es una limitación) o PostgreSQL será suficiente?

¡Gracias!


En PostGIS puede usar el operador de cuadro delimitador para encontrar candidatos, lo cual es muy eficiente ya que utiliza índices GiST. Luego, si se requieren coincidencias estrictas, use el operador de contenidos.

Algo como

SELECT points,neighborhood_name from points_table,neighborhood WHERE neighborhood_poly && points /* Uses GiST index with the polygon''s bounding box */ AND ST_Contains(neighborhood_poly,points); /* Uses exact matching */

Acerca de si esto es necesario, depende de sus necesidades. Para que lo anterior funcione, sin duda necesitas instalar PostGIS y GEOS. Pero, si la coincidencia del cuadro delimitador es suficiente, puede codificarlo simplemente en SQL sin necesidad de PostGIS.

Si se requieren coincidencias exactas, los algoritmos de contención están disponibles públicamente, pero para implementarlos de manera eficiente se requiere un poco de esfuerzo implementándolos en una biblioteca a la que luego se llamaría desde SQL (como GEOS).


ST_Contains solucionaría tu problema.

SELECT polygon.gid, points.x, points.y FROM polygons LEFT JOIN points ON st_contains(polygon.geom, points.geom) WHERE polygon.gid=your_id