Bagaimana mempercepat partisi ruang di postgis?

9

Saya memiliki banyak poligon yang tumpang tindih dan saya mencoba mempartisi ruang untuk menghindari yang tumpang tindih. Saya pikir masalah saya cukup sederhana. Menggunakan beberapa produk ESRI dan http://arcscripts.esri.com/details.asp?dbid=16700 rekan kerja saya menghitungnya dalam 48-an.

Saya mencoba melakukannya dengan postgis menggunakan http://s3.opengeo.org/postgis-power.pdf#page=24 (menebak rinciannya, menggunakan http://trac.osgeo.org/postgis/wiki/UsersWikiSimplifyPreserveTopology sebagai inspirasi) tetapi sangat lambat sehingga saya tidak dapat melakukannya dengan lebih dari 10 polys (saya punya 800 dari mereka untuk dibagi). Bagian lambat adalah ST_Union, saya mencoba berbagai hal, tetapi tidak ada yang berhasil, di sini adalah keadaan saat ini:

select geom from
(select st_linemerge(st_union(geom)) as geom from
    (select st_exteriorring((st_dumprings((st_dump(t.geom)).geom)).geom) as geom from
        (SELECT geometry AS geom, id
               FROM tt
              WHERE campaign_id = 204
              ORDER BY id limit 200) t) t2) t3

ini telah menghitung selama 26 menit (linemerge () sebenarnya tidak). Polys adalah MultiPolygons jika st_dump mengganggu Anda.

Apakah Anda punya tip? St_union () dari garis adalah bagian yang sangat lambat.

Terima kasih,

Nico.

NB: berikut adalah beberapa bilangan: 852 multipoligon, yang mengarah ke 14880 poligon, mengarah ke 21467 linestrings dengan total 315513 simpul.

nraynaud
sumber
Jika tidak ada yang menjawab Anda mungkin ingin mencoba milis postGIS.
GIS-Jonathan
Saya bukan penggemar mailing list, apalagi, mungkin juga masalah GEOS, yang mungkin mengeluh tentang JTS, well, saya lebih suka menjaga masalah tetap terbuka.
nraynaud
dengan mengumpulkan garis dan melakukan penyatuan dengan geometri kosong, saya dapat melakukannya dalam 800-an: st_union (st_collect (geom), st_setsrid (geomfromtext ('POINT EMPTY'), 900913)) yang hampir 20 kali lebih lambat daripada barang ESRI.
nraynaud
1
dari memori, coba jatuhkan st_union dari st_linemerge (st_union ...) jika itu membantu
simplexio

Jawaban:

3

Jawaban ini mungkin tidak membantu @nraynaud secara langsung, tetapi mudah-mudahan akan menjelaskan masalah ini.

Ada masalah serupa di spatiaLite <4.0 karena masalah dengan GEOS. Lihat tautan ini untuk diskusi tentang masalah ini.

Solusinya adalah mengganti fungsi ST_Union () dengan ST_UnaryUnion (ST_Collect ()). Sayangnya, ST_UnaryUnion tidak tersedia sampai postGIS 2.0 (sejauh yang saya tahu.)

Scro
sumber
1

Versi PostGIS mana yang Anda gunakan? Menyatukan jauh lebih lambat jika Anda menggunakan PostGIS <1.4 atau GEOS <3.2. Serikat yang jauh lebih cepat diperkenalkan pada 1.4, tetapi juga membutuhkan GEOS 3.2+. Jadi pertama-tama jika Anda menggunakan lebih rendah dari 1,4, saya akan meningkatkan setidaknya 1,5.

SELECT postgis_full_version();

Untuk memeriksa.

Juga niat Anda untuk menjaga tepi asli poligon. Jika Anda hanya ingin membubarkan daerah yang tumpang tindih,

SELECT ST_Union(geom) FROM tt WHERE campaign_id = 204;

Akan melakukan triknya.

LR1234567
sumber
halo, inilah hasilnya: "POSTGIS =" 1.5.3 "GEOS =" 3.3.2-CAPI-1.7.2 "PROJ =" Rel. 4.8.0, 6 Maret 2012 "LIBXML =" 2.7.3 "USE_STATS". Saya tidak dapat menemukan tambahan yang relevan untuk penyatuan di GEOS baru-baru ini. Saya menemukan satu speedup di serikat poligon, tapi saya tidak menggabungkan poligon, dan speedup ini tampaknya kontroversial. Saya benar-benar tidak ingin menyatukan poligon saya karena saya harus menambahkan nilai untuk poligon yang tumpang tindih.
nraynaud