[postgis-users] 3D index in postgis

Kevin Neufeld kneufeld at refractions.net
Tue May 20 12:31:32 PDT 2008


Paul Ramsey wrote:
> On Tue, May 20, 2008 at 8:40 AM, Kevin Neufeld <kneufeld at refractions.net> 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





More information about the postgis-users mailing list