Performing bounding box query in PostGIS?
Assuming the given bounding box limits are in the same spatial reference system as the stored coordinates, and you know which spatial operator (intersects or contained by) you need:
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)
Alternatively, if you prefer the sound of "contains" (instead of "contained by") the WHERE
clause should be flipped:
WHERE ST_MakeEnvelope (...)
~ -- contains, gets same fewer rows
coordinates
PS: Given (by OP after the above was posted) that the records are simple points, I think that the difference between "intersects" and "containment" becomes very subtle, affecting only the points on the edges of the bounding box.
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)
I tried both ST_MakeEnvelope vs the maths compare of "x > min_x and x < max_x and y > min_y and y < max_y" ...on average ST_MakeEnvelope took 60ms and maths compare took 155ms on my particular bbox query.
So the spatial search ST_MakeEnvelope should be faster than maths compare!