İzolinleri postgis ile izopoligolara nasıl dönüştürebilirim?


9

Tablo gibi isolines bir postgis tablosu var:

CREATE TABLE myisolines
(
  gid serial NOT NULL,
  isotime timestamp without timezone,
  val numeric(10,4),
  geom geometry(LineString,4326)
);

Görsel olarak bu linestring nesneleri şöyle görünür:

resim açıklamasını buraya girin

Verilerimin uzamsal boyutunu biliyorum, bu yüzden bir Bbox ekleyebilirim, böylece LineStrings bir tür kapalı olabilir.

resim açıklamasını buraya girin

Tablodan çokgenli myisopolygons, myisolinesüst üste gelmeyecek, sürekli bir yüzey oluşturacak ve çokgenin oluştuğu valen düşük izoline sahip bir sütun içeren bir izopolygolar tablosu oluşturmak istiyorum val. Kendiliğinden kapanan isoline (ada) veya bbox ile kapatılmış isoline'den oluşturulabileceğini anlıyorum, bu durumda valbu özel izolden alınmalıdır. Görsel olarak şöyle görünmelidir:

resim açıklamasını buraya girin

Bir şekilde topoloji yaratabileceğimi ve sonra yüzleri çokgenlere dönüştürebileceğimi düşündüm, ancak düzgün bir şekilde nasıl yapılacağını anlamıyorum. Bu nasıl yapılabilir?

Başka bir seçenek, bbox ve oluşturulan her çokgen arasında özyineli olarak bir fark işlevi kullanmak olacaktır, ancak sanırım bunu yapmanın doğru yolu değil ve kesinlikle hiç de hızlı değil.


ST_Split veya ST_BuildArea probleminiz için iyi adaylar
nickves

Yanıtlar:


3

İşte bir çözüm ST_Polygonize. Her sınır için bir çokgen oluşturur ve çokgenin kapsadığı minimum ve maksimum yüksekliği sağlar. Algoritma bir tepe ve bir çöküntü arasında ayrım yapamaz ve bu durumlarda hem min hem de maks için aynı yüksekliği döndürür.

WITH closed_contours AS (
    SELECT 
      ST_Union(geom) AS geom 
    FROM 
      (SELECT geom FROM contours 
       UNION ALL 
       SELECT ST_SetSRID(ST_Boundary(ST_Expand(ST_Extent(geom), -1e-10)), 4326) 
       FROM contours) 
sq)

SELECT
  poly_id, 
  min(polys.geom) AS geom, 
  min(elevation)  AS min_elev, 
  max(elevation)  AS max_elev
FROM
  (SELECT row_number() OVER () AS poly_id, geom FROM
      (SELECT 
         (ST_Dump(ST_Polygonize(geom))).geom
       FROM closed_contours) dump
  ) polys
INNER JOIN contours ON ST_Intersects(polys.geom, contours.geom)
GROUP BY poly_id;

WITHSorgunun maddesi mevcut hatlarına biraz kasılmış ölçüde ile unioning ile açık hatlarını "kapatır". ( ST_ExtentTek hassasiyetli bir kutu üreten ST_Polygonize, doulbe hassasiyetinde mükemmel bir şekilde kapalı ve noded girişler gerektiren , kullanımından kaynaklanan herhangi bir yuvarlama hatasını yıkamak için sözleşmeye tabidir). Kontürleriniz zaten kapalıysa (yani, bir ada ile çalışıyorsanız), bu adım atlanabilir.


0

Çok tecrübeli değilim, ama ST_MakePolygon fonksiyon geometrisini denerdim (geometri dış çizgileri, geometri [] iç çizgileri);


Bu soruya tam olarak cevap vermiyor.
John Powell

0

Bbox'ınızı kullanarak ve her kontur çizgisi üzerinde yineleme yaparak, ST_ConcaveHullher bölgeyi bir çokgene dönüştürmek için kullanabilirsiniz .

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.