PostGISで片側バッファまたは平行線を作成しますか?


19

PostGISでいわゆる片側バッファまたは平行線を作成する方法を探しています。例:1.バッファ、2。片側、3。両側

代替テキスト

2009年メーリングリスト、GEOS実装された情報に関する議論を見つけましたが、現在のPostGISステータスについては何も知りません。

関数がまだ実装されていない場合、回避策を知っていますか?通常のバッファの片側を切断することは可能ですか?


AutoCADの「オフセット」に相当するものをお探しですか?
dassouki

@dassouki:すみません、AutoCADを知りません。しかし、UMN Mapserverには、私が探していることを行う「オフセット」オプションがあると思います。
暗闇

600行のテーブルから片側バッファーまたは平行線を作成する方法は?

サイトへようこそ。現在の回答セットで問題が解決しない場合は、これを新しい質問として開く必要があります(そして、なぜこの質問があなたの問題に回答しないのかを述べてください)。サイトのフォーマット内では、これは質問に対する答えではないため、この声明を出すのに適切な場所ではありません。
アンディW

MULTILINESTRINGテーブルに平行線を作成するにはどうすればよいですか?
フェリペコスタ

回答:


13

適切な一方的なバッファをすることになった1.5に上陸してきたが、それはスタイルが土地をした一方で、偏りがでそれをしなかったように私には見えます。しかし、ある現在のパッチセットが公開GEOSSingleSidedBuffer予想通りと行い、片側のバッファが、名前の下でST_OffsetCurveチケット#413の背景を参照してください。使用中で:

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)

こんにちは私はこのソリューションを使用しようとしていますが、頻繁にpostgisを使用しないでください。このクエリをテストして出力値を取得しましたが、それらを機能に変換するにはどうすればよいですか 元のテーブルの一部として、または新しいテーブルの最後に行が必要です。これは私のクエリです:select ST_AsText(ST_OffsetCurve(test_data_.geom、test_data_.buffer_dis、 'join = mitre mitre_limit = 5.0')) from test_data_;
kflaw

@kflaw-おそらくすでにこれを理解しているかもしれませんが、クエリの先頭に追加する必要があります。「newtable asを作成」またはビューの場合、「newview asを作成または置換」の後にselectステートメントを追加します。
-jbalk

4

このサンプルは、ラインストリングの両側に2つのポリゴンを作成します。PostGIS 1.5以降が必要です。私はそれが自分自身を横切る線にどれだけうまく対処できるかわかりません。

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

));

以下を出力します:

                        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)

コードは次のように機能します。

  1. ST_Bufferを使用してラインストリングをバッファリングします。エンドキャップをまったく指定しないために、カスタムエンドキャップをサポートするPostGIS 1.5機能を利用します。以下の例を参照してください。
  2. wikiに記載されている方法を使用して、元の行を使用して、バッファーポリゴンを2つに分割します

これは将来、自己交差線に対処するために改善される可能性があります。

エンドキャップが平らなバッファ付きラインストリング


3

この変更により、2つの平行線ストリングが作成されます。PostGIS 1.5以降が必要です。

必要なジオメトリまたはWKT、およびバッファ内の距離


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

- - - - - - - 結果

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


0

ここにはまだコメントできないので、この回答を追加します

SCWがベストアンサーを提供し、

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)

ただし、関数はhttp://postgis.refractions.net/docs/ST_OffsetCurve.htmlを変更するように見えます

これで、'right'パラメーターは不要になりました。正の距離を使用すると左側が作成され、負の距離を使用すると右側が作成されます

また、私のPostGISではパッチは不要です

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"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.