PostGIS'de tek taraflı tamponlar mı yoksa paralel çizgiler mi oluşturuyorsunuz?


19

PostGIS'de tek taraflı tamponlar veya paralel çizgiler oluşturmanın bir yolunu arıyorum. Örnek: 1. tampon, 2. tek taraf, 3. her iki taraf

alternatif metin

2009 listesindeki posta listesiyle ilgili bir tartışma ve GEOS'ta uygulandığına dair bilgiler buldum , ancak mevcut PostGIS durumu hakkında hiçbir şey bulunamadı.

İşlev henüz uygulanmadıysa, herhangi bir geçici çözüm biliyor musunuz? Normal bir tamponun bir tarafını kesmek mümkün mü?


Yani AutoCAD'de "ofset" e eşdeğer bir şey mi arıyorsunuz?
dassouki

@dassouki: Üzgünüm, AutoCAD'i bilmiyorum. Ama bence UMN Mapserver aradığım şeyi yapacak bir "ofset" seçeneği var.
underdark

600 satırlı bir tablodan tek taraflı arabellekler veya paralel çizgiler nasıl oluşturulur?

Siteye hoş geldiniz. Mevcut cevaplar sorununuzu çözmezse, bunu yeni bir soru olarak açmalısınız (ve bu sorunun neden sorununuzu cevaplamadığını belirtmelisiniz). Site formatı içinde, bu sorunun cevabı olmadığı için bu ifadeyi yapmak için uygun bir yer değildir.
Andy W

MULTILINESTRING tablosunda nasıl paralel çizgiler oluşturabilirim?
Felipe Costa

Yanıtlar:


13

Uygun tek taraflı tamponların 1.5'e inmesi gerekiyordu , ama bana öyle geliyor ki, stiller inerken, taraflılık bunu yapmadı. Ancak beklendiği gibi tek taraflı tamponu ortaya çıkaran ve gerçekleştiren mevcut bir patchset var GEOSSingleSidedBuffer, adıyla ST_OffsetCurve; 413 numaralı biletin arka planına bakınız . Kullanımda:

select ST_AsText(ST_OffsetCurve(
ST_GeomFromText('LINESTRING(10 10,10 20, 20 20 )'),
1,'right', 'join=mitre mitre_limit=5.0'));
--------------
LINESTRING(20 19,11 19,11 10)

Merhaba ben bu çözümü kullanmaya çalışıyorum ama postgis sık kullanmıyorum - Ben bu sorguyu test ve bazı çıkış değerleri olsun, ama nasıl bu özelliklere dönüştürmek? Sonunda, orijinal tablonun bir parçası olarak ya da yeni bir tane istiyorum. Bu benim sorgu: ST_AsText (ST_OffsetCurve (test_data_.geom, test_data_.buffer_dis, 'join = mitre mitre_limit = 5.0')) test_data_'dan;
kflaw

@kflaw - muhtemelen bunu zaten çözmüşsünüz, ancak sorgunun başına şunu eklemeniz gerekir: "yeni olarak oluştur" veya bir görünüm için "yeni görünümü oluştur veya değiştir" ve ardından select ifadesi.
jbalk

4

Bu örnek, bir linestring'in her iki tarafında iki çokgen oluşturur. PostGIS 1.5 veya üstünü gerektirir. Kendilerini geçen çizgilerle ne kadar iyi başa çıkacağından emin değilim.

SELECT ST_AsText(geom)

FROM ST_Dump ((

SELECT 
  ST_Polygonize(GEOMUNION(ST_Boundary(ST_Buffer(the_geom, 0.5, 'endcap=flat join=round')), the_geom)) AS buffer_sides 
FROM
  (SELECT ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)') AS the_geom) AS table1

));

Çıktıları:

                        st_astext

------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------
 POLYGON((0.5 5,0.509607359798385 5.09754516100806,0.538060233744357 5.19134171618254,0.584265193848727 5.2777851165098,
0.646446609406726 5.35355339059327,0.722214883490199 5.41573480615127,0.808658283817455 5.46193976625564,0.9024548389919
36 5.49039264020162,1 5.5,5 5.5,5 5,1 5,1 1,0.5 1,0.5 5))
 POLYGON((5 5,5 4.5,1.5 4.5,1.5 1,1 1,1 5,5 5))
(2 rows)

Kod şu şekilde çalışır:

  1. ST_Buffer kullanarak linestring arabelleğe alın. Hiçbir uç sınırı belirtmek için özel uç kapaklarını destekleyen PostGIS 1.5 özelliğinden yararlanıyoruz. Aşağıdaki örneğe bakın.
  2. Wiki'de belgelenen yöntemi kullanarak, orijinal satırı kullanarak arabelleğe alınmış çokgeni ikiye bölün .

Bu, gelecekte kendi kendine kesişen çizgilerle başa çıkmak için geliştirilebilir.

Düz uç kapaklı tamponlu linestring


3

Bu modifikasyon iki paralel çizgi oluşturur. PostGIS 1.5 veya üstünü gerektirir.

gerekli geometri veya ağırlık ve tampondaki mesafe


SELECT astext(
     st_removepoint( 
     st_removepoint(        st_linemerge(ST_Difference(st_boundary(geom),ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)')))         ,0),
      st_npoints(st_linemerge(ST_Difference(st_boundary(geom),ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)'))))-2)

    ) as parallel
    FROM ST_Dump ((
    SELECT 
    ST_Polygonize(st_union(ST_Boundary(ST_Buffer(geometria, 0.5, 'endcap=flat join=mitre mitre_limit=5.0')), geometria)) AS buffer_sides 
    FROM
    (SELECT ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)') 
        AS geometria) AS tabla))

-------------- SONUÇLAR

"LINESTRING(0.5 1,0.5 5.5,5 5.5)"
"LINESTRING(5 4.5,1.5 4.5,1.5 1)"


0

Hala buraya yorum yapamadığım için bu cevabı ekliyorum

SCW en iyi cevabı verir,

select ST_AsText(ST_OffsetCurve(
ST_GeomFromText('LINESTRING(10 10,10 20, 20 20 )'),
1, 'right', 'join=mitre mitre_limit=5.0'));
--------------
LINESTRING(20 19,11 19,11 10)

Ancak işlev değişikliği http://postgis.refractions.net/docs/ST_OffsetCurve.html gibi görünüyor

Şimdi 'right'parametre gerekli değil. Pozitif mesafe kullanmak sol tarafı yaratacak ve negatif mesafe sağ tarafı yaratacaktır

Ayrıca postgilerimle yama gerektirmez

SELECT PostGIS_full_version();
"POSTGIS="2.0.3 r11132" GEOS="3.3.8-CAPI-1.7.8" 
PROJ="Rel. 4.8.0, 6 March 2012" GDAL="GDAL 1.9.2, 
released 2012/10/08" LIBXML="2.7.8" LIBJSON="UNKNOWN" RASTER"
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.