[postgis-users] Querying geometries with different srid
Ralf Suhr
Ralf.Suhr at itc-halle.de
Fri Jan 14 08:29:03 PST 2011
Hi Farrukh,
your setup produce this error.
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
);
or
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;
become the same in postgresql planner. I've testet all querys with Postgis
1.4.0 without any error. Except
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 );
But you can create a partial index and the last query will work:
CREATE INDEX GeometryValueType_geom_wgs_idx ON GeometryValueType using gist
(geometry) where ST_Srid(geometry) = 4326;
Gr
Ralf
Am Freitag 14 Januar 2011, 16:33:33 schrieb Farrukh Najmi:
> 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,
> '0103000020E6100000010000000500000000000000000059C0000000000000000000000000
> 0000000000000000000000000000000000000000000000000000594000000000000059C0000
> 000000000594000000000000059C00000000000000000'::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
More information about the postgis-users
mailing list