Czy tworzysz jednostronne bufory lub linie równoległe w PostGIS?

19

Szukam sposobu na utworzenie w PostGIS tak zwanych buforów jednostronnych lub linii równoległych. Przykład: 1. bufor, 2. jedna strona, 3. obie strony

alternatywny tekst

Znalazłem trochę dyskusji na liście mailingowej z 2009 roku i informacje, że została ona zaimplementowana w GEOS , ale nic o aktualnym statusie PostGIS.

Jeśli funkcja nie jest jeszcze zaimplementowana, czy znasz jakieś obejścia? Czy można odciąć jedną stronę normalnego bufora?

podmrok
źródło
Więc szukasz odpowiednika „przesunięcia” w programie AutoCAD?
dassouki,
@dassouki: Przepraszam, nie znam AutoCAD. Ale myślę, że UMN Mapserver ma opcję „przesunięcia”, która zrobiłaby to, czego szukam.
podmroku
Jak utworzyć jednostronne bufory lub linie równoległe z tabeli zawierającej 600 linii?
Witamy na stronie. Jeśli aktualny zestaw odpowiedzi nie rozwiąże Twojego problemu, powinieneś otworzyć to jako nowe pytanie (i podać, dlaczego to pytanie nie odpowiada na Twój problem). W formacie witryny nie jest to odpowiednie miejsce do złożenia tego oświadczenia, ponieważ nie jest to odpowiedź na pytanie.
Andy W,
Jak mogę utworzyć równoległe linie w tabeli MULTILINESTRING?
Felipe Costa

Odpowiedzi:

13

Właściwe bufory jednostronne miały wylądować w wersji 1.5 , ale wydaje mi się, że chociaż style wylądowały, to po bokach się nie udało. Istnieje jednak obecny zestaw łatek, który odsłania GEOSSingleSidedBufferi wykonuje bufor jednostronny zgodnie z oczekiwaniami , pod nazwą ST_OffsetCurve; patrz dalsze tło na bilecie # 413 . W użyciu:

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)
scw
źródło
Cześć Próbuję użyć tego rozwiązania, ale nie używam często postgis - przetestowałem to zapytanie i otrzymałem wartości wyjściowe, ale jak mam je przełożyć na funkcje? Chcę tylko linii na końcu, albo jako część oryginalnej tabeli, albo nowej. To jest moje zapytanie: wybierz ST_AsText (ST_OffsetCurve (test_data_.geom, test_data_.buffer_dis, 'join = mitre mitre_limit = 5.0')) z test_data_;
kflaw 18.04.16
@kflaw - zapewne już to zrozumiałeś, ale musisz tylko dodać na początku zapytania: „utwórz widok nowej tabeli jako” lub dla widoku, utwórz lub zastąp widok nowego widoku jako ”, a następnie instrukcję select.
jbalk
4

Ta próbka tworzy dwa wielokąty po obu stronach linii. Wymaga PostGIS 1.5 lub nowszego. Nie jestem pewien, jak dobrze poradzi sobie z przecinającymi się liniami.

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

));

Wyprowadza:

                        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 działa w następujący sposób:

  1. Buforuj oznaczenie linii za pomocą ST_Buffer. Korzystamy z funkcji PostGIS 1.5 obsługującej niestandardowe zaślepki, aby w ogóle nie określać zaślepek. Zobacz przykład poniżej.
  2. Podziel zbuforowany wielokąt na dwa, używając oryginalnej linii, używając metody udokumentowanej na wiki .

Można to poprawić w przyszłości, aby poradzić sobie z samobrzeżnymi liniami.

Buforowany podszewka z płaską nasadką

fmark
źródło
3

Ta modyfikacja tworzy dwa równoległe linie. Wymaga PostGIS 1.5 lub nowszego.

wymagana geometria lub wkt i odległość w buforze


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))

-------------- WYNIKI

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

Dante Fuster
źródło
0

Ponieważ nadal nie mogę tutaj komentować, dodam tę odpowiedź

SCW daje najlepszą odpowiedź,

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)

Wygląda jednak na zmianę funkcji
http://postgis.refractions.net/docs/ST_OffsetCurve.html

Teraz 'right'parametr nie jest konieczny. Użycie odległości dodatniej utworzy lewą stronę, a odległość ujemną utworzy prawą stronę

Również moja poczta nie wymaga łatki

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"
Juan Carlos Oropeza
źródło