[postgis-users] collect() and memcollect() problem: ... GEOMETRIES with different SRIDs
George Planansky
george_planansky at harvard.edu
Mon Jul 24 16:55:45 PDT 2006
I get memcollect() giving an error
ERROR: Operation on two GEOMETRIES with different SRIDs
although collect() works okay.
This is with:
postgis-1.1.3 (and postgis-1.1.1)
postgres (PostgreSQL) 8.1.2
The issue was reported on postgis-users March 28 2005 (included below)
for postgis 1.0.0rc4, but I found no subsequent report of a cure.
This session shows the problem:
or=# select geometrytype(convexhull(memcollect(the_geom))) from ptaf;
ERROR: Operation on two GEOMETRIES with different SRIDs
or=# select geometrytype(convexhull(collect(the_geom))) from ptaf;
geometrytype
--------------
POLYGON
(1 row)
or=# \d ptaf
Table "public.ptaf"
Column | Type |
Modifiers
------------+-------------------+---------------------------------------------------
gid | integer | not null default nextval('ptaf_gid_seq'::regclass)
objectid | integer |
individual | character varying |
[...]
the_geom | geometry |
tracedate | date |
Indexes:
"ptaf_pkey" PRIMARY KEY, btree (gid)
Check constraints:
"$1" CHECK (srid(the_geom) = 32749)
"$2" CHECK (geometrytype(the_geom) = 'MULTILINESTRING'::text OR the_geom IS NULL)
or=# select srid(collect(the_geom)) from ptaf;
srid
-------
32749
(1 row)
or=# select srid(memcollect(the_geom)) from ptaf;
ERROR: Operation on two GEOMETRIES with different SRIDs
or=# select distinct srid(the_geom) from ptaf;
srid
-------
32749
(1 row)
or2=# select * from ptaf where the_geom is NULL;
gid | objectid | individual | the_geom | tracedate
-----+----------+------------+----------+----------
(0 rows)
Here's the posting from Mar 38 postgis-users:
>[postgis-users] Collect() and MemCollect() problem
>strk at refractions.net strk at refractions.net
>Mon Mar 28 02:37:31 PST 2005
>
>First of all: don't use envelope(collect(geom)) to extract bounding
>box of a layer ! extent(geom) gives you what you need in much less
>memory and time.
>
>For the MemCollect() issue can you check output of:
> SELECT distinct SRID(geom) FROM t_table_1;
>
>The presence of a constraint (enforce_srid_geom) does not guarantee
>the SRID is really the one enforced (geometries might have been
>inserted before the constraint was added).
>
>--strk;
>
>
>On Mon, Mar 28, 2005 at 12:48:08PM +0400, ksa-nil5 wrote:
>> Hi, strk.
>>
>> I have some problem with collect() and memcollect() functions in
>> postgis 1.0.0rc4.
>>
>> I have a layer with MULTILINESTRINGs each of that consists of one
>> LINESTRING:
>> test_export=# \d t_table_1
>> Table "public.t_table_1"
>> Column | Type | Modifiers
>> -----------------+----------+------------------------------------------------------------
>> gid | integer | not null default
>> nextval('public.t_table_1_gid_seq'::text)
>> geom_order | integer | not null default 0
>> geom | geometry |
>> Indexes:
>> "pk_t_table_1" PRIMARY KEY, btree (gid)
>> "i_t_table_1_gist" gist (geom)
>> Check constraints:
>> "enforce_srid_geom" CHECK (srid(geom) = 300001)
>> "enforce_dims_geom" CHECK (ndims(geom) = 2)
>> "enforce_geotype_geom" CHECK (geometrytype(geom) =
>> 'MULTILINESTRING'::text OR geom IS NULL)
>>
>> The layer contains 1999 MULTILINESTRINGs:
>> test_export=# select count(*) from t_table_1;
>> count
>> -------
>> 1999
>> (1 row)
>>
>> As you can see, all geometries have same SRID. (srid = 300001). So,
>> all geometries are stored in same projection.
>> Now, I want to get boundary box of that layer, so I execute
>> collection of all geometries in layer and then execute function
>> envelope().
>>
>> (Because output of collect() function with all of that geometries
>> would be very big, I use else srid() function)
>>
>> test_export=# select srid(collect(geom)) from t_table_1;
>> srid
>> --------
>> 300001
>> (1 row)
>>
>> test_export=# select envelope(collect(geom)) from t_table_1;
>> envelope
>> ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>> 0103000020E19304000100000005000000000000C097815441000000E065835741000000C097815441000000A0299A584100000040CCC75541000000A0299A584100000040CCC75541000000E065835741000000C097815441000000E065835741
>> (1 row)
>>
>> So, all works fine! :) But if I use MemCollect() function I receive
>> an error....
>>
>> test_export=# select memcollect(geom) from t_table_1;
>> ERROR: Operation on two GEOMETRIES with different SRIDs
>>
>> Why?
>>
>> I have found some interesting:
>> test_export=# select srid(memcollect(geom)) from t_table_1 where
>> gid<2;
>> srid
>> --------
>> 300001
>> (1 row)
>>
>> test_export=# select srid(memcollect(geom)) from t_table_1 where
>> gid<3;
>> srid
>> ------
>> -1
>> (1 row)
>>
>> So, srid is lost... why?
>> That is first two geometries:
>> test_export=# select geom from t_table_1 where gid < 3;
>> geom
>> --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>> 0105000020E193040001000000010200000004000000AC1C5A0CC58B54412FDD242EECF85741713D0A6F0E8C5441D34D62983DF957413333337B458C5441D122DB81B0F95741D34D62F84F8C5441000000E8DAF95741
>> 0105000020E193040001000000010200000008000000CDCCCC8C518B5441D578E926BAF857411D5A645B678B5441A4703D229FF857417F6ABC3C8B8B544108AC1C7A67F85741AAF1D2ADBB8B5441EC51B8D629F85741EC51B886F18B5441BC7493D8E1F757418195436B168C54415A643B3FC4F75741CBA14586608C5441DBF97E62DCF757415839B410B58C5441621058F9F0F75741
>> (2 rows)
>>
>> test_export=# select astext(geom) from t_table_1 where gid < 3;
>> astext
>> ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>> MULTILINESTRING((5386004.193 6284208.721,5386297.735
>> 6284534.381,5386517.925 6284994.029,5386559.881 6285163.625))
>> MULTILINESTRING((5385542.2 6284008.608,5385629.428
>> 6283900.535,5385772.949 6283677.908,5385966.716
>> 6283431.355,5386182.105 6283143.384,5386329.676
>> 6283024.988,5386626.098 6283121.539,5386964.261 6283203.896))
>> (2 rows)
>>
>>
>>
>> Sergey Karin
>>
>> PS. Up to last time I have used postgis 0.9.0. When I install
>> postgis 1.0.0rc4 I have some problems in work my program. Maybe
>> there is some instructions where described difference in work of
>> functions? And what I shall do to port my program from 0.9.0 to
>> 1.0.0
>>
>> thanks in anvance
thanks,
George
More information about the postgis-users
mailing list