İlgilendiğiniz her poligon için bir kesişen poligon grubu aldığınızı söylediğiniz için, "poligon yerleşimi" olarak adlandırılan şeyi oluşturmak isteyebilirsiniz.
Bu tam olarak Adam'ın çözümünün yaptığı şey değil. Farkı görmek için, ABC kavşağının bu resmine bakın:
Adam'ın çözümünün hem "AB! C" hem de "ABC" alanını kapsayan bir "AB" poligonunun yanı sıra "AC! B" ve "ABC" yi kapsayan bir "AC" poligonu ve " "BC" A "ve" ABC "olan çokgen. Bu nedenle, "AB", "AC" ve "BC" çıkış poligonlarının tümü "ABC" alanıyla örtüşür.
Bir poligon üst üste binme olmayan poligonlar üretir, böylece AB! C bir poligon olur ve ABC bir poligon olur.
PostGIS'de çokgen bir kaplama oluşturmak aslında oldukça basittir.
Temelde üç adım var.
Adım 1, astarı çıkartmaktır [Poligonun dış halkasını kullandığımı, delikleri düzgün bir şekilde tutmak istiyorsanız biraz daha karmaşık hale geldiğini unutmayın]:
SELECT ST_ExteriorRing(polygon_col) AS the_geom FROM my_table) AS lines
Adım 2, çizgiyi "düğümlemek" tir (her kesişme noktasında bir düğüm üretir). JTS gibi bazı kütüphanelerde bunu yapmak için kullanabileceğiniz "Noder" sınıfları vardır, ancak PostGIS'te ST_Union işlevi sizin için yapar:
SELECT ST_Union(the_geom) AS the_geom FROM (...your lines...) AS noded_lines
Adım 3, ST_Polygonize işlevi tarafından yapılan tüm bu satırlardan gelebilecek tüm örtüşmeyen tüm çokgenleri oluşturmaktır :
SELECT ST_Polygonize(the_geom) AS the_geom FROM (...your noded lines...)
Bu adımların her birinin çıktısını geçici tabloya kaydedebilir veya hepsini tek bir ifadede birleştirebilirsiniz:
CREATE TABLE my_poly_overlay AS
SELECT geom FROM ST_Dump((
SELECT ST_Polygonize(the_geom) AS the_geom FROM (
SELECT ST_Union(the_geom) AS the_geom FROM (
SELECT ST_ExteriorRing(polygon_col) AS the_geom FROM my_table) AS lines
) AS noded_lines
)
)
ST_Dump kullanıyorum çünkü ST_Polygonize'in çıktısı bir geometri koleksiyonudur ve her sıranın çokgen kaplamasını oluşturan çokgenlerden biri olduğu bir tabloya sahip olmak (genellikle) daha uygundur.