Paul Ramsey wrote:
On Tue, May 20, 2008 at 8:40 AM, Kevin Neufeld <[EMAIL PROTECTED]> wrote:
a1001800 wrote:
Thanks Kevin,

It looks like ~= not invoke the index.
That's why I suggested the && operator as well.  It does use the index.

Do we have a way to deal with an index with third value?
For example, point (x, y) and userid

I need to do a query like "select point(x,y) from table where point in
rectangle and userid=xxx"
Sure.  Add the userid=xxx to your filter list like you were doing.
ie.
SELECT ST_MakePoint(x,y)
FROM mytable
WHERE geom && <insert rectangle geom here>
AND userid = xxx;

You can additionally add an ST_Contains() filter if you need to have
your points exactly inside the rectangle.

No, don't do that :)  "point && rectangle" is logically the same as
"st_contains(rectangle, point)" and somewhat cheaper.


:) I disagree Paul. These are not logically the same - they are very close, but not the same. The bounding box coordinates are stored using 4 bytes instead of the 8 bytes used to hold the rectangle's actual coordinates. The bbox is rounded up to guarantee that the rectangle is contained entirely within it. So, you could have a point that is contained within the bounding box but not the rectangle.

Consider,

SELECT
   a.poly && b.point AS bbox,
   ST_Contains(a.poly, b.point)
FROM
(SELECT 'POLYGON((0 0, 0 1.0000001, 1 1.0000001, 1 0, 0 0))'::geometry AS poly) a,
  (SELECT 'POINT(0.5 1.00000011)'::geometry AS point) b;

 bbox | st_contains
------+----------
 t    | f
(1 row)

-- Kevin

The key is knowing for 100% sure that your polygonal geometry will
*always* be a rectangle. If there's a chance it won't, you need the
st_contains.

P


_______________________________________________
postgis-users mailing list
[email protected]
http://postgis.refractions.net/mailman/listinfo/postgis-users

Reply via email to