﻿---
title: ES|QL ST_BUFFER function
description: 
url: https://www.elastic.co/elastic/docs-builder/docs/2927/reference/query-languages/esql/functions-operators/spatial-functions/st_buffer
products:
  - Elasticsearch
---

# ES|QL ST_BUFFER function
<applies-to>
  - Elastic Cloud Serverless: Preview
  - Elastic Stack: Preview since 9.4
</applies-to>


## Syntax

![Embedded](https://www.elastic.co/elastic/docs-builder/docs/2927/reference/query-languages/esql/images/functions/st_buffer.svg)


## Parameters

<definitions>
  <definition term="geometry">
    Expression of type `geo_point`, `geo_shape`, `cartesian_point` or `cartesian_shape`. If `null`, the function returns `null`.
  </definition>
  <definition term="distance">
    Buffer distance in the units of the input spatial reference system
  </definition>
  <definition term="options Elastic Cloud Serverless: Preview, Elastic Stack: Planned">
    (Optional) ST_BUFFER additional options like `quad_segs`, `endcap`, `join` and `mitre_limit`.
  </definition>
</definitions>


## Description

Computes a buffer area around the input geometry at the specified distance. The distance is in the units of the input spatial reference system. Positive distances expand the geometry, negative distances shrink it. A distance of zero will return the input geometry unchanged. Points and lines become polygons when buffered, unless a zero distance is provided.

## Supported types


| geometry        | distance | options | result          |
|-----------------|----------|---------|-----------------|
| cartesian_point | double   |         | cartesian_shape |
| cartesian_point | float    |         | cartesian_shape |
| cartesian_point | integer  |         | cartesian_shape |
| cartesian_point | long     |         | cartesian_shape |
| cartesian_shape | double   |         | cartesian_shape |
| cartesian_shape | float    |         | cartesian_shape |
| cartesian_shape | integer  |         | cartesian_shape |
| cartesian_shape | long     |         | cartesian_shape |
| geo_point       | double   |         | geo_shape       |
| geo_point       | float    |         | geo_shape       |
| geo_point       | integer  |         | geo_shape       |
| geo_point       | long     |         | geo_shape       |
| geo_shape       | double   |         | geo_shape       |
| geo_shape       | float    |         | geo_shape       |
| geo_shape       | integer  |         | geo_shape       |
| geo_shape       | long     |         | geo_shape       |


### Supported function named parameters

<definitions>
  <definition term="quad_segs Elastic Cloud Serverless: Preview, Elastic Stack: Planned">
    (integer) Number of line segments used to approximate a quarter circle. Defaults to 8.
  </definition>
  <definition term="endcap Elastic Cloud Serverless: Preview, Elastic Stack: Planned">
    (keyword) End cap style for buffering linear geometries. Defaults to round.
  </definition>
  <definition term="join Elastic Cloud Serverless: Preview, Elastic Stack: Planned">
    (keyword) Join style for buffering. Defaults to round.
  </definition>
  <definition term="mitre_limit Elastic Cloud Serverless: Preview, Elastic Stack: Planned">
    (double) Mitre ratio limit, only meaningful when join=mitre. Defaults to 5.0.
  </definition>
</definitions>


## Examples

```esql
ROW wkt = "POLYGON ((0 0, 4 0, 4 4, 0 4, 0 0))"
| EVAL buffered = ST_BUFFER(TO_GEOSHAPE(wkt), -1)
```


| wkt:keyword                         | buffered:geo_shape                                      |
|-------------------------------------|---------------------------------------------------------|
| POLYGON ((0 0, 4 0, 4 4, 0 4, 0 0)) | POLYGON ((1.0 1.0, 1.0 3.0, 3.0 3.0, 3.0 1.0, 1.0 1.0)) |

The optional `options` argument can configure end caps and join styles. Combining `endcap=flat` with `join=mitre` produces sharp corners on a buffered L-shape:
```esql
ROW geom = TO_CARTESIANSHAPE("LINESTRING(0 0, 10 0, 10 10)")
| EVAL buffered = ST_BUFFER(geom, 2, {"endcap": "flat", "join": "mitre"})
| KEEP buffered
```


| buffered:cartesian_shape                                                        |
|---------------------------------------------------------------------------------|
| POLYGON ((8.0 2.0, 8.0 10.0, 12.0 10.0, 12.0 -2.0, 0.0 -2.0, 0.0 2.0, 8.0 2.0)) |


### Diagrams

**Negative distance shrinks a polygon**
Buffering a 10x10 square by `-2` produces a smaller square inset by 2 units on each side.
![Negative distance shrinks a polygon](https://www.elastic.co/elastic/docs-builder/docs/2927/reference/query-languages/esql/images/functions/st_buffer_shrink_polygon.svg)

**Buffering a point produces a circle**
A point with positive distance becomes a polygon approximating a circle (8 segments per quadrant by default).
![Buffering a point produces a circle](https://www.elastic.co/elastic/docs-builder/docs/2927/reference/query-languages/esql/images/functions/st_buffer_point.svg)

**Default round end caps on a line**
A line buffered with default options has rounded end caps (`endcap=round`).
![Default round end caps on a line](https://www.elastic.co/elastic/docs-builder/docs/2927/reference/query-languages/esql/images/functions/st_buffer_line_round.svg)

**Flat end caps on a line**
Setting `endcap=flat` keeps the buffer flush with the line's endpoints.
![Flat end caps on a line](https://www.elastic.co/elastic/docs-builder/docs/2927/reference/query-languages/esql/images/functions/st_buffer_line_flat.svg)

**Square end caps on a line**
`endcap=square` extends the buffer past each endpoint by the buffer distance.
![Square end caps on a line](https://www.elastic.co/elastic/docs-builder/docs/2927/reference/query-languages/esql/images/functions/st_buffer_line_square.svg)

**Mitre joins on a buffered corner**
`join=mitre` produces sharp corners. Combined with `endcap=flat` you get a clean rectangle for a buffered L-shape.
![Mitre joins on a buffered corner](https://www.elastic.co/elastic/docs-builder/docs/2927/reference/query-languages/esql/images/functions/st_buffer_corner_mitre.svg)