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.


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.)


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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.