PostGIS'te satırlardan çokgen oluşturma


13

Bir çizgiden küçük çokgenler içinde bir çokgen bölmek çalışıyorum, ama ben st_split işlevini kullanamıyorum düşünüyorum. İhtiyacım olan şey, linestring ızgarasını kullanarak büyük bir poligonun içinde küçük çokgenler oluşturmak.

Bazı yollar denedim ama sonucu alamıyorum. Ne denedim:

St_split () kullanarak bir LineString öğesinden bir çokgeni bölün

Bir sınır poligonundan.

resim açıklamasını buraya girin

Ve Linestring masası:

resim açıklamasını buraya girin

Aşağıdaki çokgenlere ihtiyacım var:

resim açıklamasını buraya girin

Sorun : Bir çokgeni birkaç satırdan ayıramıyorum, ne de çok satırlı bir çokgenden.

Ben çalışıyorum diğer yöntem st_polygonize () ile satırlardan bir çokgen oluşturmaktır çalıştığım SQL is:

SELECT 
   g.path[1] as gid, 
   g.geom::geometry(polygon, 22033) as geom 
FROM
   (SELECT 
     (ST_Dump(ST_Polygonize(geom))).* 
   FROM linestable
) as g;

Çıkarılan PostgreSQL ve PostGIS kullanarak çizgi segmentlerinden poligonları oluşturma

Sorun : Yalnızca bir çokgen (sınır) alabilirim.

Birisi bana lintondan çokgenleri almanın en iyi yolu olacağını söyleyebilir mi, yoksa bir şey eksik mi?

Not: Tablolar aynı SRID'de ve geometriler bir ızgaraya yaslanır. QGIS'te, poligonize işlemini hatlardan poligona mükemmel bir şekilde çalıştırabilirim.

John'un talebi olarak, burada linestring masası. https://drive.google.com/file/d/0B603y_m735jfS014S0EyVnpMUEU/view?usp=sharing


1
Linestring geometrilerini bir yere gönderebilir misiniz? ST_Dump ile birlikte ST_Polygonize çalışmalıdır.
John Powell

Elbette. Gönderiyi tablo bağlantısıyla düzenledim.
Pablo Pardo

@ JohnPowellakaBarça buna bakabilirsin. Bu soru harika. ST_Polygonize örnek kümesinde tek bir çokgen döndürür. Aslında açık LINESTRINGS karmaşasını bozmalı ve dikdörtgenler oluşturabilecek hepsini bulmalıyız?
Evan Carroll

1
@EvanCarroll. Elbette. Çılgınca meşgulüm atm, muhtemelen birkaç günlüğüne değil.
John Powell

1
@ppardoz. Espero que esto te ayude. Senin masa defs tüm İspanyolca :-) fark ettim
John Powell

Yanıtlar:


4

Bu çalışma ilk satırları bir MultiLinestring içinde noded linestrings bir dizi dönüştürmek için ST_Collect ile birlikte, ST_Node kullanarak aldım .

ST_Node dokümanlarında söylediği gibi :

Tüm giriş dizilerini korurken, mümkün olan en az sayıda düğümü kullanarak bir dizi dizgiyi tamamen düğümleyin.

Bunun anlamı, bir çokgenin dış halkasına eşdeğer olması için tüm linestringlerin olası tüm kombinasyonlarda birleştirilmesidir. Oysa, hiçbiri kendi başına bir çokgeni tanımlayan bir dizi LineStrings'i ST_Polygonize etmeye çalışırsanız , LineStrings'i geri alırsınız. Yani, bu işe yarıyor:

WITH multi(geom) AS (
  SELECT ST_Node(ST_Collect(geom))
  FROM leyenda_digitalizar00
)
SELECT ST_AsText( (ST_Dump(ST_Polygonize(geom))).geom )
FROM multi;

Bunun ilk kısmını (CTE multi) çalıştırırsanız, çıktı şöyle görünür:

MULTILINESTRING ((204.5 69.9000000000004.204.5 69.9000000000004), (204.5 68.9.205.4 68.9), (204.5 68.9.204.5 69.204.5 69.1.204.5 69.2.204.5 69.3.204.5 69.4.204.5 69.5.204.5 69.204.5 69.204.5 69.204.5 69.204.5 69 204.5 69.9000000000004), (209.5 68.9.209.5 68.8.209.5 68.7.209.5 68.6.209.5 68.5.209.5 68.4.209.5 68.3.209.5 68.2.209.5 68.1.209.5 68.209.5 67.9.209.5 67.8.209.5 67.209.5 67.209.5 67.209.5 67.209.5 67.209.5 67.209 , 209.5 .......

Şimdi, bu MultiLinestring'i ST_Polygonize olarak beslediğinizde , beklendiği gibi çalışır, örn.

POLİGON ((205.4 68.9.204.5 68.9.204.5 69.204.5 69.1.204.5 69.2.204.5 69.3.204.5 69.4.204.5 69.5.204.5 69.6.204.5 69.7.204.5 69.8.204.5 69.9.204.5 69.9.200000000004205.4 69.9.20.4.4 69.920.4.4 69,205.4 69.9.20.4.4)

POLİGON ((204.5 69.9000000000004.204.5 70.204.5 70.1.204.5 70.2.204.5 70.3.204.5 70.4.206.5 70.4.209.5 70.4.209.5 70.3.209.5 70.2.209.5 70.1.209.5 70.9.205.5 69.9.2020.5 69.900.500.900.500))

POLİGON ((206.8 70.4.204.5 70.4.204.5 70.5.204.5 70.6.204.5 70.7.204.5 70.8.204.5 70.9.204.5 71.204.5 71.1.204.5 71.2.204.5 71.3.204.5 71.4.206.8 71.4.206.8 70.4))

Açıkçası, ST_AsText sadece örnekleme içindir ve yol kimliğini de istiyorsanız tweak yapmanız gerekir.

Anahtar paket servisi olan ST_Polygonize, bir çokgenin taslağını zaten tanımlayan satır dizilerini bekler .


Bu gerçekten harika, bu çözümün işe yaradığını doğrulayabilirim! Flip tarafında, neden ST_Polygonize()satır dizeleri aldığını ya da ST_Node()ilk önce arama yapmadan bunun kullanım durumunun ne olduğunu merak ediyorum
Evan Carroll

1
@EvanCarroll. Cevabın ST_Polygonize'ın zaten çokgeni temsil eden bir kümede bulunan Linestring'leri alırken, bu sorudaki linestringlerin birden fazla çokgen oluşturduğunu düşünüyorum. Anladığım kadarıyla ST_Node bunu yapar. Daha fazla araştırmaya ve cevabı güncellemeye çalışacağım.
John Powell
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.