Postgis'te alan bölümleme nasıl hızlandırılır?


9

Bir sürü örtüşen çokgen var ve üst üste binenlerden kaçınmak için alanı bölmeye çalışıyorum. Sanırım sorunum oldukça basit. Bazı ESRI ürünleri ve http://arcscripts.esri.com/details.asp?dbid=16700 iş arkadaşım bunu 48'li yıllarda hesapladı.

Ben http://s3.opengeo.org/postgis-power.pdf#page=24 kullanarak http://trac.osgeo.org/postgis/wiki/UsersWikiSimplifyPreserveTopology kullanarak postgis ile yapmaya çalışıyorum ama o kadar yavaş ki 10'dan fazla poliyle yapamam (800 tane bölmeliyim). Yavaş kısım ST_Union, çeşitli şeyler denedim, ama hiçbiri başarılı olmadığında, şu anki durum şu:

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

bu 26 dakikadır hesaplanıyor (linemerge () aslında değil). St_dump size hata verirse, poliler MultiPolygons'tur.

Hiç ipucun var mı? Çizginin st_union () yöntemi çok yavaştır.

Teşekkürler,

Nico.

PS: İşte bazı sayılar: 852 çokgen, 14880 çokgene yol açarak toplam 315513 köşeye sahip 21467 linestline yol açtı.


Kimse cevap vermezse postGIS posta listesini denemek isteyebilirsiniz.
GIS-Jonathan

Posta listelerinin gerçekten hayranı değilim, ayrıca JTS'den şikayet edebilecek bir GEOS sorunu da olabilir, problemi açık tutmayı tercih ederim.
nraynaud

çizgileri toplayarak ve boş bir geometri ile birleşme yaparak, 800'lerde yapabilirim: st_union (st_collect (geom), st_setsrid (geomfromtext ('POINT EMPTY'), 900913)) ESRI malzemelerinden neredeyse 20 kat daha yavaş.
nraynaud

1
bellekten, eğer yardımcı olur st_linemerge (st_union ...) den damla st_union deneyin
simplexio

Yanıtlar:


3

Bu cevap @ nraynaud'a doğrudan yardımcı olmayabilir, ancak umarım konuya biraz ışık tutacaktır.

GEOS ile ilgili bir sorun nedeniyle spatiaLite <4.0'da da benzer bir sorun vardır. Sorunun tartışılması için bu bağlantıya bakın .

Çözüm ST_Union () işlevini ST_UnaryUnion (ST_Collect ()) ile değiştirmektir. Ne yazık ki, ST_UnaryUnion postGIS 2.0'a kadar mevcut değil (anlayabildiğim kadarıyla).


1

Hangi PostGIS sürümünü kullanıyorsunuz? PostGIS <1.4 veya GEOS <3.2 kullanıyorsanız sendikalaşma çok daha yavaştır. 1.4'te çok daha hızlı birleşme başlatıldı, ancak GEOS 3.2+ gerektiriyor. İlk önce 1.4'den düşük kullanıyorsanız en az 1.5'e yükseltirim.

SELECT postgis_full_version();

Kontrol etmek.

Ayrıca amacınız çokgenlerin orijinal kenarlarını korumaktır. Sadece çakışan bölgeleri çözmek istiyorsanız,

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

Hile yapardı.


Merhaba, işte sonuç: "POSTGIS =" 1.5.3 "GEOS =" 3.3.2-CAPI-1.7.2 "PROJ =" Rel. 4.8.0, 6 Mart 2012 "LIBXML =" 2.7.3 "USE_STATS". Geçtiğimiz günlerde GEOS'ta sendikaya alakalı bir ek bulamadım. Çokgen sendikalarında bir hızlanma buldum, ancak çokgenleri birleştirmiyorum ve bu hızlanma tartışmalı görünüyor. Üst üste gelen çokgenler için değer eklemek zorunda olduğum için çokgenlerimi birleştirmek istemiyorum.
nraynaud
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.