[postgis-users] ArcGIS UNION for PostGIS - Reloaded

Yesid Carrillo Vega yecarrillo at gmail.com
Mon Oct 22 09:09:55 PDT 2012


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*
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/postgis-users/attachments/20121022/fab18137/attachment.html>


More information about the postgis-users mailing list