Name

ST_Buffer — Beräknar en geometri som täcker alla punkter inom ett givet avstånd från en geometri.

Synopsis

geometry ST_Buffer(geometry g1, float radius_of_buffer, text buffer_style_parameters = '');

geometry ST_Buffer(geometry g1, float radius_of_buffer, integer num_seg_quarter_circle);

geography ST_Buffer(geography g1, float radius_of_buffer, text buffer_style_parameters);

geography ST_Buffer(geography g1, float radius_of_buffer, integer num_seg_quarter_circle);

Beskrivning

Beräknar en POLYGON eller MULTIPOLYGON som representerar alla punkter vars avstånd från en geometri/geografi är mindre än eller lika med ett givet avstånd. Ett negativt avstånd krymper geometrin i stället för att expandera den. Ett negativt avstånd kan krympa en polygon helt och hållet, i vilket fall POLYGON EMPTY returneras. För punkter och linjer returnerar negativa avstånd alltid tomma resultat.

För geometri anges avståndet i enheterna för geometrins spatiala referenssystem. För geografi anges avståndet i meter.

Den valfria tredje parametern styr buffertens noggrannhet och stil. Noggrannheten för cirkelbågar i bufferten anges som antalet linjesegment som används för att approximera en kvartscirkel (standard är 8). Buffertstilen kan specificeras genom att tillhandahålla en lista med blankseparerade nyckel=värde-par enligt följande:

  • 'quad_segs=#' : antal linjesegment som används för att approximera en kvartscirkel (standard är 8).

  • 'endcap=round|flat|square' : endcap-stil (standard är "round"). "butt" accepteras som synonym för "flat".

  • 'join=round|mitre|bevel' : fogningsstil (standard är "round"). "Miter" accepteras som synonym till "mitre".

  • 'mitre_limit=#.#' : gräns för mitraförhållande (påverkar endast miterad fogning). 'miter_limit' accepteras som en synonym till 'mitre_limit'.

  • 'side=both|left|right' : 'left' eller 'right' buffrar geometrin på en sida, med den buffrade sidan i förhållande till linjens riktning. Detta gäller endast för LINESTRING-geometri och påverkar inte POINT- eller POLYGON-geometrier. Som standard är ändstyckena kvadratiska.

[Note]

För geografin är detta ett tunt hölje runt geometriimplementeringen. Den bestämmer ett planar spatialt referenssystem som bäst passar in i det geografiska objektets avgränsningsbox (försöker UTM, Lambert Azimuthal Equal Area (LAEA) North/South pole, och slutligen Mercator ). Bufferten beräknas i det plana utrymmet och transformeras sedan tillbaka till WGS84. Detta kanske inte ger önskat resultat om inmatningsobjektet är mycket större än en UTM-zon eller korsar datalinjen

[Note]

Buffer kan hantera ogiltiga indata och utdata är alltid en giltig polygonal geometri. Buffring med avstånd 0 används ibland som ett sätt att reparera ogiltiga polygoner. ST_MakeValid är mer lämplig för denna process eftersom den kan hantera multipolygoner.

[Note]

Buffring används ibland för att utföra en sökning inom avstånd. För detta användningsfall är det mer effektivt att använda ST_DWithin.

[Note]

Denna funktion ignorerar Z-dimensionen. Den ger alltid ett 2D-resultat även när den används på en 3D-geometri.

Förbättrad: 2.5.0 - ST_Buffer geometri stöd förbättrades för att möjliggöra sidobuffring specifikation side=both|left|right.

Tillgänglighet: 1.5 - ST_Buffer har förbättrats för att stödja olika ändkapslar och join-typer. Dessa är användbara för att t.ex. konvertera väglinjer till polygonvägar med platta eller fyrkantiga kanter istället för rundade kanter. Tunt omslag för geografi har lagts till.

Utförs av GEOS-modulen.

Denna metod implementerar OGC:s implementeringsspecifikation för enkla funktioner för SQL 1.1. s2.1.1.3

Denna metod implementerar SQL/MM-specifikationen. SQL-MM IEC 13249-3: 5.1.30

Exempel

quad_segs=8 (standard)

SELECT ST_Buffer(
 ST_GeomFromText('POINT(100 90)'),
 50, 'quad_segs=8');
                

quad_segs=2 (lame)

SELECT ST_Buffer(
 ST_GeomFromText('POINT(100 90)'),
 50, 'quad_segs=2');
                

endcap=rund join=rund (standard)

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'endcap=round join=round');
                

ändkapsel=fyrkantsformad

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'endcap=square join=round');
                

ändkapsel=platt

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'endcap=flat join=round');
                

skarv=fasad

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'join=bevel');
                

join=mitre mitre_limit=5.0 (standard mitre-gräns)

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'join=mitre mitre_limit=5.0');
                

skarv=mitra mitre_limit=1

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'join=mitre mitre_limit=1.0');
                

sida=vänster

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'side=left');
                

sida=höger

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'side=right');
                

sida=vänster led=mitre

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'side=left join=mitre');
                

högerlindning, polygongräns sida=vänster

SELECT ST_Buffer(
ST_ForceRHR(
ST_Boundary(
 ST_GeomFromText(
'POLYGON ((50 50, 50 150, 150 150, 150 50, 50 50))'))),
 ), 20, 'side=left');
                

högerlindning, polygongräns sida=höger

SELECT ST_Buffer(
ST_ForceRHR(
ST_Boundary(
 ST_GeomFromText(
'POLYGON ((50 50, 50 150, 150 150, 150 50, 50 50))'))
), 20,'side=right')
                

--A buffered point approximates a circle
-- A buffered point forcing approximation of (see diagram)
-- 2 points per quarter circle is poly with 8 sides (see diagram)
SELECT ST_NPoints(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50)) As promisingcircle_pcount,
ST_NPoints(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50, 2)) As lamecircle_pcount;

promisingcircle_pcount | lamecircle_pcount
------------------------+-------------------
             33 |                9

--A lighter but lamer circle
-- only 2 points per quarter circle is an octagon
--Below is a 100 meter octagon
-- Note coordinates are in NAD 83 long lat which we transform
to Mass state plane meter and then buffer to get measurements in meters;
SELECT ST_AsText(ST_Buffer(
ST_Transform(
ST_SetSRID(ST_Point(-71.063526, 42.35785),4269), 26986)
,100,2)) As octagon;
----------------------
POLYGON((236057.59057465 900908.759918696,236028.301252769 900838.049240578,235
957.59057465 900808.759918696,235886.879896532 900838.049240578,235857.59057465
900908.759918696,235886.879896532 900979.470596815,235957.59057465 901008.759918
696,236028.301252769 900979.470596815,236057.59057465 900908.759918696))