2009-12-09 29 views
15

Estoy usando PostgreSQL con la extensión GIS para almacenar datos de mapas, junto con OpenLayers, GeoServer, etc. Dado un polígono, p. 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 GROUP BY, en lugar de iterar sobre cada polígono).En PostGIS, ¿cómo puedo encontrar todos los puntos dentro de un polígono?

¿Estas funciones son algo que necesito programar o la funcionalidad está disponible (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 bastará PostgreSQL?

Gracias!

Respuesta

11

En PostGIS puede usar el operador de caja delimitadora para buscar candidatos, que es muy eficiente ya que usa índices GiST. Luego, si se requieren coincidencias estrictas, use el operador contains.

Algo así 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 */ 

Sobre si esto es necesario, depende de sus necesidades. Para que lo anterior funcione, sin duda necesita instalar PostGIS y GEOS. Pero, si la coincidencia de cuadro delimitador es suficiente, puede codificarla simplemente en SQL que no necesita PostGIS.

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

+1

Ver también [ST_DWithin] (http://www.postgis.org/docs/ST_DWithin.html). –

4

Creo ST_Contains reescribe automáticamente la consulta para utilizar el cuadro delimitador del GiST indexados, como lo señala:

"Esta llamada a la función automáticamente incluir una comparación cuadro delimitador que hará uso de cualquier í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

+0

Esto es más un comentario que una respuesta. – RickyA

+0

Es una respuesta según las preguntas frecuentes de SO. – IamIC

2

ST_Contains resolverían el 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 
Cuestiones relacionadas