[postgis-users] Querying geometries with different srid

Farrukh Najmi farrukh at wellfleetsoftware.com
Fri Jan 14 07:33:33 PST 2011


Hi Ralph,

Thanks so very much for your help.

In my PG 8.3 PostGIS 1.3.3 setup when I try to run explain on the nested 
select version of my query I get:

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  Nested Loop IN Join  (cost=0.00..2.69 rows=1 width=358)
    Join Filter: (gvt.id = gvt1.id)
    ->  Seq Scan on geometryvaluetype gvt  (cost=0.00..1.33 rows=1 
width=358)
          Filter: (st_srid(geometry) = 4326)
    ->  Seq Scan on geometryvaluetype gvt1  (cost=0.00..1.27 rows=7 width=8)
          Filter: within(gvt1.geometry, 
'0103000020E6100000010000000500000000000000000059C00000000000000000000000000000000000000000000000000000000000000000000000000000594000000000000059C0000000000000594000000000000059C00000000000000000'::geometry)
(6 rows)

Based on above it seems I am first filtering on SRID - No?

What am I missing?

Can you tell me what my query should look like to make it work?


On 01/14/2011 10:12 AM, Ralf Suhr wrote:
> Hi Farrukh,
>
> you have to first check for the right srid before you can compare the bbox. If
> you use the SQL command EXPLAIN for your query yyou can see what will be done.
>
> SELECT *
> FROM GeometryValueType gvt
> WHERE gvt.id IN (
>      SELECT gvt1.id
>      FROM GeometryValueType gvt1
>      WHERE ST_SRID(gvt.geometry) = 4326
>       ) AND Within(gvt1.geometry, ST_GeomFromText('POLYGON((-100 0, 0 0, 0
> 100, -100 100, -100 0))', 4326)) = true;
>
> Gr
> Ralf
>
> Am Freitag 14 Januar 2011, 15:55:31 schrieb Farrukh Najmi:
>> BTW, using nested SELECT did not work either as shown in follow query:
>>
>> SELECT * FROM GeometryValueType gvt WHERE
>>       ST_SRID(gvt.geometry) = 4326 AND gvt.id IN (
>>         SELECT gvt1.id FROM GeometryValueType gvt1 WHERE
>>           within(gvt1.geometry, ST_GeomFromText('POLYGON((-100 0, 0 0, 0
>> 100, -100 100, -100 0))', 4326)) = true
>>       )
>>
>>
>> It again gives the "Operation on mixed SRID geometries" error :-(
>>
>> It seems to me that surely this should be doable. If it is not doable,
>> do folks think that is an issue that should be tracked?
>>
>> On 01/14/2011 09:49 AM, Farrukh Najmi wrote:
>>> Hi Ture,
>>>
>>> Thanks for the advice. Unfortunately WITH is not supported in postgres
>>> 8.3. So I could not try it out.
>>>
>>> Any other ideas?
>>>
>>> On 01/14/2011 12:38 AM, Ture Pålsson wrote:
>>>> 2011/1/14 Farrukh Najmi<farrukh at wellfleetsoftware.com>:
>>>>>> --Gives Error: Operation on mixed geometries
>>>>>> SELECT * FROM GeometryValueType gvt WHERE ( ST_SRID(gvt.geometry) =
>>>>>> 4326
>>>>>> AND
>>>>>>
>>>>>>    within(gvt.geometry, ST_GeomFromText('POLYGON((-100 0, 0 0, 0
>>>>>>
>>>>>> 100, -100
>>>>>> 100, -100 0))', 4326)) = true )
>>>> Does SQL guarantee left-to-right evaluation and short-circuiting of
>>>> AND checks the way that C does? I must confess I have no clue.
>>>> However, if it doesn't, that might be what's causing your headaches.
>>>> I'd try moving the SRID filter into a WITH construct or a sub-select
>>>> just to see what happens:
>>>>
>>>> WITH filteredgeom AS (
>>>>
>>>>     SELECT * FROM gvt WHERE ST_SRID(geometry) = 4326)
>>>>
>>>> SELECT * FROM filteredgeom WHERE within(geometry, ...) ;
>>>>
>>>> Probably lots of syntax errors (haven't had breakfast yet) but you get
>>>> the idea...
>>>>
>>>>     -- Ture
>>>>
>>>> _______________________________________________
>>>> postgis-users mailing list
>>>> postgis-users at postgis.refractions.net
>>>> http://postgis.refractions.net/mailman/listinfo/postgis-users
>


-- 
Regards,
Farrukh Najmi

Web: http://www.wellfleetsoftware.com





More information about the postgis-users mailing list