¿Realizar una consulta de cuadro delimitador en PostGIS? [cerrado]

16

Tengo una tabla de Postgres, con casi 2 millones de filas, con un campo largo-lat coordinates en el formulario POINT(-73.4938 33.2405) .

Suponiendo que haya un índice geoespacial en ese campo, ¿cuál es la forma más eficiente y rápida de seleccionar todas las filas dentro de un cuadro de límite arbitrario?

El cuadro es como SW long-lat: -74.0042 40.7688 , NE long-lat: -73.8809 40.7984 .

    
pregunta Avishai 17.01.2014 - 17:00

3 respuestas

24

Suponiendo que los límites del cuadro delimitador dados están en el mismo sistema de referencia espacial que las coordenadas almacenadas, y usted sabe qué operador espacial (intersecta o contiene) necesita:

SELECT *
FROM   my_table
WHERE  coordinates 
    && -- intersects,  gets more rows  -- CHOOSE ONLY THE
    @ -- contained by, gets fewer rows -- ONE YOU NEED!
    ST_MakeEnvelope (
        xmin, ymin, -- bounding 
        xmax, ymax, -- box limits
        my_srid)

Alternativamente, si prefieres el sonido de "contiene" (en lugar de "contenido por"), la cláusula WHERE se debería voltear:

WHERE  ST_MakeEnvelope (...)
    ~ -- contains, gets same fewer rows 
    coordinates 

PS: Dado (por OP después de que se publicó lo anterior) que los registros son puntos simples, creo que la diferencia entre "intersecciones" y "contención" se convierte en muy sutil, afectando solo los puntos en los bordes del cuadro delimitador.

    
respondido por el Martin F 18.01.2014 - 01:52
3
SELECT ST_Y(the_geom) AS latitude, ST_X(the_geom) as longitude
from units u where the_geom && ST_MakeEnvelope(left, bottom, right, top, 4326)
    
respondido por el Magno C 17.01.2014 - 17:59
2

Aparentemente, no tengo suficientes puntos para agregar un comentario, así que uso esta Respuesta solo para decir que probé tanto ST_MakeEnvelope como la comparación matemática de "x > min_x y x < max_x e y > min_y y y < max_y "... en promedio, ST_MakeEnvelope tomó 60 ms y la comparación de matemáticas tomó 155 ms en mi consulta particular de bbox.

¡De modo que la búsqueda espacial ST_MakeEnvelope debería ser más rápida que las comparaciones matemáticas!

    
respondido por el Jason 15.12.2014 - 17:16

Lea otras preguntas en las etiquetas