[postgis-users] GeometryCollection after ST_Centroid(ST_Dump)

Obe, Regina robe.dnd at cityofboston.gov
Wed Oct 15 07:06:17 PDT 2008


Ah I see the problem now.  

SELECT ST_AsText(ST_Centroid(ST_GeomFromTExt('POLYGON((3713601.737 
5966193.371,3713601.737 5966193.371,3713601.737
                                5966193.371,3713601.737
5966193.371))')))

Returns - "GEOMETRYCOLLECTION EMPTY"

The problem is that polygon is invalid.

If I do this
SELECT ST_IsValid(ST_GeomFromTExt('POLYGON((3713601.737 
5966193.371,3713601.737 5966193.371,3713601.737
                                5966193.371,3713601.737 5966193.371))'))

I get 
f  and a notice that says
NOTICE:  Too few points in geometry component at or near point
3.7136e+06 5.96619e+06

So I guess the moral of the story - change your query to include a 

WHERE ST_IsValid(abdump.newgeom)


Hope that helps,
Regina
 

-----Original Message-----
From: postgis-users-bounces at postgis.refractions.net
[mailto:postgis-users-bounces at postgis.refractions.net] On Behalf Of
Birgit Laggner
Sent: Wednesday, October 15, 2008 9:56 AM
To: PostGIS Users Discussion
Subject: Re: [postgis-users] GeometryCollection after
ST_Centroid(ST_Dump)

Hi Regina,

this is the result, I get from the query you sent me:

gid      geometrytype_centroid  astxtrep
integer  text                   text
------------------------------------------------------------------------
-----------------------------
119810   "GEOMETRYCOLLECTION"   "POLYGON((3713601.737 
5966193.371,3713601.737 5966193.371,3713601.737
                                5966193.371,3713601.737 5966193.371))"

Thanks and regards,

Birgit.


Obe, Regina schrieb:
> Birgit,
> Ah that is weird - I've never seen it return a geometry collection
> before.  So what is the ST_AsText/ST_AsBinary of the first.
>
> e.g.
> SELECT
>   abdump.gid,
>   geometrytype(ST_Centroid(abdump.newgeom)) As geometrytype_centroid,
>   ST_AsText(abdump.newgeom) as astxtrep
> FROM
>  (SELECT (ST_Dump(ST_Intersection(a.the_geom, b.the_geom))).geom As 
> newgeom, a.gid, a.the_geom as a_the_geom, b.the_geom as b_the_geom
>   FROM  bfn.test_mv_dlm07_dump a, bfn.test_mv_dlm07_dump b
>   WHERE ST_Overlaps(a.the_geom,b.the_geom)=true AND 
> Intersects(a.the_geom,b.the_geom)=true
>  ) As abdump
> WHERE abdump.gid = 119810
> GROUP BY (ST_Centroid(abdump.newgeom)), 
> ST_Area(ST_Centroid(abdump.newgeom)), 
> ST_Perimeter(ST_Centroid(abdump.newgeom)), abdump.gid, abdump.newgeom;
>
>
> By the way the result you sent doesn't match the query - its missing a
> field and the labels don't match the query.
>   
Yes, that's true - I first made the query with the geom 
(abdump.newgeom), but then deleted this from the query because the geom 
would have needed such a wide column in the result table. And I forgot 
to update this in my e-mail...

>
> Hope that helps,
> Regina
>
>  
>
> -----Original Message-----
> From: postgis-users-bounces at postgis.refractions.net
> [mailto:postgis-users-bounces at postgis.refractions.net] On Behalf Of
> Birgit Laggner
> Sent: Wednesday, October 15, 2008 8:45 AM
> To: PostGIS Users Discussion
> Subject: Re: [postgis-users] GeometryCollection after
> ST_Centroid(ST_Dump)
>
> Hi Regina,
>
> yes, that's true. The queries you took for testing work  for me, too. 
> But if I try to run:
>
> SELECT
>   ST_X(st_centroid((ST_Dump(ST_Intersection(a.the_geom, 
> b.the_geom))).geom)) AS x_centroid,
>   ST_Y(st_centroid((ST_Dump(ST_Intersection(a.the_geom, 
> b.the_geom))).geom)) AS y_centroid,
>   ST_Area((ST_Dump(ST_Intersection(a.the_geom, b.the_geom))).geom) AS
> area,
>   ST_Perimeter((ST_Dump(ST_Intersection(a.the_geom,
b.the_geom))).geom) 
> AS perimeter
> FROM bfn.test_mv_dlm07_dump a, bfn.test_mv_dlm07_dump b
> WHERE ST_OVERLAPS(a.the_geom,b.the_geom)=true AND 
> INTERSECTS(a.the_geom,b.the_geom)=true
> GROUP BY ST_X(ST_Centroid((ST_Dump(ST_Intersection(a.the_geom, 
> b.the_geom))).geom)), 
> ST_Y(ST_Centroid((ST_Dump(ST_Intersection(a.the_geom, 
> b.the_geom))).geom)), ST_Area((ST_Dump(ST_Intersection(a.the_geom, 
> b.the_geom))).geom), ST_Perimeter((ST_Dump(ST_Intersection(a.the_geom,

> b.the_geom))).geom), a.the_geom, b.the_geom
> ORDER BY x_centroid asc, y_centroid asc, area asc, perimeter asc;
>
> I still get: error: Argument to X() must be a point.
>
> The same happens when I formulate the query like you suggested in the 
> beginning:
>
> SELECT
>   abdump.gid,
>   ST_X(ST_Centroid(abdump.newgeom)) As x_centroid,
>   ST_Y(ST_Centroid(abdump.newgeom)) As y_centroid,
>   ST_Area(ST_Centroid(abdump.newgeom)) As area,
>   ST_Perimeter(ST_Centroid(abdump.newgeom)) as perimeter,
>   abdump.newgeom
> FROM
>  (SELECT (ST_Dump(ST_Intersection(a.the_geom, b.the_geom))).geom As 
> newgeom, a.gid, a.the_geom as a_the_geom, b.the_geom as b_the_geom
>   FROM  bfn.test_mv_dlm07 a, bfn.test_mv_dlm07 b
>   WHERE ST_Overlaps(a.the_geom,b.the_geom)=true AND 
> Intersects(a.the_geom,b.the_geom)=true
>  ) As abdump
> GROUP BY ST_X(ST_Centroid(abdump.newgeom)), 
> ST_Y(ST_Centroid(abdump.newgeom)),
ST_Area(ST_Centroid(abdump.newgeom)),
>
> ST_Perimeter(ST_Centroid(abdump.newgeom)), abdump.gid, abdump.newgeom
> --a_the_geom, b_the_geom
> ORDER BY x_centroid asc, y_centroid asc, area asc, perimeter asc, 
> abdump.gid asc;
>
> Meanwhile, I am a bit confused, because I see no logic in what
> happens...
>
> Just to explain what I thougt, the problem might be:
>
> When I run the following query:
> SELECT
>   abdump.gid,
>   geometrytype(ST_Centroid(abdump.newgeom)) As geometrytype_centroid,
>   abdump.newgeom
> FROM
>  (SELECT (ST_Dump(ST_Intersection(a.the_geom, b.the_geom))).geom As 
> newgeom, a.gid, a.the_geom as a_the_geom, b.the_geom as b_the_geom
>   FROM  bfn.test_mv_dlm07_dump a, bfn.test_mv_dlm07_dump b
>   WHERE ST_Overlaps(a.the_geom,b.the_geom)=true AND 
> Intersects(a.the_geom,b.the_geom)=true
>  ) As abdump
> GROUP BY (ST_Centroid(abdump.newgeom)), 
> ST_Area(ST_Centroid(abdump.newgeom)), 
> ST_Perimeter(ST_Centroid(abdump.newgeom)), abdump.gid, abdump.newgeom;
>
> I get this in return:
>
> gid          geometrytype
> integer     text
> ----------------------------------------
> 119810  "GEOMETRYCOLLECTION"
> 120217  "GEOMETRYCOLLECTION"
> 135837  "GEOMETRYCOLLECTION"
> 135837  "GEOMETRYCOLLECTION"
> 101408  "GEOMETRYCOLLECTION"
> 254497  "GEOMETRYCOLLECTION"
> 125720  "GEOMETRYCOLLECTION"
> 125731  "GEOMETRYCOLLECTION"
> 405587  "POINT"
> 412179  "POINT"
> 412179  "POINT"
> 405587  "POINT"
> 125720  "GEOMETRYCOLLECTION"
> 254497  "POINT"
> 242621  "POINT"
> 242621  "POINT"
> 254497  "POINT"
> 242621  "POINT"
> 254497  "POINT"
> 242621  "POINT"
> 254497  "POINT"
> 242621  "POINT"
> 254497  "POINT"
> 135850  "GEOMETRYCOLLECTION"
> 244155  "POINT"
> 254671  "POINT"
> 244155  "POINT"
> 254671  "POINT"
> 244155  "POINT"
> 254671  "POINT"
> 254671  "POINT"
> 244155  "POINT"
> 125742  "POINT"
> 135829  "POINT"
> 125742  "POINT"
> 135850  "POINT"
> 125731  "POINT"
> 135829  "POINT"
> 125742  "POINT"
> 125742  "GEOMETRYCOLLECTION"
> 135850  "POINT"
> 125742  "POINT"
> 134472  "GEOMETRYCOLLECTION"
> 133678  "GEOMETRYCOLLECTION"
> 126954  "GEOMETRYCOLLECTION"
> 135850  "POINT"
> 125731  "POINT"
> 135829  "POINT"
> 125742  "POINT"
> 135850  "POINT"
> 125731  "POINT"
> 135829  "POINT"
> 125742  "POINT"
> 135850  "POINT"
> 135829  "GEOMETRYCOLLECTION"
> 125731  "POINT"
> 135829  "POINT"
> 125742  "POINT"
> 135850  "POINT"
> 412179  "GEOMETRYCOLLECTION"
> 125731  "POINT"
> 135829  "POINT"
> 135850  "POINT"
> 125742  "POINT"
> 125731  "POINT"
> 135829  "POINT"
> 125742  "POINT"
> 135850  "POINT"
> 125731  "POINT"
> 135829  "POINT"
> 135829  "POINT"
> 125731  "POINT"
> 125742  "POINT"
> 135850  "POINT"
> 125720  "POINT"
> 135850  "POINT"
> 125731  "POINT"
> 135829  "POINT"
> 135850  "POINT"
> 125742  "POINT"
> 125742  "POINT"
> 135850  "POINT"
> 125731  "POINT"
> 135829  "POINT"
> 125731  "POINT"
> 135850  "POINT"
> 244155  "GEOMETRYCOLLECTION"
> 242621  "GEOMETRYCOLLECTION"
> 125731  "POINT"
> 135829  "POINT"
> 125742  "POINT"
> 135850  "POINT"
> 135837  "POINT"
> 125720  "POINT"
> 125720  "POINT"
> 135837  "POINT"
> 245042  "GEOMETRYCOLLECTION"
> 253750  "GEOMETRYCOLLECTION"
> 125720  "POINT"
> 135837  "POINT"
> 125720  "POINT"
> 135850  "POINT"
> 375311  "GEOMETRYCOLLECTION"
> 405587  "GEOMETRYCOLLECTION"
> 376289  "GEOMETRYCOLLECTION"
> 254671  "GEOMETRYCOLLECTION"
> 135837  "POINT"
> 125720  "POINT"
> 125720  "POINT"
> 404117  "GEOMETRYCOLLECTION"
> 135837  "POINT"
> 386583  "GEOMETRYCOLLECTION"
> 386466  "GEOMETRYCOLLECTION"
> 125720  "POINT"
> 135837  "POINT"
> 125720  "POINT"
> 135837  "POINT"
> 125720  "POINT"
> 135837  "POINT"
> 125720  "POINT"
> 135837  "POINT"
> 426566  "GEOMETRYCOLLECTION"
>
> This is why I think, the ST_Centroid produces a geometrycollection.
>
> Thanks again!
>
> Regards,
>
> Birgit.
>
> Obe, Regina schrieb:
>   
>> Birgit,
>>
>> I just loaded up this data set you posted and tried doing
>>
>> SELECT ST_X(ST_Centroid(the_geom))
>> FROM test_mv_dlm07_dump;
>>
>> Works perfectly fine for me.   Even if you pass a geometry collection
>>     
> to ST_Centroid, it would always return a point.
>   
>> To demonstrate
>>
>> SELECT ST_GeometryType(ST_Centroid(ST_Collect(the_geom))),
>>     
> ST_AsText(ST_Centroid(ST_Collect(the_geom))) as full_cent
>   
>> FROM test_mv_dlm07_dump;
>>
>> Gives me this:
>> "ST_Point";"POINT(3728516.33771743 5964986.31004069)"
>>
>>
>> Are you saying the sample you posted when you do the above doesn't
>>     
> work for you?  If so, then there appears to be something wrong with
your
> install.
>   
>> What does 
>>
>> SELECT postgis_full_version();
>>
>> return for you?
>>   
>>     
> "POSTGIS="1.3.3" GEOS="3.0.0-CAPI-1.4.1" PROJ="Rel. 4.6.0, 21 Dec
2007" 
> USE_STATS"
>   
>> Thanks,
>> Regina
>>
>> -----Original Message-----
>> From: postgis-users-bounces at postgis.refractions.net
>>     
> [mailto:postgis-users-bounces at postgis.refractions.net] On Behalf Of
> Birgit Laggner
>   
>> Sent: Wednesday, October 15, 2008 5:03 AM
>> To: PostGIS Users Discussion
>> Subject: Re: [postgis-users] GeometryCollection after
>>     
> ST_Centroid(ST_Dump)
>   
>> Hi Regina,
>>
>> thanks for your response! I tried the query you suggested and still
>>     
> get 
>   
>> the same result (error: Argument to X() must be a point), which is 
>> totally reasonable, regarding that the result of the ST_Centroid is 
>> still a GeometryCollection. My guess was, that this is caused by the 
>> fact that ST_Dump returns not only POLYGONs but also LINESTRINGs and 
>> POINTs. I thought, it could be that ST_Centroid has difficulties 
>> returning a centroid for points and linestrings. So, what I did so
>>     
> far, 
>   
>> was to split the query into one part, with which I just find all 
>> overlapping geometries without grouping or anything else, and one
>>     
> part, 
>   
>> which does the grouping including calculating of the centroid and 
>> everything else. And, between these two parts, I just delete all 
>> geometries that are LINESTRINGs or POINTs (I don't need them, I only 
>> need the polygons). At least, these queries run - I don't know yet if

>> the result is correct...
>> But, as I saw now, when I selected the data example you asked for
(see
>>     
>
>   
>> attachement), that the GeometrieCollections don't occur at the 
>> linestring or point geometries as I expected. There seems to be some 
>> other problem, I don't understand...
>>
>> Here my new (working) query:
>>
>> CREATE TABLE bfn.mv_dlm07_olvg
>> (
>>   gid serial NOT NULL,
>>   gid_mv_dlm07 integer
>> );
>> SELECT 
>>
>>     
>
AddGeometryColumn('bfn','mv_dlm07_olvg','the_geom','31467','MULTIPOLYGON
> ',2);
>   
>> ALTER TABLE bfn.mv_dlm07_olvg DROP CONSTRAINT
>>     
> enforce_geotype_the_geom;
>   
>> INSERT INTO bfn.mv_dlm07_olvg (
>>   gid_mv_dlm07,
>>   the_geom)
>> SELECT
>>   a.gid,
>>   (ST_Dump(ST_Intersection(a.the_geom, b.the_geom))).geom AS the_geom
>> FROM bfn.mv_dlm07_orig a, bfn.mv_dlm07_orig b
>> WHERE ST_OVERLAPS(a.the_geom,b.the_geom)=true AND 
>> INTERSECTS(a.the_geom,b.the_geom)=true;
>>
>> DELETE FROM bfn.mv_dlm07_olvg
>> WHERE GeometryType(the_geom)='LINESTRING';
>> DELETE FROM bfn.mv_dlm07_olvg
>> WHERE GeometryType(the_geom)='POINT';
>>
>> CREATE TABLE bfn.mv_dlm07_ol
>> (
>>   gid serial NOT NULL,
>>   gid_mv_dlm07 integer,
>>   x_centroid numeric,
>>   y_centroid numeric,
>>   area numeric,
>>   perimeter numeric
>> );
>> SELECT 
>>
>>     
>
AddGeometryColumn('bfn','mv_dlm07_ol','the_geom','31467','MULTIPOLYGON',
> 2);
>   
>> ALTER TABLE bfn.mv_dlm07_ol DROP CONSTRAINT enforce_geotype_the_geom;
>>
>> INSERT INTO bfn.mv_dlm07_ol (
>>   gid_mv_dlm07,
>>   x_centroid,
>>   y_centroid,
>>   area,
>>   perimeter,
>>   the_geom)
>> SELECT
>>   a.gid_mv_dlm07,
>>   st_x(st_centroid(a.the_geom)) as x_centroid,
>>   st_y(st_centroid(a.the_geom)) as y_centroid,
>>   st_area(a.the_geom) as area,
>>   st_perimeter(a.the_geom) as perimeter,
>>   a.the_geom as the_geom
>> FROM bfn.mv_dlm07_olvg a
>> GROUP BY st_x(st_centroid(a.the_geom)),
st_y(st_centroid(a.the_geom)),
>>     
>
>   
>> st_area(a.the_geom), st_perimeter(a.the_geom), a.the_geom
>> ORDER BY x_centroid asc, y_centroid asc, area asc, perimeter asc, 
>> a.gid_mv_dlm07 asc;
>>
>> Regards,
>>
>> Birgit.
>>
>>  
>>
>> Obe, Regina schrieb:
>>   
>>     
>>> Birgit,
>>>
>>> So you are saying ST_Centroid sometimes returns geometry
collections.
>>> Hmm I don't see how that is possible unless there is bug somewhere.
>>>
>>> Can you provide an example of that.  
>>>     
>>>       
>> Is attached - these are the ones which return GeometryCollection
after
>>     
>
>   
>> ST_Centroid. I had to remove the attributes because of privacy
>>     
> reasons.
>   
>>   
>>     
>>> Regarding the below query - it
>>> would be a bit easier to follow if you did a subselect first.
>>>
>>> Something like
>>>
>>>  SELECT
>>>   abdump.gid,
>>>   abdump.objart_07,
>>>  abdump.cat_07,
>>> ST_X(ST_Centroid(abdump.newgeom)) As x_centroid,
>>> ST_Y(ST_Centroid(abdump.newgeom)) As y_centroid
>>> ST_Area(ST_Centroid(abdump.newgeom)) As area,
>>> ST_Perimeter(ST_Centroid(abdump.newgeom)) as perimeter
>>> FROM (SELECT (ST_Dump(ST_Intersection(a.the_geom, 
>>> b.the_geom))).geom As newgeom, a.gid, a.objart_07, a.cat_07,
>>>       
> a.the_geom
>   
>>> as a_the_geom, b.the_geom as b_the_geom
>>> FROM 
>>>  bfn.test_mv_dlm07 a, bfn.test_mv_dlm07 b
>>> WHERE ST_Overlaps(a.the_geom,b.the_geom)=true AND 
>>> Intersects(a.the_geom,b.the_geom)=true
>>> ) As abdump
>>> GROUP BY ST_X(ST_Centroid(abdump.newgeom)), 
>>> ST_Y(ST_Centroid(abdump.newgeom)),
>>>       
> ST_Area(ST_Centroid(abdump.newgeom)),
>   
>>> ST_Perimeter(ST_Centroid(abdump.newgeom)), abdump.gid,
>>>       
> abdump.objart_07,
>   
>>> abdump.cat_07, a_the_geom, b_the_geom
>>> ORDER BY x_centroid asc, y_centroid asc, area asc, perimeter asc,
>>>       
> a.gid
>   
>>> asc;
>>>
>>> Hope that helps,
>>> Regina
>>>
>>> -----Original Message-----
>>> From: postgis-users-bounces at postgis.refractions.net
>>> [mailto:postgis-users-bounces at postgis.refractions.net] On Behalf Of
>>> Birgit Laggner
>>> Sent: Tuesday, October 14, 2008 6:56 AM
>>> To: PostGIS Users Discussion
>>> Subject: [postgis-users] GeometryCollection after
>>>       
> ST_Centroid(ST_Dump)
>   
>>> Dear list,
>>>
>>> I have a SELECT statement in which I try to group by the polygons 
>>> resulting from a self intersection. After I realized that I can't
>>>       
> group 
>   
>>> by the_geom because this would group polygons which are only similar
>>>       
> but
>   
>>> not equal, I decided to group by the area, the perimeter and the x-
>>>       
> and 
>   
>>> y-coordinates of the centroid of every polygon. The SELECT statement
>>>       
> I 
>   
>>> wrote, worked so far for some test datasets and showed seemingly 
>>> reasonable results. But for at least one of my datasets, the
>>>       
> statement 
>   
>>> does not work, because the ST_Centroid produces some
>>>       
> GeometryCollections
>   
>>> instead of POINTS. What could cause that problem and how can I solve
>>> it???
>>>
>>> This is my statement:
>>>
>>> SELECT
>>>   a.gid,
>>>   a.objart_07,
>>>   a.cat_07,
>>>   ST_X(ST_Centroid((ST_Dump(ST_Intersection(a.the_geom, 
>>> b.the_geom))).geom)) as x_centroid,
>>>   ST_Y(ST_Centroid((ST_Dump(ST_Intersection(a.the_geom, 
>>> b.the_geom))).geom)) as y_centroid,
>>>   ST_Area((ST_Dump(ST_Intersection(a.the_geom, b.the_geom))).geom)
as
>>> area,
>>>   ST_Perimeter((ST_Dump(ST_Intersection(a.the_geom,
>>>       
> b.the_geom))).geom) 
>   
>>> as perimeter,
>>>   (ST_Dump(ST_Intersection(a.the_geom, b.the_geom))).geom as
the_geom
>>> FROM bfn.test_mv_dlm07 a, bfn.test_mv_dlm07 b
>>> WHERE ST_Overlaps(a.the_geom,b.the_geom)=true AND 
>>> Intersects(a.the_geom,b.the_geom)=true
>>> GROUP BY ST_X(ST_Centroid((ST_Dump(ST_Intersection(a.the_geom, 
>>> b.the_geom))).geom)), 
>>> ST_Y(ST_Centroid((ST_Dump(ST_Intersection(a.the_geom, 
>>> b.the_geom))).geom)), ST_Area((ST_Dump(ST_Intersection(a.the_geom, 
>>> b.the_geom))).geom),
>>>       
> ST_Perimeter((ST_Dump(ST_Intersection(a.the_geom, 
>   
>>> b.the_geom))).geom), a.gid, a.objart_07, a.cat_07, a.the_geom,
>>> b.the_geom
>>> ORDER BY x_centroid asc, y_centroid asc, area asc, perimeter asc,
>>>       
> a.gid
>   
>>> asc;
>>>
>>> The ST_Dump results in POLYGONs, LINESTRINGs and POINTs.
>>>
>>> Thank you for any help!
>>>
>>> Regards,
>>>
>>> Birgit.
>>>
>>> _______________________________________________
>>> postgis-users mailing list
>>> postgis-users at postgis.refractions.net
>>> http://postgis.refractions.net/mailman/listinfo/postgis-users
>>> -----------------------------------------
>>> The substance of this message, including any attachments, may be
>>> confidential, legally privileged and/or exempt from disclosure
>>> pursuant to Massachusetts law. It is intended
>>> solely for the addressee. If you received this in error, please
>>> contact the sender and delete the material from any computer.
>>> _______________________________________________
>>> postgis-users mailing list
>>> postgis-users at postgis.refractions.net
>>> http://postgis.refractions.net/mailman/listinfo/postgis-users
>>>
>>>   
>>>     
>>>       
>>   
>>     
> _______________________________________________
> postgis-users mailing list
> postgis-users at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-users
> -----------------------------------------
> The substance of this message, including any attachments, may be
> confidential, legally privileged and/or exempt from disclosure
> pursuant to Massachusetts law. It is intended
> solely for the addressee. If you received this in error, please
> contact the sender and delete the material from any computer.
> _______________________________________________
> postgis-users mailing list
> postgis-users at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-users
>
>   
_______________________________________________
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