PostGISでいわゆる片側バッファまたは平行線を作成する方法を探しています。例:1.バッファ、2。片側、3。両側
2009年のメーリングリストや、GEOSで実装された情報に関する議論を見つけましたが、現在のPostGISステータスについては何も知りません。
関数がまだ実装されていない場合、回避策を知っていますか?通常のバッファの片側を切断することは可能ですか?
PostGISでいわゆる片側バッファまたは平行線を作成する方法を探しています。例:1.バッファ、2。片側、3。両側
2009年のメーリングリストや、GEOSで実装された情報に関する議論を見つけましたが、現在のPostGISステータスについては何も知りません。
関数がまだ実装されていない場合、回避策を知っていますか?通常のバッファの片側を切断することは可能ですか?
回答:
適切な一方的なバッファをすることになった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)
このサンプルは、ラインストリングの両側に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)
コードは次のように機能します。
これは将来、自己交差線に対処するために改善される可能性があります。
この変更により、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)"
ここにはまだコメントできないので、この回答を追加します
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"