PostGIS'de st_union dışında bir çözünme işlevi var mı?


22

Bir tablodaki çokgen özellikleri arasındaki paylaşılan sınırları çözme işlevi arıyorum. ST_UNION () aradığım şeyi neredeyse yapar, ancak ortak bir sınırı paylaşıp paylaşmadıklarına bakılmaksızın, katmandaki tüm çokgenlerden bir çokgen oluşturur. Sadece birbirine dokunan çokgenler arasındaki sınırları çözmeyi tercih ederim. ST_TOUCHES () yöntemini kullanmanın bir yolu olmalı, ancak çözme işlevine duyulan ihtiyaç o kadar yaygın görünüyor ki bunu başarmak için yerleşik bir işlev yoksa şaşırırdım.

Kullanım durumu şöyle: Büyük bir Avrupa ülkesi için Corine Landcover verilerini indirdim ve farklı orman türleri arasındaki sınırları (bir tabloda yaklaşık 75.000 çokgen) çözmek istiyorum. ST_UNION'u denedim, ancak bu "bellek yetersiz" hatasıyla başarısız oluyor (30.000 çokgen de işe yarıyordu):

create table corine00 as 
  select st_union(the_geom) as the_geom, 
         sum(area_ha) as area_ha,
         substr(code_00,1,2) as code_00
  from clc00_c31_forests
  group by substr(code_00,1,2)

Not: Tüm orman kodları '31' ile başlar ve PostGIS 1.4, GEOS versiyonunu kullanıyorum: 3.2.0-CAPI-1.6.0

Yanıtlar:


21

ST_MemUnion () saf ve yavaş hafıza dostu bir işlem yürütecektir. Bunu deneyebilirsiniz, eğer probleminiz yeterince küçükse, makul bir sürede bitirebilir. Ayrıca, sorununuzu yarıya indirebilir, sonra yarıyı birlikte çalıştırabilirsiniz. Elde edilen sonuçların girdilerden çok daha az puana sahip olacağı için, tüm sorunu bu şekilde belleğe sığdırabilirsiniz. Veya yarıya hızlı hafızaya aç rutinini ve son birleştirme işleminde daha yavaş olan rutini kullanın.


4
Seni burada görmek harika Paul, sana eşsiz bir uzmanlık getirdiğin için teşekkürler.
23

1
Teşekkürler, sorunum yeterince küçük değil gibi görünüyor. ST_MemUnion () şimdi 24 saattir çalışıyor. Sorunu bölmeye çalışacağım.
underdark

5

ST_Dump'ın istediğinin bu olduğuna inanıyorum:

ST_Dump :

Bir geometriyi (g1) oluşturan bir dizi geometri_dump (geom, yol) satırı döndürür. Örneğin, MULTIPOLYGONS'u POLYGONS'a genişletmek için kullanılabilir. ...

Yani durumunuz için:

 SELECT (ST_Dump( ST_Union( the_geom ) )).geom
 FROM clc00_c31_forests
 GROUP BY substr(code_00,1,2)

Yapmaya çalıştığınız tablo oluşturma işlemiyle nasıl etkileşime gireceğinden emin değilim, ancak size geometrileri ayrı girişler olarak vermelidir. Daha sonra, verileri geometriler üzerinde toplamak için iki tablo arasında (&& ve ST_Contains kullanarak) uzamsal birleştirme yapabilirsiniz.


2
Not: Bu sadece ST_Union'un hafıza sorunlarının ele alındığı durumlarda faydalı olacaktır! :)
yhw42

4

PostGIS'iniz GEOS 3.1.0+ sürümüne karşı derlendi mi? Bu versiyon için, çok daha hızlı bir kademeli birleşme uygulandı, ancak bulunmazsa, büyüklük emirleri olan eski kodu kullanacaksınız.

Güncelleme : PostGIS'iniz basamaklı birlik yaklaşımını kullanıyor gibi görünüyor, ancak hafıza açlığı gerçektir. Kullanılabilir hafızayı Postgres örneğinize yükseltmeyi denemek isterim, işte Paul Ramsey'nin 2007 FOSS4G PostGIS konuşmasından bazı tavsiyeler :

  • Disk erişimi yavaş olduğundan, verileri önbelleğe almak için daha fazla bellek kullanılarak daha yüksek performans elde edilebilir!
    • Artırmak shared_buffers
    • Fiziksel RAM - OS ihtiyacı *% 75
  • Sıralama hafızada daha hızlı
    • Artırmak work_mem
  • Disk temizliği daha fazla bellekle daha hızlı
    • Artırmak maintenance_work_mem
  • Bağlantı başına ayrıldı
  • Ayrıca
    • Artırmak wal_buffers
    • Artırmak checkpoint_segments
    • Azaltmak random_page_cost

Sizin durumunuzda, arttırmayı deneyeceğim shared_buffers, genel öneri, bir veritabanı sunucusu için mevcut belleğinizin% 25'i, ancak mevcut değerinin 3-4 katına çıkmayı ve tamamlanıp tamamlanmadığını görmeyi deneyin.


postgis_geos_version () döner: 3.2.0-CAPI-1.6.0 ... Sanırım bu iyi. ST_Collect'i deneyeceğim, teşekkürler.
underdark

Peki, ST_Collect herhangi bir sınırı çözmez ve aynı zamanda dev bir Multipolygon yaratır.
underdark

evet, ST_Collect sayfasını yanlış okudum. PostGres'in hafıza kullanımını ayarlamak için daha spesifik tavsiyeler sunmak üzere cevabımı güncelledim.
scw
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.