[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
> _______________________________________________
> 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