[postgis-users] ArcGIS UNION for PostGIS - Reloaded

Birgit Laggner birgit.laggner at vti.bund.de
Mon Oct 22 23:57:20 PDT 2012


Hi Yesid,

perhaps it would make sense to split the query after the creation of the 
pointonsurface points and to put a CREATE INDEX on the pointonsurface 
points and the wkb_geometries in between. I could imagine the left joins 
would be much faster then.

Good luck,

Birgit.


Am 22.10.2012 18:09, schrieb Yesid Carrillo Vega:
> This question has a long history. Theoretically has good solutions 
> that worked for me:
> http://trac.osgeo.org/postgis/wiki/UsersWikiExamplesOverlayTables
> A good hint for this solution is that input geometries MUST BE SINGLE 
> not MULTI. It cost me a few days guessing that:
>
> SELECT a.ogc_fid AS ogc_fid_a, b.ogc_fid AS ogc_fid_b, 
> new_polys.wkb_geometry as wkb_geometry
> FROM
> (
> SELECT geom AS wkb_geometry, ST_PointOnSurface(geom) AS pip
> FROM ST_Dump
> (
> (
> SELECT ST_Polygonize(wkb_geometry) AS wkb_geometry
> FROM
> (
> SELECT ST_Union(wkb_geometry) AS wkb_geometry
> FROM
> (
> SELECT ST_ExteriorRing(ST_GeometryN(wkb_geometry,1)) AS wkb_geometry
> FROM table1
> UNION ALL
> SELECT ST_ExteriorRing(ST_GeometryN(wkb_geometry,1)) AS wkb_geometry
> FROM table2
> ) AS all_lines
> ) AS noded_lines
> )
> )
> ) AS new_polys
> LEFT JOIN table1 a ON ST_Within(new_polys.pip, a.wkb_geometry)
> LEFT JOIN table2 b ON ST_Within(new_polys.pip, b.wkb_geometry)
>
>
> However, applying it into a real world case, give me a painful query 
> plan result 158.66..5687848.83:
>
> "Nested Loop Left Join  (cost=158.66..5687848.83 rows=3685449 width=40)"
> "  Join Filter: st_within(st_pointonsurface(st_dump.geom), 
> a.wkb_geometry)"
> "  InitPlan 1 (returns $0)"
> "    ->  Aggregate  (cost=158.65..158.66 rows=1 width=32)"
> "          ->  Aggregate  (cost=158.63..158.64 rows=1 width=32)"
> "                ->  Append  (cost=0.00..156.50 rows=850 width=32)"
> "                      ->  Seq Scan on table1  (cost=0.00..146.09 
> rows=809 width=32)"
> "                      ->  Seq Scan on table2  (cost=0.00..10.41 
> rows=41 width=32)"
> "  ->  Nested Loop Left Join  (cost=0.00..21033.01 rows=13667 width=36)"
> "        Join Filter: st_within(st_pointonsurface(st_dump.geom), 
> b.wkb_geometry)"
> "        ->  Function Scan on st_dump  (cost=0.00..10.00 rows=1000 
> width=32)"
> "        ->  Materialize  (cost=0.00..10.62 rows=41 width=165799)"
> "              ->  Seq Scan on table2 b  (cost=0.00..10.41 rows=41 
> width=165799)"
> "  ->  Materialize  (cost=0.00..150.13 rows=809 width=23296)"
> "        ->  Seq Scan on table1 a  (cost=0.00..146.09 rows=809 
> width=23296)"
>
> My data:
> table1:879 rows
> table2:41 rows
>
> Please some advice to make this query more time friendly, specially 
> with st_pointonsurface part.
>
> --
> /Yesid Carrillo/
>
>
>
>
> _______________________________________________
> postgis-users mailing list
> postgis-users at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-users
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/postgis-users/attachments/20121023/fb270b41/attachment.html>


More information about the postgis-users mailing list