PostGIS: Linestring'in tek taraflı ST_Buffer'ı garip çıktılar üretir
Aşağıdaki örnekte bir astar bağı PostGIS tablosu (siyah ve sarı) ve tek taraflı bir ST_Buffer çıktı poligonu (kırmızı) var. Arabellek mesafesi, iç çizgi tablosunda saklanan bir öznitelik değerine bağlıdır.
Gördüğünüz gibi tamponlardan biri yanlış ve belirli bir miktarı için kendisinin bir bölümünü kesiyor. Bu neden oldu? Düzeltilebilir mi? Astarlama bölümünün içbükey hale geldiği bir sorun gibi görünüyor.

Bunu kendiniz için benzer bir sorgu kullanarak deneyin:
SELECT ST_BUFFER('LineString (638327 331059, 638337 331048, 638337 331037, 638343 331023, 638358 331014, 638380 330991, 638382 330978, 638391 330966, 638410 330959, 638420 330953)',50,'side=right')
Başka bir örnekte bunun gerçekleştiğini görüyorum (siyah çizgi 1 özellik, tampon çokgen gibi):

Ve bunu bununla deneyin:
SELECT ST_BUFFER('LineString (600296 172961, 600304 172962, 600307 172965, 600307 172969, 600307 172971, 600309 172974, 600308 172976, 600307 172979, 600306 172981, 600307 172982, 600311 172980, 600313 172979, 600317 172979, 600321 172982, 600325 172982, 600327 172979, 600328 172976, 600331 172974, 600338 172974)',10,'side=right')
Daha garip sonuçlar için tampon mesafelerini artırın. EPSG: Her iki durumda da 27700.
Yanıtlar
Bunlar, tek taraflı tampon algoritmasındaki eksikliklerden kaynaklanır (hatalar değil, algoritma tasarımının bilinen sınırlamalarıdır).
Bu bir GEOS sorunu olarak kaydedilir . Henüz bir düzeltme için tahmini varış süresi yok.
Bu sorunu gideren bir geçici çözüm hattı oluşturdum. Yol boyunca birkaç geçici ara tablo oluşturmayı içerir, ancak bunları anında silebilirsiniz.
- Hattınızı
ST_BUFFER
normal kullanarak tamponlayın, kaotik bir çıktınız olmayacak. (yani,'side=left/right'
parametreyi kullanmayın ). ST_Split
1. adımdaki tamponu çizgiyi kullanarak merkez boyunca ikiye bölmek için kullanın .ST_UNION
bitişik bağlantı hatlarına sahip hat! bu, kesme hattının tamponun içinden ve ötesine uzanmasını sağlayacaktır . Aksi takdirde hiçbir şeyi kesmez.- Hattınızı yeniden tamponlayın, ancak bu sefer yalnızca bir tarafı tamponlayın. İstemediğin taraf bu olmalı .
ST_PointOnSurface
Her 'yanlış' yan tampon şekli için kullanarak bir nokta tablosu oluşturun .- Noktalarla kesişen bulunan bölünmüş çokgen tamponundan (2. adımdan) herhangi bir poligonu silmek için bu yeni nokta tablosunu kullanın.
- Artık, 'yanlış' taraf ondan kaldırılmış olarak tam tampon şekli ile kaldınız. yani. istediğiniz doğru tarafa bırakılırsınız.
Bunu büyük ölçüde özetledim ve her çizgi parçası için kesmeye yardımcı olacak bitişik bir bağlantı hattınız olduğunu varsaydım. Bunu 1000'lerce parçadan oluşan bir sahil şeridi için de yaptım. Bu yüzden, yukarıdaki adımların her yinelemesini içine eklemek için bir ana bilgisayar tablosu kullandım. Her bir çizgi parçası üzerinden döngü yapmak için, satır tablosunun otomatik olarak artan bir id sütunu olduğundan emin oldum (böylece her bir çizgi parçası için, onu ondan önceki ve sonraki bölümle birleştirebildim: yani, n-1, n, n + 1). Daha fazla açıklığa kavuşturmak için bu yanıtı yakında güncelleyeceğim.