[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