PostGIS kullanarak daha büyük çokgen oluşturmak için çok sayıda küçük çokgen birleştirmek?


47

Postgis'te SRID 27700 kullanarak aşağıdaki katman var:

görüntü tanımını buraya girin

Birleşik Krallık'taki her idari bölge ve (renk gruplarından da görebileceğiniz gibi) her birinin içinde bulunduğu bölgeyi belirten bir metin alanı var.

Yapmak istediğim, belirli bir ilçedeki küçük ilçelerden daha büyük ilçeli çokgenler yapmaktır, bu nedenle, tüm deniz mavisi renk çokgenlerinin üzerindeki resimde EG, buradaki tüm kutupları içeren tek dış halkadan büyük bir çokgen oluşturur. renk, mesela tamamen mor, kahverengi, pembe, gri vb. hepsi bir poligon oluşturmalı.

Ben zaten aşağıdakileri denedim:

insert into parishesmerged (geometry)
select astext(multi(ST_Union(the_geom))) as the_geom from parishes
group by county_name

Fakat daha sonra işlemede büyük problemler yaşadığım kırılmış geometriler oluşturuyor.

Başlıca çıktı alanlarının bulunduğu daha basit bir ilçe düzeyinde harita yapmaya çalışıyorum.

Herhangi bir çözümün Postgis'te de olması gerekmiyor, tam OS4Geo yığınının yüklü olması, QGis'in en son sürümü ve bir çubuğumu sallayabileceğimden daha fazla dosya kullanıyorum.

Sahip olmadığım tek şey ArcGis gibi büyük çocuklar (Etrafta bir yerde uzanmış eski bir Mapinfo olsa da)


Kayıt için oluşturmaya çalıştığım veri kümesi, .NET kullanarak GIS uygulamaları yazmak isteyen .NET programcılarına yönelik yazdığım bir GIS kitabına eşlik etmektir.


Aşağıdaki önerileri denedikten sonra, en iyi sonuç veren, 'Paul Ramsey' çözümü oldu.

Şimdi kitabım için yeterince basit, ancak ilginç bir coğrafi-mekansal SQL göstermeme izin verecek kadar karmaşık, hoş bir basitleştirilmiş ilçe ve ilçe dosyasına sahibim.

Sonunda Paul'un çözümü benim için çalışan olsa da, poligon haritasını basitleştirmek ve karmaşıklığı daha da azaltmak gibi şeylerin diğer cevaplarını da çizdim.

Ancak bunu yaparken gözlemlediğim şey, ST_Collect gerçekten ST_Union'dan daha hızlı olsa da, koşmak için koşmak aynı zamanda kırılmış geometrilerden en çok sorumlu olanıydı. Tahminimce hız artışı çekirdek fonksiyonunda daha az doğruluk pahasına elde ediliyor.


Bu işlem bir "çöz" olarak bilinir. PostGIS konusunda tecrübeli değilim, ancak çözme işlemini gerçekleştiren ST_Union komutunu kullanabileceğinizi düşünüyorum .
dmahr

Merhaba dmahr, açıklama için teşekkürler, ne dendiğinden emin değildim, ancak sorumu okursanız çoktan denediğimi göreceksiniz :-)
shawty

Üzgünüz, üzgünüm ... bunu görmedim. Select deyimini bölümsüz denedin astext(multi())mi? Sadece diğer PostGIS çözme örneklerinde gördüğüm şeyden ayrılıyorum.
dmahr

Henüz değil, şimdi deneyeceğim. Tks. Çözünen örnekler için bağlantınız var mı?
shawty

"Tek dış halka" istiyorsanız ya da istemiyorsanız lütfen express için düzenleme yapın. (cevabımı gör)
Peter Krauss

Yanıtlar:


43

ST_Union işe yarayacaktı ama işin neredeyse kesin olarak temiz değildi. Demek ki küçük şeylerinin sınırları tamamen mükemmel değil. Köşelerin hizaya girme ihtimalini artırmak için onları yavaşça bir ızgaraya bağlayabilirsiniz, ancak bahse girerim hala işe yaramayan birkaç vakanız olacak. Ya toleransların ötesinde olacaklar ya da daha muhtemel olarak, tepe noktalarının eşleştirilmediği yerler olacak, yani bir tarafta bir çizgi ve diğer tarafta bir köşe olacak.

 CREATE TABLE merged AS
 SELECT ST_Union(ST_SnapToGrid(the_geom,0.0001)) 
 FROM parishes
 GROUP BY county_name;

PostGIS 2.0'a sahipseniz, toleranslı bir topoloji yapısı inşa etmek, aradığınız cevaba, eğer biraz şansınız varsa, getirebilir.


Geometrilerin düzeltilmesi için iyi bir ipucu, ancak "... tüm polisajları içeren tek dış halkadan büyük bir çokgen ..."?
Peter Krauss

'SnapTo' hakkında bir şey bilmiyordum bunu deneyeceğim :-) Tks. Ne yazık ki, hayır, henüz PG 2 kullanmıyorsanız, yükseltme olsa boru hattında.
shawty

Sözdiziminizin doğru olduğundan emin değilsiniz. Başına postgis.net/docs/ST_Union.html , 2. parametrede bir sayı kabul imza yok olduğunu.
Aren Cambre

Haklısın, parantez yanlış yerdeydi. Düzenlenen.
Paul Ramsey

buna eşdeğer bir mysql var mı? Sürekli alıyorum Incorrect parameter count in the call to native function 'ST_Union've bunun bir mysql sınırlaması olup olmadığını bilmiyorum.
Jayen

7

Diyelim ki, "... tüm halkaları içeren tek dış halkadan büyük bir çokgen ...". ST_ExteriorRing bunu yapar,

SELECT ST_MakePolygon(ST_ExteriorRing(ST_Union(GEOM)))
FROM GEOMTABLE GROUP BY ATTRCOLUMN

ST_Union () öğesini önerildiği gibi kullanabilir veya ST_Collection () ile test edebilirsiniz.


NOTLAR: Küçük halkalardan veya "kırılmış geometrilerden" kaçınmak için her geom için st_convexhull ve / veya ST_Simplify kullanabilirsiniz,

SELECT ST_MakePolygon(ST_ExteriorRing(ST_union(ST_Simplify(GEOM,0.5))))
FROM GEOMTABLE GROUP BY ATTRCOLUMN

ve geometrilerinizi kontrol edin,

SELECT * FROM (
   SELECT gid, ST_IsValid(geom) as valid, ST_IsSimple(geom) as simple 
   FROM GEOMTABLE) AS t  
WHERE NOT(valid AND simple); 

Karışıklık için özür dilerim: Benim tanımımla kastettiğim, küçüklerden yaratılan daha büyük bir çokgendi, “Dış Halka” bağlamına bağlı olarak farklı insanlara farklı şeyler ifade edebileceğini, niyetimden yaratılan tek bir çokgeni tanımlamak olduğunu fark ettim. Her poligon grubunun etrafında sınır.
shawty

7

ST_Collect işlevi PostgreSQL terminolojisinde bir "toplama" işlevidir.

" SELECT ST_Collect(GEOM) FROM GEOMTABLE GROUP BY ATTRCOLUMN", ATTRCOLUM’un her bir değeri için ayrı bir GEOMETRY KOLEKSİYONU döndürecek

http://postgis.net/docs/ST_Collect.html

Not: ST_Collect, ST_Union'dan çok daha hızlıdır


3
Bunu denedim ve biraz farklı sonuçlar aldım, ancak ihtiyacım olan bir geometri koleksiyonu var mı? Ben aslında isteğe derbi & Nottingham hem sağ merkezinde ayrı bölgelerini oluşturan Özellikle Derbyshire & nottinghamshire içinde delikleri (ile bir büyük poligon yapmaya çalışıyorum olsa hız farkı gözlemlemek yaptı şu Kewl yüzden..
shawty

2

Sorunuzdan Ordnance Survey'in Sınır Çizgisi ürününü kullandığınızı varsayıyorum. Eğer durum buysa, o zaman zaten bir İlçe düzeyinde veri seti içermektedir, bu yüzden onu daha düşük seviye bölge alanlarından kendiniz üretmeye çalışmanıza gerek yoktur.

Sınır Çizgisi'ni kullanmıyorsanız, OS OpenData lisansı altında ücretsiz olduğundan ve doğrudan PostGIS'e yükleyebileceğiniz bir şekil dosyası olarak İlçe düzeyine sahip olmanızı öneririm.


2
Bilmeyenler için bir link vermeye ne dersiniz? Teşekkürler.
jonatr

1
Merhaba CHEnderson aslında haklısın, evet OS Opendata'dan ayarlanan sınır katmanı verilerini kullanıyorum, maalesef ilçe sınırları tamamlanmadı, asıl ilçenin şekil dosyası sadece ilçeler olarak adlandırılanları, Londra ilçeleri etrafındaki alanları içeriyor Londra ve diğer dosyaların hepsinde, bazılarında diğerlerinden daha düşük ve daha küçük seviyeler vardır. Birleşik Krallık'ın bütün taslaklarını içeren ve daha sonra tüm üst düzey ilçeleri ve belediye sınırlarını tek bir katmanda çıkarma şansına sahip olan tek dosya cemaat katmanıdır, bu yüzden neden yapmaya çalışıyorum.
shawty

İlgilenenler için ilçe sınırlarını ve daha fazlasını buradan indirebilirsiniz: ordnancesurvey.co.uk/oswebsite/products/os-opendata.html
shawty
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.