This is an automated email from the ASF dual-hosted git repository.
jiayu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sedona.git
The following commit(s) were added to refs/heads/master by this push:
new 8301b0651e [GH-2678] Add SVG visuals for spatial indexing, buffer
styles, transform, and skeleton functions (Phase 10) (#2692)
8301b0651e is described below
commit 8301b0651efa5c213fdec28ec4b480afd011f606
Author: Jia Yu <[email protected]>
AuthorDate: Thu Mar 5 00:52:46 2026 -0700
[GH-2678] Add SVG visuals for spatial indexing, buffer styles, transform,
and skeleton functions (Phase 10) (#2692)
---
.../ST_ApproximateMedialAxis.md | 2 +
docs/api/flink/Geometry-Processing/ST_Buffer.md | 8 ++
.../Geometry-Processing/ST_StraightSkeleton.md | 2 +
docs/api/flink/Spatial-Indexing/ST_BingTile.md | 2 +
docs/api/flink/Spatial-Indexing/ST_BingTileAt.md | 2 +
.../flink/Spatial-Indexing/ST_BingTileCellIDs.md | 2 +
.../flink/Spatial-Indexing/ST_BingTilePolygon.md | 2 +
.../flink/Spatial-Indexing/ST_BingTileToGeom.md | 2 +
docs/api/flink/Spatial-Indexing/ST_BingTileX.md | 2 +
docs/api/flink/Spatial-Indexing/ST_BingTileY.md | 2 +
.../flink/Spatial-Indexing/ST_BingTileZoomLevel.md | 2 +
.../flink/Spatial-Indexing/ST_BingTilesAround.md | 2 +
.../flink/Spatial-Indexing/ST_GeoHashNeighbor.md | 2 +
.../flink/Spatial-Indexing/ST_GeoHashNeighbors.md | 2 +
.../flink/Spatial-Indexing/ST_H3CellDistance.md | 2 +
docs/api/flink/Spatial-Indexing/ST_H3CellIDs.md | 2 +
docs/api/flink/Spatial-Indexing/ST_H3KRing.md | 2 +
docs/api/flink/Spatial-Indexing/ST_H3ToGeom.md | 2 +
docs/api/flink/Spatial-Indexing/ST_S2CellIDs.md | 2 +
docs/api/flink/Spatial-Indexing/ST_S2ToGeom.md | 2 +
.../flink/Spatial-Reference-System/ST_Transform.md | 2 +
.../ST_ApproximateMedialAxis.md | 2 +
.../vector-data/Geometry-Processing/ST_Buffer.md | 8 ++
.../Geometry-Processing/ST_StraightSkeleton.md | 2 +
.../vector-data/Spatial-Indexing/ST_BingTile.md | 2 +
.../vector-data/Spatial-Indexing/ST_BingTileAt.md | 2 +
.../Spatial-Indexing/ST_BingTileCellIDs.md | 2 +
.../Spatial-Indexing/ST_BingTilePolygon.md | 2 +
.../Spatial-Indexing/ST_BingTileToGeom.md | 2 +
.../vector-data/Spatial-Indexing/ST_BingTileX.md | 2 +
.../vector-data/Spatial-Indexing/ST_BingTileY.md | 2 +
.../Spatial-Indexing/ST_BingTileZoomLevel.md | 2 +
.../Spatial-Indexing/ST_BingTilesAround.md | 2 +
.../Spatial-Indexing/ST_GeoHashNeighbor.md | 2 +
.../Spatial-Indexing/ST_GeoHashNeighbors.md | 2 +
.../vector-data/Spatial-Indexing/ST_S2CellIDs.md | 2 +
.../Spatial-Reference-System/ST_Transform.md | 2 +
.../ST_ApproximateMedialAxis.md | 2 +-
docs/api/sql/Geometry-Processing/ST_Buffer.md | 8 ++
.../sql/Geometry-Processing/ST_StraightSkeleton.md | 2 +-
docs/api/sql/Spatial-Indexing/ST_BingTile.md | 2 +
docs/api/sql/Spatial-Indexing/ST_BingTileAt.md | 2 +
.../api/sql/Spatial-Indexing/ST_BingTileCellIDs.md | 2 +
.../api/sql/Spatial-Indexing/ST_BingTilePolygon.md | 2 +
docs/api/sql/Spatial-Indexing/ST_BingTileToGeom.md | 2 +
docs/api/sql/Spatial-Indexing/ST_BingTileX.md | 2 +
docs/api/sql/Spatial-Indexing/ST_BingTileY.md | 2 +
.../sql/Spatial-Indexing/ST_BingTileZoomLevel.md | 2 +
.../api/sql/Spatial-Indexing/ST_BingTilesAround.md | 2 +
.../api/sql/Spatial-Indexing/ST_GeoHashNeighbor.md | 2 +
.../sql/Spatial-Indexing/ST_GeoHashNeighbors.md | 2 +
docs/api/sql/Spatial-Indexing/ST_H3CellDistance.md | 2 +
docs/api/sql/Spatial-Indexing/ST_H3CellIDs.md | 2 +
docs/api/sql/Spatial-Indexing/ST_H3KRing.md | 2 +
docs/api/sql/Spatial-Indexing/ST_H3ToGeom.md | 2 +
docs/api/sql/Spatial-Indexing/ST_S2CellIDs.md | 2 +
docs/api/sql/Spatial-Indexing/ST_S2ToGeom.md | 2 +
.../sql/Spatial-Reference-System/ST_Transform.md | 2 +
.../ST_ApproximateMedialAxis.svg | 32 +++++++
docs/image/ST_BingTile/ST_BingTile.svg | 35 ++++++++
docs/image/ST_BingTileAt/ST_BingTileAt.svg | 27 ++++++
.../ST_BingTileCellIDs/ST_BingTileCellIDs.svg | 72 +++++++++++++++
.../ST_BingTilePolygon/ST_BingTilePolygon.svg | 31 +++++++
docs/image/ST_BingTileToGeom/ST_BingTileToGeom.svg | 19 ++++
docs/image/ST_BingTileX/ST_BingTileX.svg | 31 +++++++
docs/image/ST_BingTileY/ST_BingTileY.svg | 28 ++++++
.../ST_BingTileZoomLevel/ST_BingTileZoomLevel.svg | 96 ++++++++++++++++++++
.../ST_BingTilesAround/ST_BingTilesAround.svg | 50 +++++++++++
docs/image/ST_Buffer/ST_Buffer.svg | 20 +++++
docs/image/ST_Buffer_EndCap/ST_Buffer_EndCap.svg | 22 +++++
docs/image/ST_Buffer_Join/ST_Buffer_Join.svg | 16 ++++
docs/image/ST_Buffer_Side/ST_Buffer_Side.svg | 19 ++++
.../ST_GeoHashNeighbor/ST_GeoHashNeighbor.svg | 24 +++++
.../ST_GeoHashNeighbors/ST_GeoHashNeighbors.svg | 24 +++++
docs/image/ST_H3CellDistance/ST_H3CellDistance.svg | 33 +++++++
docs/image/ST_H3CellIDs/ST_H3CellIDs.svg | 67 ++++++++++++++
docs/image/ST_H3KRing/ST_H3KRing.svg | 34 +++++++
docs/image/ST_H3ToGeom/ST_H3ToGeom.svg | 22 +++++
docs/image/ST_S2CellIDs/ST_S2CellIDs.svg | 98 +++++++++++++++++++++
docs/image/ST_S2ToGeom/ST_S2ToGeom.svg | 19 ++++
.../ST_StraightSkeleton/ST_StraightSkeleton.svg | 42 +++++++++
docs/image/ST_Transform/ST_Transform.svg | 46 ++++++++++
.../ST_ApproximateMedialAxis_illustration.png | Bin 26593 -> 0 bytes
.../skeleton/ST_StraightSkeleton_illustration.png | Bin 23616 -> 0 bytes
84 files changed, 1039 insertions(+), 2 deletions(-)
diff --git a/docs/api/flink/Geometry-Processing/ST_ApproximateMedialAxis.md
b/docs/api/flink/Geometry-Processing/ST_ApproximateMedialAxis.md
index 67d90a7efb..29c581eedf 100644
--- a/docs/api/flink/Geometry-Processing/ST_ApproximateMedialAxis.md
+++ b/docs/api/flink/Geometry-Processing/ST_ApproximateMedialAxis.md
@@ -44,3 +44,5 @@ Output:
```
MULTILINESTRING ((50 45, 50 5), (50 45, 35 45), (65 45, 50 45), (35 45, 65 45))
```
+
+
diff --git a/docs/api/flink/Geometry-Processing/ST_Buffer.md
b/docs/api/flink/Geometry-Processing/ST_Buffer.md
index 43321b5328..6245fa9c48 100644
--- a/docs/api/flink/Geometry-Processing/ST_Buffer.md
+++ b/docs/api/flink/Geometry-Processing/ST_Buffer.md
@@ -48,6 +48,12 @@ The optional forth parameter controls the buffer accuracy
and style. Buffer accu
- `mitre_limit=#.#` : mitre ratio limit and it only affects mitred join style.
`miter_limit` is an accepted synonym for `mitre_limit`.
- `side=both|left|right` : Defaults to `both`. Setting `left` or `right`
enables a single-sided buffer operation on the geometry, with the buffered side
aligned according to the direction of the line. This functionality is specific
to LINESTRING geometry and has no impact on POINT or POLYGON geometries. By
default, square end caps are applied when `left` or `right` are specified.
+
+
+
+
+
+
!!!note
`ST_Buffer` throws an `IllegalArgumentException` if the correct format,
parameters, or options are not provided.
@@ -89,6 +95,8 @@ SQL Example:
SELECT ST_Buffer(ST_GeomFromWKT('LINESTRING(0 0, 50 70, 100 100)'), 10, false,
'side=left')
```
+
+
Output:

diff --git a/docs/api/flink/Geometry-Processing/ST_StraightSkeleton.md
b/docs/api/flink/Geometry-Processing/ST_StraightSkeleton.md
index f35e1a5c94..0b448c596c 100644
--- a/docs/api/flink/Geometry-Processing/ST_StraightSkeleton.md
+++ b/docs/api/flink/Geometry-Processing/ST_StraightSkeleton.md
@@ -44,3 +44,5 @@ Output:
```
MULTILINESTRING ((50 5, 50 45), (50 45, 35 45), (50 45, 65 45), (35 45, 30
45), (35 45, 40 40), (65 45, 70 45), (65 45, 60 40), (50 5, 45 5), (50 5, 55 5))
```
+
+
diff --git a/docs/api/flink/Spatial-Indexing/ST_BingTile.md
b/docs/api/flink/Spatial-Indexing/ST_BingTile.md
index 1e4d179c32..2518579e65 100644
--- a/docs/api/flink/Spatial-Indexing/ST_BingTile.md
+++ b/docs/api/flink/Spatial-Indexing/ST_BingTile.md
@@ -38,3 +38,5 @@ Output:
```
213
```
+
+
diff --git a/docs/api/flink/Spatial-Indexing/ST_BingTileAt.md
b/docs/api/flink/Spatial-Indexing/ST_BingTileAt.md
index 22a53be9e6..fd1b3af005 100644
--- a/docs/api/flink/Spatial-Indexing/ST_BingTileAt.md
+++ b/docs/api/flink/Spatial-Indexing/ST_BingTileAt.md
@@ -38,3 +38,5 @@ Output:
```
123030123010121
```
+
+
diff --git a/docs/api/flink/Spatial-Indexing/ST_BingTileCellIDs.md
b/docs/api/flink/Spatial-Indexing/ST_BingTileCellIDs.md
index b1308bf40f..7612fd687f 100644
--- a/docs/api/flink/Spatial-Indexing/ST_BingTileCellIDs.md
+++ b/docs/api/flink/Spatial-Indexing/ST_BingTileCellIDs.md
@@ -38,3 +38,5 @@ Output:
```
[1230301230]
```
+
+
diff --git a/docs/api/flink/Spatial-Indexing/ST_BingTilePolygon.md
b/docs/api/flink/Spatial-Indexing/ST_BingTilePolygon.md
index 61fed68e71..3934e2e323 100644
--- a/docs/api/flink/Spatial-Indexing/ST_BingTilePolygon.md
+++ b/docs/api/flink/Spatial-Indexing/ST_BingTilePolygon.md
@@ -38,3 +38,5 @@ Output:
```
POLYGON ((0 0, 0 -40.97989806962013, 45 -40.97989806962013, 45 0, 0 0))
```
+
+
diff --git a/docs/api/flink/Spatial-Indexing/ST_BingTileToGeom.md
b/docs/api/flink/Spatial-Indexing/ST_BingTileToGeom.md
index 8f290430b2..a3524e6d6f 100644
--- a/docs/api/flink/Spatial-Indexing/ST_BingTileToGeom.md
+++ b/docs/api/flink/Spatial-Indexing/ST_BingTileToGeom.md
@@ -41,3 +41,5 @@ Output:
```
[POLYGON ((-180 85.05112877980659, -180 0, 0 0, 0 85.05112877980659, -180
85.05112877980659)), ...]
```
+
+
diff --git a/docs/api/flink/Spatial-Indexing/ST_BingTileX.md
b/docs/api/flink/Spatial-Indexing/ST_BingTileX.md
index a90b0201a6..b97307fee7 100644
--- a/docs/api/flink/Spatial-Indexing/ST_BingTileX.md
+++ b/docs/api/flink/Spatial-Indexing/ST_BingTileX.md
@@ -38,3 +38,5 @@ Output:
```
3
```
+
+
diff --git a/docs/api/flink/Spatial-Indexing/ST_BingTileY.md
b/docs/api/flink/Spatial-Indexing/ST_BingTileY.md
index 1d81c1f5a0..211e380475 100644
--- a/docs/api/flink/Spatial-Indexing/ST_BingTileY.md
+++ b/docs/api/flink/Spatial-Indexing/ST_BingTileY.md
@@ -38,3 +38,5 @@ Output:
```
5
```
+
+
diff --git a/docs/api/flink/Spatial-Indexing/ST_BingTileZoomLevel.md
b/docs/api/flink/Spatial-Indexing/ST_BingTileZoomLevel.md
index 532405c9af..0512886018 100644
--- a/docs/api/flink/Spatial-Indexing/ST_BingTileZoomLevel.md
+++ b/docs/api/flink/Spatial-Indexing/ST_BingTileZoomLevel.md
@@ -38,3 +38,5 @@ Output:
```
3
```
+
+
diff --git a/docs/api/flink/Spatial-Indexing/ST_BingTilesAround.md
b/docs/api/flink/Spatial-Indexing/ST_BingTilesAround.md
index 4b136ce67e..ef6bbf95d2 100644
--- a/docs/api/flink/Spatial-Indexing/ST_BingTilesAround.md
+++ b/docs/api/flink/Spatial-Indexing/ST_BingTilesAround.md
@@ -38,3 +38,5 @@ Output:
```
[0, 2, 1, 3]
```
+
+
diff --git a/docs/api/flink/Spatial-Indexing/ST_GeoHashNeighbor.md
b/docs/api/flink/Spatial-Indexing/ST_GeoHashNeighbor.md
index 155ddac8e0..32a5184a83 100644
--- a/docs/api/flink/Spatial-Indexing/ST_GeoHashNeighbor.md
+++ b/docs/api/flink/Spatial-Indexing/ST_GeoHashNeighbor.md
@@ -38,3 +38,5 @@ Output:
```
u1pc
```
+
+
diff --git a/docs/api/flink/Spatial-Indexing/ST_GeoHashNeighbors.md
b/docs/api/flink/Spatial-Indexing/ST_GeoHashNeighbors.md
index f04dc04244..7aa66a2096 100644
--- a/docs/api/flink/Spatial-Indexing/ST_GeoHashNeighbors.md
+++ b/docs/api/flink/Spatial-Indexing/ST_GeoHashNeighbors.md
@@ -38,3 +38,5 @@ Output:
```
[u1pc, u301, u300, u2bp, u0zz, u0zx, u1p8, u1p9]
```
+
+
diff --git a/docs/api/flink/Spatial-Indexing/ST_H3CellDistance.md
b/docs/api/flink/Spatial-Indexing/ST_H3CellDistance.md
index 1cf3bec697..9105da8320 100644
--- a/docs/api/flink/Spatial-Indexing/ST_H3CellDistance.md
+++ b/docs/api/flink/Spatial-Indexing/ST_H3CellDistance.md
@@ -46,3 +46,5 @@ Output:
| +I | 78 |
+----+----------------------+
```
+
+
diff --git a/docs/api/flink/Spatial-Indexing/ST_H3CellIDs.md
b/docs/api/flink/Spatial-Indexing/ST_H3CellIDs.md
index b4ed6c0a26..66167409f8 100644
--- a/docs/api/flink/Spatial-Indexing/ST_H3CellIDs.md
+++ b/docs/api/flink/Spatial-Indexing/ST_H3CellIDs.md
@@ -67,3 +67,5 @@ Output:
| +I | [605547539457900543, 605547... |
+----+--------------------------------+
```
+
+
diff --git a/docs/api/flink/Spatial-Indexing/ST_H3KRing.md
b/docs/api/flink/Spatial-Indexing/ST_H3KRing.md
index f073f57006..fb822794d4 100644
--- a/docs/api/flink/Spatial-Indexing/ST_H3KRing.md
+++ b/docs/api/flink/Spatial-Indexing/ST_H3KRing.md
@@ -47,3 +47,5 @@ Output:
| +I | [614552609325318143, 614552... | [614552597293957119, 614552... |
+----+--------------------------------+--------------------------------+
```
+
+
diff --git a/docs/api/flink/Spatial-Indexing/ST_H3ToGeom.md
b/docs/api/flink/Spatial-Indexing/ST_H3ToGeom.md
index 773e225ade..073b57a17b 100644
--- a/docs/api/flink/Spatial-Indexing/ST_H3ToGeom.md
+++ b/docs/api/flink/Spatial-Indexing/ST_H3ToGeom.md
@@ -45,3 +45,5 @@ Output:
```
[POLYGON ((1.0057629565405093 1.9984665139177547, 1.0037116327309097
2.0018325249140068, 0.999727799357053 2.001163270465665, 0.9977951427833316
1.997128228393235, 0.9998461908217928 1.993762152933182, 1.0038301712104316
1.9944311839965523, 1.0057629565405093 1.9984665139177547))]
```
+
+
diff --git a/docs/api/flink/Spatial-Indexing/ST_S2CellIDs.md
b/docs/api/flink/Spatial-Indexing/ST_S2CellIDs.md
index 74075f3333..628bba6488 100644
--- a/docs/api/flink/Spatial-Indexing/ST_S2CellIDs.md
+++ b/docs/api/flink/Spatial-Indexing/ST_S2CellIDs.md
@@ -40,3 +40,5 @@ Output:
```
[1159395429071192064, 1159958379024613376, 1160521328978034688,
1161084278931456000, 1170091478186196992, 1170654428139618304]
```
+
+
diff --git a/docs/api/flink/Spatial-Indexing/ST_S2ToGeom.md
b/docs/api/flink/Spatial-Indexing/ST_S2ToGeom.md
index 9dd7fcaa32..9afe9cd37c 100644
--- a/docs/api/flink/Spatial-Indexing/ST_S2ToGeom.md
+++ b/docs/api/flink/Spatial-Indexing/ST_S2ToGeom.md
@@ -43,3 +43,5 @@ Output:
```
[POLYGON ((-36.609392788630245 -38.169532607255846, -36.609392706252954
-38.169532607255846, -36.609392706252954 -38.169532507473015,
-36.609392788630245 -38.169532507473015, -36.609392788630245
-38.169532607255846))]
```
+
+
diff --git a/docs/api/flink/Spatial-Reference-System/ST_Transform.md
b/docs/api/flink/Spatial-Reference-System/ST_Transform.md
index fed3a8cb81..7f8d92ead4 100644
--- a/docs/api/flink/Spatial-Reference-System/ST_Transform.md
+++ b/docs/api/flink/Spatial-Reference-System/ST_Transform.md
@@ -49,3 +49,5 @@ Output:
```
POLYGON ((8766047.980342899 17809098.336766362, 5122546.516721856
18580261.912528664, 3240775.0740796793 -13688660.50985159, 4556241.924514083
-12463044.21488129, 8766047.980342899 17809098.336766362))
```
+
+
diff --git
a/docs/api/snowflake/vector-data/Geometry-Processing/ST_ApproximateMedialAxis.md
b/docs/api/snowflake/vector-data/Geometry-Processing/ST_ApproximateMedialAxis.md
index 3a8d523d10..74f2f0afa2 100644
---
a/docs/api/snowflake/vector-data/Geometry-Processing/ST_ApproximateMedialAxis.md
+++
b/docs/api/snowflake/vector-data/Geometry-Processing/ST_ApproximateMedialAxis.md
@@ -38,3 +38,5 @@ SELECT Sedona.ST_ApproximateMedialAxis(
```
Output: `MULTILINESTRING ((50 45, 50 5), (50 45, 35 45), (65 45, 50 45), (35
45, 65 45))`
+
+
diff --git a/docs/api/snowflake/vector-data/Geometry-Processing/ST_Buffer.md
b/docs/api/snowflake/vector-data/Geometry-Processing/ST_Buffer.md
index f2649afd44..a6877ff38b 100644
--- a/docs/api/snowflake/vector-data/Geometry-Processing/ST_Buffer.md
+++ b/docs/api/snowflake/vector-data/Geometry-Processing/ST_Buffer.md
@@ -48,6 +48,12 @@ The optional forth parameter controls the buffer accuracy
and style. Buffer accu
- `mitre_limit=#.#` : mitre ratio limit and it only affects mitred join style.
`miter_limit` is an accepted synonym for `mitre_limit`.
- `side=both|left|right` : Defaults to `both`. Setting `left` or `right`
enables a single-sided buffer operation on the geometry, with the buffered side
aligned according to the direction of the line. This functionality is specific
to LINESTRING geometry and has no impact on POINT or POLYGON geometries. By
default, square end caps are applied when `left` or `right` are specified.
+
+
+
+
+
+
!!!note
`ST_Buffer` throws an `IllegalArgumentException` if the correct format,
parameters, or options are not provided.
@@ -73,3 +79,5 @@ Output:

Original Linestring   Left side buffed Linestring
+
+
diff --git
a/docs/api/snowflake/vector-data/Geometry-Processing/ST_StraightSkeleton.md
b/docs/api/snowflake/vector-data/Geometry-Processing/ST_StraightSkeleton.md
index 0737bed949..b7c0a6a160 100644
--- a/docs/api/snowflake/vector-data/Geometry-Processing/ST_StraightSkeleton.md
+++ b/docs/api/snowflake/vector-data/Geometry-Processing/ST_StraightSkeleton.md
@@ -38,3 +38,5 @@ SELECT Sedona.ST_StraightSkeleton(
```
Output: `MULTILINESTRING ((50 5, 50 45), (50 45, 35 45), (50 45, 65 45), (35
45, 30 45), (35 45, 40 40), (65 45, 70 45), (65 45, 60 40), (50 5, 45 5), (50
5, 55 5))`
+
+
diff --git a/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTile.md
b/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTile.md
index 01e4e8ce03..763296c7ab 100644
--- a/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTile.md
+++ b/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTile.md
@@ -36,3 +36,5 @@ Output:
```
213
```
+
+
diff --git a/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTileAt.md
b/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTileAt.md
index 43dc99ca6e..beeafba89d 100644
--- a/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTileAt.md
+++ b/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTileAt.md
@@ -36,3 +36,5 @@ Output:
```
123030123010121
```
+
+
diff --git
a/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTileCellIDs.md
b/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTileCellIDs.md
index 0214db56ed..29b0284e5c 100644
--- a/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTileCellIDs.md
+++ b/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTileCellIDs.md
@@ -36,3 +36,5 @@ Output:
```
[1230301230]
```
+
+
diff --git
a/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTilePolygon.md
b/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTilePolygon.md
index f2be585812..43332f2d72 100644
--- a/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTilePolygon.md
+++ b/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTilePolygon.md
@@ -36,3 +36,5 @@ Output:
```
POLYGON ((0 0, 0 -40.97989806962013, 45 -40.97989806962013, 45 0, 0 0))
```
+
+
diff --git
a/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTileToGeom.md
b/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTileToGeom.md
index d69d562080..8a58057154 100644
--- a/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTileToGeom.md
+++ b/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTileToGeom.md
@@ -36,3 +36,5 @@ Output:
```
GEOMETRYCOLLECTION (POLYGON ((-180 85.05112877980659, -180 0, 0 0, 0
85.05112877980659, -180 85.05112877980659)), ...)
```
+
+
diff --git a/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTileX.md
b/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTileX.md
index 518c0326f0..60792c07c8 100644
--- a/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTileX.md
+++ b/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTileX.md
@@ -36,3 +36,5 @@ Output:
```
3
```
+
+
diff --git a/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTileY.md
b/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTileY.md
index e4bf2d7330..f81cf0d417 100644
--- a/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTileY.md
+++ b/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTileY.md
@@ -36,3 +36,5 @@ Output:
```
5
```
+
+
diff --git
a/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTileZoomLevel.md
b/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTileZoomLevel.md
index 5503287470..1e4e3e1f60 100644
--- a/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTileZoomLevel.md
+++ b/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTileZoomLevel.md
@@ -36,3 +36,5 @@ Output:
```
3
```
+
+
diff --git
a/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTilesAround.md
b/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTilesAround.md
index d557dcce91..0b3464502a 100644
--- a/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTilesAround.md
+++ b/docs/api/snowflake/vector-data/Spatial-Indexing/ST_BingTilesAround.md
@@ -36,3 +36,5 @@ Output:
```
[0, 2, 1, 3]
```
+
+
diff --git
a/docs/api/snowflake/vector-data/Spatial-Indexing/ST_GeoHashNeighbor.md
b/docs/api/snowflake/vector-data/Spatial-Indexing/ST_GeoHashNeighbor.md
index cd17f88e49..512f83e6b4 100644
--- a/docs/api/snowflake/vector-data/Spatial-Indexing/ST_GeoHashNeighbor.md
+++ b/docs/api/snowflake/vector-data/Spatial-Indexing/ST_GeoHashNeighbor.md
@@ -42,3 +42,5 @@ Result:
|u1pc |
+-----------------------------+
```
+
+
diff --git
a/docs/api/snowflake/vector-data/Spatial-Indexing/ST_GeoHashNeighbors.md
b/docs/api/snowflake/vector-data/Spatial-Indexing/ST_GeoHashNeighbors.md
index 90c26f1fbe..7380364079 100644
--- a/docs/api/snowflake/vector-data/Spatial-Indexing/ST_GeoHashNeighbors.md
+++ b/docs/api/snowflake/vector-data/Spatial-Indexing/ST_GeoHashNeighbors.md
@@ -42,3 +42,5 @@ Result:
|[u1pc, u301, u300, u2bp, ...] |
+-----------------------------+
```
+
+
diff --git a/docs/api/snowflake/vector-data/Spatial-Indexing/ST_S2CellIDs.md
b/docs/api/snowflake/vector-data/Spatial-Indexing/ST_S2CellIDs.md
index 5a382d4ae5..2be09c39d3 100644
--- a/docs/api/snowflake/vector-data/Spatial-Indexing/ST_S2CellIDs.md
+++ b/docs/api/snowflake/vector-data/Spatial-Indexing/ST_S2CellIDs.md
@@ -42,3 +42,5 @@ Output:
|[1159395429071192064, 1159958379024613376, 1160521328978034688,
1161084278931456000, 1170091478186196992, 1170654428139618304]|
+------------------------------------------------------------------------------------------------------------------------------+
```
+
+
diff --git
a/docs/api/snowflake/vector-data/Spatial-Reference-System/ST_Transform.md
b/docs/api/snowflake/vector-data/Spatial-Reference-System/ST_Transform.md
index ebefed7fec..30e3f0f2ec 100644
--- a/docs/api/snowflake/vector-data/Spatial-Reference-System/ST_Transform.md
+++ b/docs/api/snowflake/vector-data/Spatial-Reference-System/ST_Transform.md
@@ -41,3 +41,5 @@ SQL example:
SELECT ST_Transform(polygondf.countyshape, 'epsg:4326','epsg:3857')
FROM polygondf
```
+
+
diff --git a/docs/api/sql/Geometry-Processing/ST_ApproximateMedialAxis.md
b/docs/api/sql/Geometry-Processing/ST_ApproximateMedialAxis.md
index 537bde2294..7c21939669 100644
--- a/docs/api/sql/Geometry-Processing/ST_ApproximateMedialAxis.md
+++ b/docs/api/sql/Geometry-Processing/ST_ApproximateMedialAxis.md
@@ -45,7 +45,7 @@ Output:
MULTILINESTRING ((50 45, 50 5), (50 45, 35 45), (65 45, 50 45), (35 45, 65 45))
```
-
+
SQL Example (L-shape):
diff --git a/docs/api/sql/Geometry-Processing/ST_Buffer.md
b/docs/api/sql/Geometry-Processing/ST_Buffer.md
index e3ceb9895b..f4fc244c0c 100644
--- a/docs/api/sql/Geometry-Processing/ST_Buffer.md
+++ b/docs/api/sql/Geometry-Processing/ST_Buffer.md
@@ -48,6 +48,12 @@ The optional forth parameter controls the buffer accuracy
and style. Buffer accu
- `mitre_limit=#.#` : mitre ratio limit and it only affects mitred join style.
`miter_limit` is an accepted synonym for `mitre_limit`.
- `side=both|left|right` : Defaults to `both`. Setting `left` or `right`
enables a single-sided buffer operation on the geometry, with the buffered side
aligned according to the direction of the line. This functionality is specific
to LINESTRING geometry and has no impact on POINT or POLYGON geometries. By
default, square end caps are applied when `left` or `right` are specified.
+
+
+
+
+
+
!!!note
`ST_Buffer` throws an `IllegalArgumentException` if the correct format,
parameters, or options are not provided.
@@ -89,6 +95,8 @@ SQL Example:
SELECT ST_Buffer(ST_GeomFromWKT('LINESTRING(0 0, 50 70, 100 100)'), 10, false,
'side=left')
```
+
+
Output:

diff --git a/docs/api/sql/Geometry-Processing/ST_StraightSkeleton.md
b/docs/api/sql/Geometry-Processing/ST_StraightSkeleton.md
index 5df34ac5f2..8e3d122eb9 100644
--- a/docs/api/sql/Geometry-Processing/ST_StraightSkeleton.md
+++ b/docs/api/sql/Geometry-Processing/ST_StraightSkeleton.md
@@ -45,7 +45,7 @@ Output:
MULTILINESTRING ((50 5, 50 45), (50 45, 35 45), (50 45, 65 45), (35 45, 30
45), (35 45, 40 40), (65 45, 70 45), (65 45, 60 40), (50 5, 45 5), (50 5, 55 5))
```
-
+
SQL Example (Simple Square):
diff --git a/docs/api/sql/Spatial-Indexing/ST_BingTile.md
b/docs/api/sql/Spatial-Indexing/ST_BingTile.md
index 8f4b7bac1b..0fdae0bc5f 100644
--- a/docs/api/sql/Spatial-Indexing/ST_BingTile.md
+++ b/docs/api/sql/Spatial-Indexing/ST_BingTile.md
@@ -38,3 +38,5 @@ Output:
```
213
```
+
+
diff --git a/docs/api/sql/Spatial-Indexing/ST_BingTileAt.md
b/docs/api/sql/Spatial-Indexing/ST_BingTileAt.md
index 6402f64ac2..669b5f3432 100644
--- a/docs/api/sql/Spatial-Indexing/ST_BingTileAt.md
+++ b/docs/api/sql/Spatial-Indexing/ST_BingTileAt.md
@@ -38,3 +38,5 @@ Output:
```
123030123010121
```
+
+
diff --git a/docs/api/sql/Spatial-Indexing/ST_BingTileCellIDs.md
b/docs/api/sql/Spatial-Indexing/ST_BingTileCellIDs.md
index 363a761c7a..5c7075606d 100644
--- a/docs/api/sql/Spatial-Indexing/ST_BingTileCellIDs.md
+++ b/docs/api/sql/Spatial-Indexing/ST_BingTileCellIDs.md
@@ -38,3 +38,5 @@ Output:
```
[1230301230]
```
+
+
diff --git a/docs/api/sql/Spatial-Indexing/ST_BingTilePolygon.md
b/docs/api/sql/Spatial-Indexing/ST_BingTilePolygon.md
index 3528dace9d..de74305a79 100644
--- a/docs/api/sql/Spatial-Indexing/ST_BingTilePolygon.md
+++ b/docs/api/sql/Spatial-Indexing/ST_BingTilePolygon.md
@@ -38,3 +38,5 @@ Output:
```
POLYGON ((0 0, 0 -40.97989806962013, 45 -40.97989806962013, 45 0, 0 0))
```
+
+
diff --git a/docs/api/sql/Spatial-Indexing/ST_BingTileToGeom.md
b/docs/api/sql/Spatial-Indexing/ST_BingTileToGeom.md
index 03e80b7e32..b824e23f97 100644
--- a/docs/api/sql/Spatial-Indexing/ST_BingTileToGeom.md
+++ b/docs/api/sql/Spatial-Indexing/ST_BingTileToGeom.md
@@ -41,3 +41,5 @@ Output:
```
[POLYGON ((-180 85.05112877980659, -180 0, 0 0, 0 85.05112877980659, -180
85.05112877980659)), ...]
```
+
+
diff --git a/docs/api/sql/Spatial-Indexing/ST_BingTileX.md
b/docs/api/sql/Spatial-Indexing/ST_BingTileX.md
index 88465e3259..08c5d9269b 100644
--- a/docs/api/sql/Spatial-Indexing/ST_BingTileX.md
+++ b/docs/api/sql/Spatial-Indexing/ST_BingTileX.md
@@ -38,3 +38,5 @@ Output:
```
3
```
+
+
diff --git a/docs/api/sql/Spatial-Indexing/ST_BingTileY.md
b/docs/api/sql/Spatial-Indexing/ST_BingTileY.md
index a554366b2d..97183a143c 100644
--- a/docs/api/sql/Spatial-Indexing/ST_BingTileY.md
+++ b/docs/api/sql/Spatial-Indexing/ST_BingTileY.md
@@ -38,3 +38,5 @@ Output:
```
5
```
+
+
diff --git a/docs/api/sql/Spatial-Indexing/ST_BingTileZoomLevel.md
b/docs/api/sql/Spatial-Indexing/ST_BingTileZoomLevel.md
index c446a4216b..2af71b3598 100644
--- a/docs/api/sql/Spatial-Indexing/ST_BingTileZoomLevel.md
+++ b/docs/api/sql/Spatial-Indexing/ST_BingTileZoomLevel.md
@@ -38,3 +38,5 @@ Output:
```
3
```
+
+
diff --git a/docs/api/sql/Spatial-Indexing/ST_BingTilesAround.md
b/docs/api/sql/Spatial-Indexing/ST_BingTilesAround.md
index 009259fbc1..52135633a8 100644
--- a/docs/api/sql/Spatial-Indexing/ST_BingTilesAround.md
+++ b/docs/api/sql/Spatial-Indexing/ST_BingTilesAround.md
@@ -38,3 +38,5 @@ Output:
```
[0, 2, 1, 3]
```
+
+
diff --git a/docs/api/sql/Spatial-Indexing/ST_GeoHashNeighbor.md
b/docs/api/sql/Spatial-Indexing/ST_GeoHashNeighbor.md
index 3acf8d67f0..f068831917 100644
--- a/docs/api/sql/Spatial-Indexing/ST_GeoHashNeighbor.md
+++ b/docs/api/sql/Spatial-Indexing/ST_GeoHashNeighbor.md
@@ -38,3 +38,5 @@ Output:
```
u1pc
```
+
+
diff --git a/docs/api/sql/Spatial-Indexing/ST_GeoHashNeighbors.md
b/docs/api/sql/Spatial-Indexing/ST_GeoHashNeighbors.md
index 5739936ef0..3b36cc1a91 100644
--- a/docs/api/sql/Spatial-Indexing/ST_GeoHashNeighbors.md
+++ b/docs/api/sql/Spatial-Indexing/ST_GeoHashNeighbors.md
@@ -38,3 +38,5 @@ Output:
```
[u1pc, u301, u300, u2bp, u0zz, u0zx, u1p8, u1p9]
```
+
+
diff --git a/docs/api/sql/Spatial-Indexing/ST_H3CellDistance.md
b/docs/api/sql/Spatial-Indexing/ST_H3CellDistance.md
index 369c864f82..ad195cf797 100644
--- a/docs/api/sql/Spatial-Indexing/ST_H3CellDistance.md
+++ b/docs/api/sql/Spatial-Indexing/ST_H3CellDistance.md
@@ -46,3 +46,5 @@ Output:
|
78|
+-----------------------------------------------------------------------------------------------------------------------------------------+
```
+
+
diff --git a/docs/api/sql/Spatial-Indexing/ST_H3CellIDs.md
b/docs/api/sql/Spatial-Indexing/ST_H3CellIDs.md
index ab5459c5de..d4b5887959 100644
--- a/docs/api/sql/Spatial-Indexing/ST_H3CellIDs.md
+++ b/docs/api/sql/Spatial-Indexing/ST_H3CellIDs.md
@@ -67,3 +67,5 @@ Output:
| [6055475394579005...|
+-------------------------------------------------------------+
```
+
+
diff --git a/docs/api/sql/Spatial-Indexing/ST_H3KRing.md
b/docs/api/sql/Spatial-Indexing/ST_H3KRing.md
index 8763cdedb2..1f5da35079 100644
--- a/docs/api/sql/Spatial-Indexing/ST_H3KRing.md
+++ b/docs/api/sql/Spatial-Indexing/ST_H3KRing.md
@@ -48,3 +48,5 @@ Output:
|[614552609325318143, 614552597293957119, 614552609329512447,
614552609316929535, 614552609327415295, 614552609287569407, 614552597289762815]|
+--------------------------------------------------------------------------------------------------------------------------------------------+
```
+
+
diff --git a/docs/api/sql/Spatial-Indexing/ST_H3ToGeom.md
b/docs/api/sql/Spatial-Indexing/ST_H3ToGeom.md
index 773e225ade..073b57a17b 100644
--- a/docs/api/sql/Spatial-Indexing/ST_H3ToGeom.md
+++ b/docs/api/sql/Spatial-Indexing/ST_H3ToGeom.md
@@ -45,3 +45,5 @@ Output:
```
[POLYGON ((1.0057629565405093 1.9984665139177547, 1.0037116327309097
2.0018325249140068, 0.999727799357053 2.001163270465665, 0.9977951427833316
1.997128228393235, 0.9998461908217928 1.993762152933182, 1.0038301712104316
1.9944311839965523, 1.0057629565405093 1.9984665139177547))]
```
+
+
diff --git a/docs/api/sql/Spatial-Indexing/ST_S2CellIDs.md
b/docs/api/sql/Spatial-Indexing/ST_S2CellIDs.md
index f267efcbab..78e2eb78b8 100644
--- a/docs/api/sql/Spatial-Indexing/ST_S2CellIDs.md
+++ b/docs/api/sql/Spatial-Indexing/ST_S2CellIDs.md
@@ -40,3 +40,5 @@ Output:
```
[1159395429071192064, 1159958379024613376, 1160521328978034688,
1161084278931456000, 1170091478186196992, 1170654428139618304]
```
+
+
diff --git a/docs/api/sql/Spatial-Indexing/ST_S2ToGeom.md
b/docs/api/sql/Spatial-Indexing/ST_S2ToGeom.md
index 9dd7fcaa32..9afe9cd37c 100644
--- a/docs/api/sql/Spatial-Indexing/ST_S2ToGeom.md
+++ b/docs/api/sql/Spatial-Indexing/ST_S2ToGeom.md
@@ -43,3 +43,5 @@ Output:
```
[POLYGON ((-36.609392788630245 -38.169532607255846, -36.609392706252954
-38.169532607255846, -36.609392706252954 -38.169532507473015,
-36.609392788630245 -38.169532507473015, -36.609392788630245
-38.169532607255846))]
```
+
+
diff --git a/docs/api/sql/Spatial-Reference-System/ST_Transform.md
b/docs/api/sql/Spatial-Reference-System/ST_Transform.md
index 1789563e9d..1a63386dda 100644
--- a/docs/api/sql/Spatial-Reference-System/ST_Transform.md
+++ b/docs/api/sql/Spatial-Reference-System/ST_Transform.md
@@ -53,3 +53,5 @@ Output:
```
POLYGON ((8766047.980342899 17809098.336766362, 5122546.516721856
18580261.912528664, 3240775.0740796793 -13688660.50985159, 4556241.924514083
-12463044.21488129, 8766047.980342899 17809098.336766362))
```
+
+
diff --git a/docs/image/ST_ApproximateMedialAxis/ST_ApproximateMedialAxis.svg
b/docs/image/ST_ApproximateMedialAxis/ST_ApproximateMedialAxis.svg
new file mode 100644
index 0000000000..28591ebe49
--- /dev/null
+++ b/docs/image/ST_ApproximateMedialAxis/ST_ApproximateMedialAxis.svg
@@ -0,0 +1,32 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="400" height="230" viewBox="0 0
400 230">
+ <rect width="400" height="230" fill="#f5f5f5" rx="5"/>
+ <text x="200" y="18" font-family="monospace" font-size="12" fill="#333"
text-anchor="middle" font-weight="bold">ST_ApproximateMedialAxis</text>
+ <text x="200" y="32" font-family="monospace" font-size="9" fill="#888"
text-anchor="middle">Approximate medial axis (pruned skeleton)</text>
+ <polygon points="84.0,162.0 106.0,162.0 106.0,74.0 139.0,74.0 139.0,52.0
51.0,52.0 51.0,74.0 84.0,74.0" fill="rgba(74,144,217,0.1)" stroke="#90CAF5"
stroke-width="1.5" stroke-dasharray="4,2"/>
+ <line x1="62.0" y1="63.0" x2="51.0" y2="63.0" stroke="#FFCDD2"
stroke-width="2" stroke-dasharray="3,2"/>
+ <line x1="62.0" y1="63.0" x2="73.0" y2="74.0" stroke="#FFCDD2"
stroke-width="2" stroke-dasharray="3,2"/>
+ <line x1="128.0" y1="63.0" x2="139.0" y2="63.0" stroke="#FFCDD2"
stroke-width="2" stroke-dasharray="3,2"/>
+ <line x1="128.0" y1="63.0" x2="117.0" y2="74.0" stroke="#FFCDD2"
stroke-width="2" stroke-dasharray="3,2"/>
+ <line x1="95.0" y1="151.0" x2="84.0" y2="151.0" stroke="#FFCDD2"
stroke-width="2" stroke-dasharray="3,2"/>
+ <line x1="95.0" y1="151.0" x2="106.0" y2="151.0" stroke="#FFCDD2"
stroke-width="2" stroke-dasharray="3,2"/>
+ <line x1="95.0" y1="151.0" x2="95.0" y2="63.0" stroke="#E53935"
stroke-width="2"/>
+ <line x1="62.0" y1="63.0" x2="128.0" y2="63.0" stroke="#E53935"
stroke-width="2"/>
+ <text x="95" y="190" font-family="monospace" font-size="9" fill="#999"
text-anchor="middle" font-weight="bold">Full skeleton (before pruning)</text>
+ <defs><marker id="arrma" markerWidth="8" markerHeight="6" refX="8" refY="3"
orient="auto"><path d="M0,0 L8,3 L0,6" fill="#666"/></marker></defs>
+ <line x1="180" y1="105" x2="210" y2="105" stroke="#666" stroke-width="1.5"
marker-end="url(#arrma)"/>
+ <text x="195" y="98" font-family="monospace" font-size="7" fill="#666"
text-anchor="middle">prune</text>
+ <polygon points="289.0,162.0 311.0,162.0 311.0,74.0 344.0,74.0 344.0,52.0
256.0,52.0 256.0,74.0 289.0,74.0" fill="rgba(74,144,217,0.1)" stroke="#90CAF5"
stroke-width="1.5" stroke-dasharray="4,2"/>
+ <line x1="300.0" y1="151.0" x2="300.0" y2="63.0" stroke="#2ecc71"
stroke-width="2.5"/>
+ <line x1="267.0" y1="63.0" x2="333.0" y2="63.0" stroke="#2ecc71"
stroke-width="2.5"/>
+ <circle cx="300.0" cy="151.0" r="3" fill="#2ecc71"/>
+ <circle cx="300.0" cy="63.0" r="3" fill="#2ecc71"/>
+ <circle cx="333.0" cy="63.0" r="3" fill="#2ecc71"/>
+ <circle cx="267.0" cy="63.0" r="3" fill="#2ecc71"/>
+ <text x="300" y="190" font-family="monospace" font-size="9" fill="#2ecc71"
text-anchor="middle" font-weight="bold">Medial axis (pruned)</text>
+ <line x1="40" y1="205" x2="60" y2="205" stroke="#2ecc71" stroke-width="2.5"/>
+ <text x="64" y="209" font-family="monospace" font-size="8"
fill="#2ecc71">Medial axis</text>
+ <line x1="160" y1="205" x2="180" y2="205" stroke="#FFCDD2" stroke-width="2"
stroke-dasharray="3,2"/>
+ <text x="184" y="209" font-family="monospace" font-size="8"
fill="#E53935">Pruned branches</text>
+ <line x1="290" y1="205" x2="310" y2="205" stroke="#90CAF5"
stroke-width="1.5" stroke-dasharray="4,2"/>
+ <text x="314" y="209" font-family="monospace" font-size="8"
fill="#1565C0">Polygon</text>
+</svg>
\ No newline at end of file
diff --git a/docs/image/ST_BingTile/ST_BingTile.svg
b/docs/image/ST_BingTile/ST_BingTile.svg
new file mode 100644
index 0000000000..8a0ba85e78
--- /dev/null
+++ b/docs/image/ST_BingTile/ST_BingTile.svg
@@ -0,0 +1,35 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="400" height="190" viewBox="0 0
400 190">
+ <rect width="400" height="190" fill="#f5f5f5" rx="5"/>
+ <text x="200" y="18" font-family="monospace" font-size="12" fill="#333"
text-anchor="middle" font-weight="bold">ST_BingTile</text>
+ <text x="200" y="32" font-family="monospace" font-size="9" fill="#888"
text-anchor="middle">Create Bing Tile quadkey from X, Y, zoom</text>
+ <rect x="100" y="48" width="30" height="30" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="100" y="78" width="30" height="30" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="100" y="108" width="30" height="30" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <text x="115" y="43" font-family="monospace" font-size="8" fill="#999"
text-anchor="middle">0</text>
+ <rect x="130" y="48" width="30" height="30" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="130" y="78" width="30" height="30" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="130" y="108" width="30" height="30" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <text x="145" y="43" font-family="monospace" font-size="8" fill="#999"
text-anchor="middle">1</text>
+ <rect x="160" y="48" width="30" height="30" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="160" y="78" width="30" height="30" fill="rgba(74,144,217,0.25)"
stroke="#1565C0" stroke-width="2"/>
+ <rect x="160" y="108" width="30" height="30" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <text x="175" y="43" font-family="monospace" font-size="8" fill="#999"
text-anchor="middle">2</text>
+ <rect x="190" y="48" width="30" height="30" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="190" y="78" width="30" height="30" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="190" y="108" width="30" height="30" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <text x="205" y="43" font-family="monospace" font-size="8" fill="#999"
text-anchor="middle">3</text>
+ <rect x="220" y="48" width="30" height="30" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="220" y="78" width="30" height="30" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="220" y="108" width="30" height="30" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <text x="235" y="43" font-family="monospace" font-size="8" fill="#999"
text-anchor="middle">4</text>
+ <rect x="250" y="48" width="30" height="30" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="250" y="78" width="30" height="30" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="250" y="108" width="30" height="30" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <text x="265" y="43" font-family="monospace" font-size="8" fill="#999"
text-anchor="middle">5</text>
+ <text x="92" y="66" font-family="monospace" font-size="8" fill="#999"
text-anchor="end">0</text>
+ <text x="92" y="96" font-family="monospace" font-size="8" fill="#999"
text-anchor="end">1</text>
+ <text x="92" y="126" font-family="monospace" font-size="8" fill="#999"
text-anchor="end">2</text>
+ <text x="175" y="97" font-family="monospace" font-size="8" fill="#1565C0"
text-anchor="middle" font-weight="bold">2,1</text>
+ <text x="200" y="152" font-family="monospace" font-size="10" fill="#1565C0"
text-anchor="middle">ST_BingTile(2, 1, 3) → quadkey string</text>
+ <text x="200" y="170" font-family="monospace" font-size="9" fill="#666"
text-anchor="middle">Creates tile identifier from X, Y coords and zoom
level</text>
+</svg>
\ No newline at end of file
diff --git a/docs/image/ST_BingTileAt/ST_BingTileAt.svg
b/docs/image/ST_BingTileAt/ST_BingTileAt.svg
new file mode 100644
index 0000000000..994b23d06a
--- /dev/null
+++ b/docs/image/ST_BingTileAt/ST_BingTileAt.svg
@@ -0,0 +1,27 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="400" height="190" viewBox="0 0
400 190">
+ <rect width="400" height="190" fill="#f5f5f5" rx="5"/>
+ <text x="200" y="18" font-family="monospace" font-size="12" fill="#333"
text-anchor="middle" font-weight="bold">ST_BingTileAt</text>
+ <text x="200" y="32" font-family="monospace" font-size="9" fill="#888"
text-anchor="middle">Get Bing Tile quadkey at a lon/lat point</text>
+ <rect x="80" y="48" width="35" height="35" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="80" y="83" width="35" height="35" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="80" y="118" width="35" height="35" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="115" y="48" width="35" height="35" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="115" y="83" width="35" height="35" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="115" y="118" width="35" height="35" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="150" y="48" width="35" height="35" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="150" y="83" width="35" height="35" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="150" y="118" width="35" height="35" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="185" y="48" width="35" height="35" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="185" y="83" width="35" height="35" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="1.5"/>
+ <rect x="185" y="118" width="35" height="35" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="220" y="48" width="35" height="35" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="220" y="83" width="35" height="35" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="220" y="118" width="35" height="35" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="255" y="48" width="35" height="35" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="255" y="83" width="35" height="35" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="255" y="118" width="35" height="35" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <circle cx="199" cy="101" r="4" fill="#E53935" stroke="#fff"
stroke-width="1.5"/>
+ <text x="207" y="96" font-family="monospace" font-size="8" fill="#E53935"
font-weight="bold">lon,lat</text>
+ <text x="200" y="162" font-family="monospace" font-size="10" fill="#1565C0"
text-anchor="middle">Returns quadkey of tile containing the point</text>
+ <text x="200" y="178" font-family="monospace" font-size="9" fill="#666"
text-anchor="middle">at specified zoom level</text>
+</svg>
\ No newline at end of file
diff --git a/docs/image/ST_BingTileCellIDs/ST_BingTileCellIDs.svg
b/docs/image/ST_BingTileCellIDs/ST_BingTileCellIDs.svg
new file mode 100644
index 0000000000..80d3477065
--- /dev/null
+++ b/docs/image/ST_BingTileCellIDs/ST_BingTileCellIDs.svg
@@ -0,0 +1,72 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="400" height="230" viewBox="0 0
400 230">
+ <rect width="400" height="230" fill="#f5f5f5" rx="5"/>
+ <text x="200" y="18" font-family="monospace" font-size="12" fill="#333"
text-anchor="middle" font-weight="bold">ST_BingTileCellIDs</text>
+ <text x="200" y="32" font-family="monospace" font-size="9" fill="#888"
text-anchor="middle">Bing Tiles covering a geometry</text>
+ <rect x="55" y="42" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="55" y="72" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="55" y="102" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="55" y="132" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="85" y="42" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="85" y="72" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="85" y="102" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="85" y="132" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="115" y="42" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="115" y="72" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="115" y="102" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="115" y="132" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="145" y="42" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="145" y="72" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="145" y="102" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="145" y="132" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="175" y="42" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="175" y="72" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="175" y="102" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="175" y="132" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="205" y="42" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="205" y="72" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="205" y="102" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="205" y="132" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="235" y="42" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="235" y="72" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="235" y="102" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="235" y="132" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="265" y="42" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="265" y="72" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="265" y="102" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="265" y="132" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="295" y="42" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="295" y="72" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="295" y="102" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="295" y="132" width="30" height="30" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="85" y="42" width="30" height="30" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="85" y="72" width="30" height="30" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="85" y="102" width="30" height="30" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="115" y="42" width="30" height="30" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="115" y="72" width="30" height="30" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="115" y="102" width="30" height="30" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="115" y="132" width="30" height="30" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="145" y="42" width="30" height="30" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="145" y="72" width="30" height="30" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="145" y="102" width="30" height="30" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="145" y="132" width="30" height="30" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="175" y="42" width="30" height="30" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="175" y="72" width="30" height="30" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="175" y="102" width="30" height="30" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="175" y="132" width="30" height="30" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="205" y="42" width="30" height="30" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="205" y="72" width="30" height="30" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="205" y="102" width="30" height="30" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="205" y="132" width="30" height="30" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="235" y="42" width="30" height="30" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="235" y="72" width="30" height="30" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="235" y="102" width="30" height="30" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="235" y="132" width="30" height="30" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="265" y="72" width="30" height="30" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="265" y="102" width="30" height="30" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <polygon points="120,60 250,52 280,108 245,150 135,148 95,105" fill="none"
stroke="#E53935" stroke-width="2" stroke-dasharray="5,3"/>
+ <text x="200" y="195" font-family="monospace" font-size="10" fill="#1565C0"
text-anchor="middle">Returns array of quadkeys covering the geometry</text>
+ <rect x="70" y="208" width="10" height="10" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="1"/>
+ <text x="84" y="217" font-family="monospace" font-size="8"
fill="#1565C0">Covered tiles</text>
+ <line x1="190" y1="213" x2="220" y2="213" stroke="#E53935"
stroke-width="1.5" stroke-dasharray="4,2"/>
+ <text x="224" y="217" font-family="monospace" font-size="8"
fill="#E53935">Input geometry</text>
+</svg>
\ No newline at end of file
diff --git a/docs/image/ST_BingTilePolygon/ST_BingTilePolygon.svg
b/docs/image/ST_BingTilePolygon/ST_BingTilePolygon.svg
new file mode 100644
index 0000000000..6cafd59a4d
--- /dev/null
+++ b/docs/image/ST_BingTilePolygon/ST_BingTilePolygon.svg
@@ -0,0 +1,31 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="400" height="190" viewBox="0 0
400 190">
+ <rect width="400" height="190" fill="#f5f5f5" rx="5"/>
+ <text x="200" y="18" font-family="monospace" font-size="12" fill="#333"
text-anchor="middle" font-weight="bold">ST_BingTilePolygon</text>
+ <text x="200" y="32" font-family="monospace" font-size="9" fill="#888"
text-anchor="middle">Get bounding Polygon of a Bing Tile</text>
+ <rect x="80" y="48" width="35" height="35" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="80" y="83" width="35" height="35" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="80" y="118" width="35" height="35" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="115" y="48" width="35" height="35" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="115" y="83" width="35" height="35" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="115" y="118" width="35" height="35" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="150" y="48" width="35" height="35" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="150" y="83" width="35" height="35" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="150" y="118" width="35" height="35" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="185" y="48" width="35" height="35" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="185" y="83" width="35" height="35" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="185" y="118" width="35" height="35" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="220" y="48" width="35" height="35" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="220" y="83" width="35" height="35" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="220" y="118" width="35" height="35" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="255" y="48" width="35" height="35" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="255" y="83" width="35" height="35" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="255" y="118" width="35" height="35" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="150" y="83" width="35" height="35" fill="rgba(74,144,217,0.3)"
stroke="#1565C0" stroke-width="2"/>
+ <circle cx="150" cy="83" r="2.5" fill="#1565C0"/>
+ <circle cx="185" cy="83" r="2.5" fill="#1565C0"/>
+ <circle cx="185" cy="118" r="2.5" fill="#1565C0"/>
+ <circle cx="150" cy="118" r="2.5" fill="#1565C0"/>
+ <text x="167" y="104" font-family="monospace" font-size="7" fill="#1565C0"
text-anchor="middle" font-weight="bold">quadkey</text>
+ <text x="200" y="162" font-family="monospace" font-size="10" fill="#1565C0"
text-anchor="middle">Returns the tile's bounding Polygon geometry</text>
+ <text x="200" y="178" font-family="monospace" font-size="9" fill="#666"
text-anchor="middle">with corner coordinates as vertices</text>
+</svg>
\ No newline at end of file
diff --git a/docs/image/ST_BingTileToGeom/ST_BingTileToGeom.svg
b/docs/image/ST_BingTileToGeom/ST_BingTileToGeom.svg
new file mode 100644
index 0000000000..0e54c5c67d
--- /dev/null
+++ b/docs/image/ST_BingTileToGeom/ST_BingTileToGeom.svg
@@ -0,0 +1,19 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="0 0
400 200">
+ <rect width="400" height="200" fill="#f5f5f5" rx="5"/>
+ <text x="200" y="18" font-family="monospace" font-size="12" fill="#333"
text-anchor="middle" font-weight="bold">ST_BingTileToGeom</text>
+ <text x="200" y="32" font-family="monospace" font-size="9" fill="#888"
text-anchor="middle">Convert Bing Tile quadkeys to Polygons</text>
+ <text x="60" y="72" font-family="monospace" font-size="10" fill="#666"
text-anchor="middle">Quadkeys</text>
+ <rect x="18" y="78" width="84" height="20" rx="3" fill="#e8eaf6"
stroke="#7986cb" stroke-width="1"/>
+ <text x="60" y="91" font-family="monospace" font-size="9" fill="#3949ab"
text-anchor="middle">0213</text>
+ <rect x="18" y="103" width="84" height="20" rx="3" fill="#e8eaf6"
stroke="#7986cb" stroke-width="1"/>
+ <text x="60" y="116" font-family="monospace" font-size="9" fill="#3949ab"
text-anchor="middle">0231</text>
+ <rect x="18" y="128" width="84" height="20" rx="3" fill="#e8eaf6"
stroke="#7986cb" stroke-width="1"/>
+ <text x="60" y="141" font-family="monospace" font-size="9" fill="#3949ab"
text-anchor="middle">1023</text>
+ <defs><marker id="arr3" markerWidth="8" markerHeight="6" refX="8" refY="3"
orient="auto"><path d="M0,0 L8,3 L0,6" fill="#666"/></marker></defs>
+ <line x1="120" y1="108" x2="175" y2="108" stroke="#666" stroke-width="1.5"
marker-end="url(#arr3)"/>
+ <rect x="195" y="68" width="42" height="42" fill="#4a90d9"
fill-opacity="0.2" stroke="#4a90d9" stroke-width="1.5"/>
+ <rect x="240" y="68" width="42" height="42" fill="#d94a4a"
fill-opacity="0.2" stroke="#d94a4a" stroke-width="1.5"/>
+ <rect x="195" y="113" width="42" height="42" fill="#2ecc71"
fill-opacity="0.2" stroke="#2ecc71" stroke-width="1.5"/>
+ <text x="300" y="100" font-family="monospace" font-size="10"
fill="#666">Polygons</text>
+ <text x="200" y="185" font-family="monospace" font-size="10" fill="#333"
text-anchor="middle">Returns array of Polygon geometries from quadkeys</text>
+</svg>
\ No newline at end of file
diff --git a/docs/image/ST_BingTileX/ST_BingTileX.svg
b/docs/image/ST_BingTileX/ST_BingTileX.svg
new file mode 100644
index 0000000000..149914d747
--- /dev/null
+++ b/docs/image/ST_BingTileX/ST_BingTileX.svg
@@ -0,0 +1,31 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="400" height="180" viewBox="0 0
400 180">
+ <rect width="400" height="180" fill="#f5f5f5" rx="5"/>
+ <text x="200" y="18" font-family="monospace" font-size="12" fill="#333"
text-anchor="middle" font-weight="bold">ST_BingTileX</text>
+ <text x="200" y="32" font-family="monospace" font-size="9" fill="#888"
text-anchor="middle">Get tile X coordinate from quadkey</text>
+ <rect x="90" y="48" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="90" y="80" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="90" y="112" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <text x="106" y="43" font-family="monospace" font-size="8" fill="#999"
text-anchor="middle">0</text>
+ <rect x="122" y="48" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="122" y="80" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="122" y="112" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <text x="138" y="43" font-family="monospace" font-size="8" fill="#999"
text-anchor="middle">1</text>
+ <rect x="154" y="48" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="154" y="80" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="154" y="112" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <text x="170" y="43" font-family="monospace" font-size="8" fill="#999"
text-anchor="middle">2</text>
+ <rect x="186" y="48" width="32" height="32" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="1.5"/>
+ <rect x="186" y="80" width="32" height="32" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="1.5"/>
+ <rect x="186" y="112" width="32" height="32" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="1.5"/>
+ <text x="202" y="43" font-family="monospace" font-size="8" fill="#1565C0"
text-anchor="middle" font-weight="bold">3</text>
+ <rect x="218" y="48" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="218" y="80" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="218" y="112" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <text x="234" y="43" font-family="monospace" font-size="8" fill="#999"
text-anchor="middle">4</text>
+ <rect x="250" y="48" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="250" y="80" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="250" y="112" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <text x="266" y="43" font-family="monospace" font-size="8" fill="#999"
text-anchor="middle">5</text>
+ <text x="202" y="32" font-family="monospace" font-size="10" fill="#1565C0"
text-anchor="middle" font-weight="bold">X = 3</text>
+ <text x="200" y="158" font-family="monospace" font-size="10" fill="#1565C0"
text-anchor="middle">Returns the tile X coordinate from a quadkey</text>
+</svg>
\ No newline at end of file
diff --git a/docs/image/ST_BingTileY/ST_BingTileY.svg
b/docs/image/ST_BingTileY/ST_BingTileY.svg
new file mode 100644
index 0000000000..1398cde3b0
--- /dev/null
+++ b/docs/image/ST_BingTileY/ST_BingTileY.svg
@@ -0,0 +1,28 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="400" height="180" viewBox="0 0
400 180">
+ <rect width="400" height="180" fill="#f5f5f5" rx="5"/>
+ <text x="200" y="18" font-family="monospace" font-size="12" fill="#333"
text-anchor="middle" font-weight="bold">ST_BingTileY</text>
+ <text x="200" y="32" font-family="monospace" font-size="9" fill="#888"
text-anchor="middle">Get tile Y coordinate from quadkey</text>
+ <rect x="90" y="48" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="90" y="80" width="32" height="32" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="1.5"/>
+ <rect x="90" y="112" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="122" y="48" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="122" y="80" width="32" height="32" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="1.5"/>
+ <rect x="122" y="112" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="154" y="48" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="154" y="80" width="32" height="32" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="1.5"/>
+ <rect x="154" y="112" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="186" y="48" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="186" y="80" width="32" height="32" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="1.5"/>
+ <rect x="186" y="112" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="218" y="48" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="218" y="80" width="32" height="32" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="1.5"/>
+ <rect x="218" y="112" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="250" y="48" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="250" y="80" width="32" height="32" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="1.5"/>
+ <rect x="250" y="112" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <text x="82" y="67" font-family="monospace" font-size="8" fill="#999"
text-anchor="end">0</text>
+ <text x="82" y="99" font-family="monospace" font-size="8" fill="#1565C0"
text-anchor="end" font-weight="bold">1</text>
+ <text x="82" y="131" font-family="monospace" font-size="8" fill="#999"
text-anchor="end">2</text>
+ <text x="65" y="99" font-family="monospace" font-size="10" fill="#1565C0"
text-anchor="end" font-weight="bold">Y = 1</text>
+ <text x="200" y="158" font-family="monospace" font-size="10" fill="#1565C0"
text-anchor="middle">Returns the tile Y coordinate from a quadkey</text>
+</svg>
\ No newline at end of file
diff --git a/docs/image/ST_BingTileZoomLevel/ST_BingTileZoomLevel.svg
b/docs/image/ST_BingTileZoomLevel/ST_BingTileZoomLevel.svg
new file mode 100644
index 0000000000..77af873221
--- /dev/null
+++ b/docs/image/ST_BingTileZoomLevel/ST_BingTileZoomLevel.svg
@@ -0,0 +1,96 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="400" height="190" viewBox="0 0
400 190">
+ <rect width="400" height="190" fill="#f5f5f5" rx="5"/>
+ <text x="200" y="18" font-family="monospace" font-size="12" fill="#333"
text-anchor="middle" font-weight="bold">ST_BingTileZoomLevel</text>
+ <text x="200" y="32" font-family="monospace" font-size="9" fill="#888"
text-anchor="middle">Get zoom level from quadkey</text>
+ <rect x="35" y="52" width="31" height="31" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="35" y="83" width="31" height="31" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="66" y="52" width="31" height="31" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="66" y="83" width="31" height="31" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <text x="66" y="128" font-family="monospace" font-size="9" fill="#999"
text-anchor="middle">Zoom 1</text>
+ <rect x="125" y="52" width="15" height="15" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="125" y="67" width="15" height="15" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="125" y="82" width="15" height="15" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="125" y="97" width="15" height="15" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="140" y="52" width="15" height="15" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="140" y="67" width="15" height="15" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="140" y="82" width="15" height="15" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="140" y="97" width="15" height="15" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="155" y="52" width="15" height="15" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="155" y="67" width="15" height="15" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="155" y="82" width="15" height="15" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="155" y="97" width="15" height="15" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="170" y="52" width="15" height="15" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="170" y="67" width="15" height="15" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="170" y="82" width="15" height="15" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <rect x="170" y="97" width="15" height="15" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <text x="156" y="128" font-family="monospace" font-size="9" fill="#999"
text-anchor="middle">Zoom 2</text>
+ <rect x="215.0" y="52.0" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="215.0" y="59.8" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="215.0" y="67.5" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="215.0" y="75.2" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="215.0" y="83.0" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="215.0" y="90.8" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="215.0" y="98.5" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="215.0" y="106.2" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="222.8" y="52.0" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="222.8" y="59.8" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="222.8" y="67.5" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="222.8" y="75.2" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="222.8" y="83.0" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="222.8" y="90.8" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="222.8" y="98.5" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="222.8" y="106.2" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="230.5" y="52.0" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="230.5" y="59.8" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="230.5" y="67.5" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="230.5" y="75.2" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="230.5" y="83.0" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="230.5" y="90.8" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="230.5" y="98.5" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="230.5" y="106.2" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="238.2" y="52.0" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="238.2" y="59.8" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="238.2" y="67.5" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="238.2" y="75.2" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="238.2" y="83.0" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="238.2" y="90.8" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="238.2" y="98.5" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="238.2" y="106.2" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="246.0" y="52.0" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="246.0" y="59.8" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="246.0" y="67.5" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="246.0" y="75.2" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="246.0" y="83.0" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="246.0" y="90.8" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="246.0" y="98.5" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="246.0" y="106.2" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="253.8" y="52.0" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="253.8" y="59.8" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="253.8" y="67.5" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="253.8" y="75.2" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="253.8" y="83.0" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="253.8" y="90.8" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="253.8" y="98.5" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="253.8" y="106.2" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="261.5" y="52.0" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="261.5" y="59.8" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="261.5" y="67.5" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="261.5" y="75.2" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="261.5" y="83.0" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="261.5" y="90.8" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="261.5" y="98.5" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="261.5" y="106.2" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="269.2" y="52.0" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="269.2" y="59.8" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="269.2" y="67.5" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="269.2" y="75.2" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="269.2" y="83.0" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="269.2" y="90.8" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="269.2" y="98.5" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="269.2" y="106.2" width="7.8" height="7.8" fill="#fff" stroke="#ddd"
stroke-width="0.5"/>
+ <rect x="238.2" y="67.5" width="7.8" height="7.8"
fill="rgba(74,144,217,0.4)" stroke="#1565C0" stroke-width="1"/>
+ <text x="246" y="128" font-family="monospace" font-size="9" fill="#1565C0"
text-anchor="middle" font-weight="bold">Zoom 3</text>
+ <text x="340" y="88" font-family="monospace" font-size="11" fill="#1565C0"
font-weight="bold">Returns: 3</text>
+ <text x="200" y="150" font-family="monospace" font-size="10" fill="#333"
text-anchor="middle">Higher zoom = more tiles = finer resolution</text>
+ <text x="200" y="168" font-family="monospace" font-size="10" fill="#666"
text-anchor="middle">Returns the zoom level encoded in the quadkey</text>
+</svg>
\ No newline at end of file
diff --git a/docs/image/ST_BingTilesAround/ST_BingTilesAround.svg
b/docs/image/ST_BingTilesAround/ST_BingTilesAround.svg
new file mode 100644
index 0000000000..cec9f654fb
--- /dev/null
+++ b/docs/image/ST_BingTilesAround/ST_BingTilesAround.svg
@@ -0,0 +1,50 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="400" height="230" viewBox="0 0
400 230">
+ <rect width="400" height="230" fill="#f5f5f5" rx="5"/>
+ <text x="200" y="18" font-family="monospace" font-size="12" fill="#333"
text-anchor="middle" font-weight="bold">ST_BingTilesAround</text>
+ <text x="200" y="32" font-family="monospace" font-size="9" fill="#888"
text-anchor="middle">3x3 tile neighborhood around a point</text>
+ <rect x="72" y="45" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="72" y="77" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="72" y="109" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="72" y="141" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="104" y="45" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="104" y="77" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="104" y="109" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="104" y="141" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="136" y="45" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="136" y="77" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="136" y="109" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="136" y="141" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="168" y="45" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="168" y="77" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="168" y="109" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="168" y="141" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="200" y="45" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="200" y="77" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="200" y="109" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="200" y="141" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="232" y="45" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="232" y="77" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="232" y="109" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="232" y="141" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="264" y="45" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="264" y="77" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="264" y="109" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="264" y="141" width="32" height="32" fill="#fff" stroke="#ddd"
stroke-width="0.8"/>
+ <rect x="136" y="45" width="32" height="32" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="1"/>
+ <rect x="136" y="77" width="32" height="32" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="1"/>
+ <rect x="136" y="109" width="32" height="32" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="1"/>
+ <rect x="168" y="45" width="32" height="32" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="1"/>
+ <rect x="168" y="77" width="32" height="32" fill="rgba(233,30,99,0.2)"
stroke="#C2185B" stroke-width="1.5"/>
+ <rect x="168" y="109" width="32" height="32" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="1"/>
+ <rect x="200" y="45" width="32" height="32" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="1"/>
+ <rect x="200" y="77" width="32" height="32" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="1"/>
+ <rect x="200" y="109" width="32" height="32" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="1"/>
+ <circle cx="184" cy="93" r="4" fill="#E53935" stroke="#fff"
stroke-width="1.5"/>
+ <text x="200" y="195" font-family="monospace" font-size="10" fill="#1565C0"
text-anchor="middle">Returns 3x3 neighborhood of tiles around the point</text>
+ <rect x="65" y="208" width="10" height="10" fill="rgba(233,30,99,0.2)"
stroke="#C2185B" stroke-width="1"/>
+ <text x="79" y="217" font-family="monospace" font-size="8"
fill="#C2185B">Center tile</text>
+ <rect x="160" y="208" width="10" height="10" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="1"/>
+ <text x="174" y="217" font-family="monospace" font-size="8"
fill="#1565C0">Neighbors</text>
+ <circle cx="258" cy="213" r="3.5" fill="#E53935"/>
+ <text x="266" y="217" font-family="monospace" font-size="8"
fill="#E53935">Input point</text>
+</svg>
\ No newline at end of file
diff --git a/docs/image/ST_Buffer/ST_Buffer.svg
b/docs/image/ST_Buffer/ST_Buffer.svg
new file mode 100644
index 0000000000..48a84fd7c9
--- /dev/null
+++ b/docs/image/ST_Buffer/ST_Buffer.svg
@@ -0,0 +1,20 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="400" height="225" viewBox="0 0
400 225">
+ <rect width="400" height="225" fill="#f5f5f5" rx="5"/>
+ <text x="200" y="18" font-family="monospace" font-size="12" fill="#333"
text-anchor="middle" font-weight="bold">ST_Buffer</text>
+ <text x="200" y="32" font-family="monospace" font-size="9" fill="#888"
text-anchor="middle">Buffer around geometry (default: round)</text>
+ <path d="M 216.8 32.6 L 316.8 107.6 A 28 28 0 0 1 300.0 158.0 L 100.0 158.0
A 28 28 0 0 1 83.2 107.6 L 183.2 32.6 A 28 28 0 0 1 216.8 32.6 Z"
fill="rgba(46,204,113,0.2)" stroke="#2ecc71" stroke-width="2"/>
+ <polygon points="200,55 300,130 100,130" fill="rgba(74,144,217,0.25)"
stroke="#1565C0" stroke-width="2"/>
+ <line x1="200" y1="55" x2="200" y2="27" stroke="#E53935" stroke-width="1.5"/>
+ <line x1="196" y1="55" x2="204" y2="55" stroke="#E53935" stroke-width="1"/>
+ <line x1="196" y1="27" x2="204" y2="27" stroke="#E53935" stroke-width="1"/>
+ <text x="210" y="43" font-family="monospace" font-size="9" fill="#E53935"
font-weight="bold">d</text>
+ <text x="310" y="55" font-family="monospace" font-size="8"
fill="#2ecc71">join=round</text>
+ <text x="310" y="65" font-family="monospace" font-size="8"
fill="#2ecc71">(default)</text>
+ <text x="200" y="175" font-family="monospace" font-size="10" fill="#333"
text-anchor="middle">Returns geometry expanded by distance d</text>
+ <rect x="70" y="190" width="10" height="10" fill="rgba(74,144,217,0.25)"
stroke="#1565C0" stroke-width="1"/>
+ <text x="84" y="199" font-family="monospace" font-size="8"
fill="#1565C0">Original</text>
+ <rect x="150" y="190" width="10" height="10" fill="rgba(46,204,113,0.2)"
stroke="#2ecc71" stroke-width="1"/>
+ <text x="164" y="199" font-family="monospace" font-size="8"
fill="#2ecc71">Buffer</text>
+ <line x1="220" y1="195" x2="240" y2="195" stroke="#E53935"
stroke-width="1.5"/>
+ <text x="244" y="199" font-family="monospace" font-size="8"
fill="#E53935">Distance</text>
+</svg>
\ No newline at end of file
diff --git a/docs/image/ST_Buffer_EndCap/ST_Buffer_EndCap.svg
b/docs/image/ST_Buffer_EndCap/ST_Buffer_EndCap.svg
new file mode 100644
index 0000000000..1863b684c8
--- /dev/null
+++ b/docs/image/ST_Buffer_EndCap/ST_Buffer_EndCap.svg
@@ -0,0 +1,22 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="0 0
400 200">
+ <rect width="400" height="200" fill="#f5f5f5" rx="5"/>
+ <text x="200" y="18" font-family="monospace" font-size="12" fill="#333"
text-anchor="middle" font-weight="bold">ST_Buffer</text>
+ <text x="200" y="32" font-family="monospace" font-size="9" fill="#888"
text-anchor="middle">Buffer endcap styles at line ends</text>
+ <path d="M 36 70 L 96 70 A 20 20 0 0 1 96 110 L 36 110 A 20 20 0 0 1 36 70
Z" fill="#2ecc71" fill-opacity="0.15" stroke="#2ecc71" stroke-width="1.5"/>
+ <line x1="36" y1="90" x2="96" y2="90" stroke="#333" stroke-width="2.5"
stroke-linecap="round"/>
+ <circle cx="36" cy="90" r="2.5" fill="#333"/>
+ <circle cx="96" cy="90" r="2.5" fill="#333"/>
+ <text x="66" y="135" font-family="monospace" font-size="10" fill="#2ecc71"
text-anchor="middle" font-weight="bold">endcap=round</text>
+ <path d="M 169 70 L 229 70 L 229 110 L 169 110 Z" fill="#FF9800"
fill-opacity="0.15" stroke="#FF9800" stroke-width="1.5"/>
+ <line x1="169" y1="90" x2="229" y2="90" stroke="#333" stroke-width="2.5"
stroke-linecap="round"/>
+ <circle cx="169" cy="90" r="2.5" fill="#333"/>
+ <circle cx="229" cy="90" r="2.5" fill="#333"/>
+ <text x="199" y="135" font-family="monospace" font-size="10" fill="#FF9800"
text-anchor="middle" font-weight="bold">endcap=flat</text>
+ <path d="M 282 70 L 382 70 L 382 110 L 282 110 Z" fill="#9C27B0"
fill-opacity="0.15" stroke="#9C27B0" stroke-width="1.5"/>
+ <line x1="302" y1="90" x2="362" y2="90" stroke="#333" stroke-width="2.5"
stroke-linecap="round"/>
+ <circle cx="302" cy="90" r="2.5" fill="#333"/>
+ <circle cx="362" cy="90" r="2.5" fill="#333"/>
+ <text x="332" y="135" font-family="monospace" font-size="10" fill="#9C27B0"
text-anchor="middle" font-weight="bold">endcap=square</text>
+ <text x="200" y="160" font-family="monospace" font-size="9" fill="#333"
text-anchor="middle">Buffer style parameter: endcap=round|flat|square</text>
+ <text x="200" y="183" font-family="monospace" font-size="9" fill="#666"
text-anchor="middle">Controls how buffer ends are shaped at line
endpoints</text>
+</svg>
\ No newline at end of file
diff --git a/docs/image/ST_Buffer_Join/ST_Buffer_Join.svg
b/docs/image/ST_Buffer_Join/ST_Buffer_Join.svg
new file mode 100644
index 0000000000..4eeef139bd
--- /dev/null
+++ b/docs/image/ST_Buffer_Join/ST_Buffer_Join.svg
@@ -0,0 +1,16 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="400" height="225" viewBox="0 0
400 225">
+ <rect width="400" height="225" fill="#f5f5f5" rx="5"/>
+ <text x="200" y="18" font-family="monospace" font-size="12" fill="#333"
text-anchor="middle" font-weight="bold">ST_Buffer</text>
+ <text x="200" y="32" font-family="monospace" font-size="9" fill="#888"
text-anchor="middle">Buffer join styles at polygon corners</text>
+ <path d="M 14.9 58.0 A 18 18 0 0 0 47.1 42.0 L 82.1 112.0 A 18 18 0 0 1 49.9
112.0 L 84.9 42.0 A 18 18 0 0 0 117.1 58.0 L 82.1 128.0 L 49.9 128.0 Z"
fill="#2ecc71" fill-opacity="0.15" stroke="#2ecc71" stroke-width="1.5"/>
+ <polyline points="31,50 66,120 101,50" fill="none" stroke="#333"
stroke-width="2" stroke-linecap="round"/>
+ <text x="66" y="160" font-family="monospace" font-size="10" fill="#2ecc71"
text-anchor="middle" font-weight="bold">join=round</text>
+ <path d="M 147.9 58.0 A 18 18 0 0 0 180.1 42.0 L 199.0 79.8 L 217.9 42.0 A
18 18 0 0 0 250.1 58.0 L 215.1 128.0 L 182.9 128.0 Z" fill="#FF9800"
fill-opacity="0.15" stroke="#FF9800" stroke-width="1.5"/>
+ <polyline points="164,50 199,120 234,50" fill="none" stroke="#333"
stroke-width="2" stroke-linecap="round"/>
+ <text x="199" y="160" font-family="monospace" font-size="10" fill="#FF9800"
text-anchor="middle" font-weight="bold">join=mitre</text>
+ <path d="M 280.9 58.0 A 18 18 0 0 0 313.1 42.0 L 348.1 112.0 L 315.9 112.0 L
350.9 42.0 A 18 18 0 0 0 383.1 58.0 L 348.1 128.0 L 315.9 128.0 Z"
fill="#9C27B0" fill-opacity="0.15" stroke="#9C27B0" stroke-width="1.5"/>
+ <polyline points="297,50 332,120 367,50" fill="none" stroke="#333"
stroke-width="2" stroke-linecap="round"/>
+ <text x="332" y="160" font-family="monospace" font-size="10" fill="#9C27B0"
text-anchor="middle" font-weight="bold">join=bevel</text>
+ <text x="200" y="185" font-family="monospace" font-size="9" fill="#333"
text-anchor="middle">Buffer style parameter: join=round|mitre|bevel</text>
+ <text x="200" y="210" font-family="monospace" font-size="9" fill="#666"
text-anchor="middle">Controls how buffer corners are shaped at polygon
vertices</text>
+</svg>
\ No newline at end of file
diff --git a/docs/image/ST_Buffer_Side/ST_Buffer_Side.svg
b/docs/image/ST_Buffer_Side/ST_Buffer_Side.svg
new file mode 100644
index 0000000000..549a6a95cd
--- /dev/null
+++ b/docs/image/ST_Buffer_Side/ST_Buffer_Side.svg
@@ -0,0 +1,19 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="400" height="210" viewBox="0 0
400 210">
+ <rect width="400" height="210" fill="#f5f5f5" rx="5"/>
+ <text x="200" y="18" font-family="monospace" font-size="12" fill="#333"
text-anchor="middle" font-weight="bold">ST_Buffer</text>
+ <text x="200" y="32" font-family="monospace" font-size="9" fill="#888"
text-anchor="middle">Single-sided buffer on linestring</text>
+ <path d="M 50.0 122.7 L 69.0 75.7 L 85.8 97.3 L 98.0 107.5 L 118.5 83.0 L
106.2 72.7 L 63.0 44.3 L 22.0 107.3 L 14.3 121.4 L 42.4 136.7 Z" fill="#2ecc71"
fill-opacity="0.15" stroke="#2ecc71" stroke-width="1.5"/>
+ <polyline points="36,115 66,60 96,85" fill="none" stroke="#333"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+ <polygon points="51,88 45,91 52,95" fill="#333"/>
+ <text x="66" y="140" font-family="monospace" font-size="10" fill="#2ecc71"
text-anchor="middle" font-weight="bold">side=both</text>
+ <path d="M 169.0 115.0 L 183.0 122.7 L 202.0 75.7 L 218.8 97.3 L 229.0 85.0
L 199.0 60.0 L 169.0 115.0 Z" fill="#4a90d9" fill-opacity="0.15"
stroke="#4a90d9" stroke-width="1.5"/>
+ <polyline points="169,115 199,60 229,85" fill="none" stroke="#333"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+ <polygon points="184,88 178,91 185,95" fill="#333"/>
+ <text x="199" y="140" font-family="monospace" font-size="10" fill="#4a90d9"
text-anchor="middle" font-weight="bold">side=left</text>
+ <path d="M 302.0 115.0 L 332.0 60.0 L 362.0 85.0 L 372.2 72.7 L 329.0 44.3 L
288.0 107.3 L 302.0 115.0 Z" fill="#E53935" fill-opacity="0.15"
stroke="#E53935" stroke-width="1.5"/>
+ <polyline points="302,115 332,60 362,85" fill="none" stroke="#333"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+ <polygon points="317,88 311,91 318,95" fill="#333"/>
+ <text x="332" y="140" font-family="monospace" font-size="10" fill="#E53935"
text-anchor="middle" font-weight="bold">side=right</text>
+ <text x="200" y="165" font-family="monospace" font-size="9" fill="#333"
text-anchor="middle">Buffer style parameter: side=both|left|right</text>
+ <text x="200" y="188" font-family="monospace" font-size="9" fill="#666"
text-anchor="middle">Single-sided buffer aligned to line direction
(arrow)</text>
+</svg>
\ No newline at end of file
diff --git a/docs/image/ST_GeoHashNeighbor/ST_GeoHashNeighbor.svg
b/docs/image/ST_GeoHashNeighbor/ST_GeoHashNeighbor.svg
new file mode 100644
index 0000000000..ef6678999c
--- /dev/null
+++ b/docs/image/ST_GeoHashNeighbor/ST_GeoHashNeighbor.svg
@@ -0,0 +1,24 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="0 0
400 200">
+ <rect width="400" height="200" fill="#f5f5f5" rx="5"/>
+ <text x="200" y="18" font-family="monospace" font-size="12" fill="#333"
text-anchor="middle" font-weight="bold">ST_GeoHashNeighbor</text>
+ <text x="200" y="32" font-family="monospace" font-size="9" fill="#888"
text-anchor="middle">Get neighboring GeoHash cell in a direction</text>
+ <rect x="122" y="48" width="38" height="38" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <text x="141" y="71" font-family="monospace" font-size="8" fill="#999"
text-anchor="middle">NW</text>
+ <rect x="122" y="86" width="38" height="38" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <text x="141" y="109" font-family="monospace" font-size="8" fill="#999"
text-anchor="middle">W</text>
+ <rect x="122" y="124" width="38" height="38" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <text x="141" y="147" font-family="monospace" font-size="8" fill="#999"
text-anchor="middle">SW</text>
+ <rect x="160" y="48" width="38" height="38" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <text x="179" y="71" font-family="monospace" font-size="8" fill="#999"
text-anchor="middle">N</text>
+ <rect x="160" y="86" width="38" height="38" fill="rgba(74,144,217,0.3)"
stroke="#1565C0" stroke-width="2"/>
+ <text x="179" y="109" font-family="monospace" font-size="9" fill="#1565C0"
text-anchor="middle" font-weight="bold">center</text>
+ <rect x="160" y="124" width="38" height="38" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <text x="179" y="147" font-family="monospace" font-size="8" fill="#999"
text-anchor="middle">S</text>
+ <rect x="198" y="48" width="38" height="38" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <text x="217" y="71" font-family="monospace" font-size="8" fill="#999"
text-anchor="middle">NE</text>
+ <rect x="198" y="86" width="38" height="38" fill="rgba(233,30,99,0.25)"
stroke="#C2185B" stroke-width="1.5"/>
+ <text x="217" y="109" font-family="monospace" font-size="8" fill="#C2185B"
text-anchor="middle" font-weight="bold">E</text>
+ <rect x="198" y="124" width="38" height="38" fill="#fff" stroke="#ccc"
stroke-width="0.8"/>
+ <text x="217" y="147" font-family="monospace" font-size="8" fill="#999"
text-anchor="middle">SE</text>
+ <text x="200" y="182" font-family="monospace" font-size="10" fill="#C2185B"
text-anchor="middle">direction='E' → returns eastern neighbor</text>
+</svg>
\ No newline at end of file
diff --git a/docs/image/ST_GeoHashNeighbors/ST_GeoHashNeighbors.svg
b/docs/image/ST_GeoHashNeighbors/ST_GeoHashNeighbors.svg
new file mode 100644
index 0000000000..8b60bc9ddb
--- /dev/null
+++ b/docs/image/ST_GeoHashNeighbors/ST_GeoHashNeighbors.svg
@@ -0,0 +1,24 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="0 0
400 200">
+ <rect width="400" height="200" fill="#f5f5f5" rx="5"/>
+ <text x="200" y="18" font-family="monospace" font-size="12" fill="#333"
text-anchor="middle" font-weight="bold">ST_GeoHashNeighbors</text>
+ <text x="200" y="32" font-family="monospace" font-size="9" fill="#888"
text-anchor="middle">Get all 8 neighboring GeoHash cells</text>
+ <rect x="122" y="48" width="38" height="38" fill="rgba(233,30,99,0.15)"
stroke="#C2185B" stroke-width="1"/>
+ <text x="141" y="71" font-family="monospace" font-size="8" fill="#C2185B"
text-anchor="middle" font-weight="bold">NW</text>
+ <rect x="122" y="86" width="38" height="38" fill="rgba(233,30,99,0.15)"
stroke="#C2185B" stroke-width="1"/>
+ <text x="141" y="109" font-family="monospace" font-size="8" fill="#C2185B"
text-anchor="middle" font-weight="bold">W</text>
+ <rect x="122" y="124" width="38" height="38" fill="rgba(233,30,99,0.15)"
stroke="#C2185B" stroke-width="1"/>
+ <text x="141" y="147" font-family="monospace" font-size="8" fill="#C2185B"
text-anchor="middle" font-weight="bold">SW</text>
+ <rect x="160" y="48" width="38" height="38" fill="rgba(233,30,99,0.15)"
stroke="#C2185B" stroke-width="1"/>
+ <text x="179" y="71" font-family="monospace" font-size="8" fill="#C2185B"
text-anchor="middle" font-weight="bold">N</text>
+ <rect x="160" y="86" width="38" height="38" fill="rgba(74,144,217,0.3)"
stroke="#1565C0" stroke-width="2"/>
+ <text x="179" y="109" font-family="monospace" font-size="9" fill="#1565C0"
text-anchor="middle" font-weight="bold">center</text>
+ <rect x="160" y="124" width="38" height="38" fill="rgba(233,30,99,0.15)"
stroke="#C2185B" stroke-width="1"/>
+ <text x="179" y="147" font-family="monospace" font-size="8" fill="#C2185B"
text-anchor="middle" font-weight="bold">S</text>
+ <rect x="198" y="48" width="38" height="38" fill="rgba(233,30,99,0.15)"
stroke="#C2185B" stroke-width="1"/>
+ <text x="217" y="71" font-family="monospace" font-size="8" fill="#C2185B"
text-anchor="middle" font-weight="bold">NE</text>
+ <rect x="198" y="86" width="38" height="38" fill="rgba(233,30,99,0.15)"
stroke="#C2185B" stroke-width="1"/>
+ <text x="217" y="109" font-family="monospace" font-size="8" fill="#C2185B"
text-anchor="middle" font-weight="bold">E</text>
+ <rect x="198" y="124" width="38" height="38" fill="rgba(233,30,99,0.15)"
stroke="#C2185B" stroke-width="1"/>
+ <text x="217" y="147" font-family="monospace" font-size="8" fill="#C2185B"
text-anchor="middle" font-weight="bold">SE</text>
+ <text x="200" y="182" font-family="monospace" font-size="10" fill="#333"
text-anchor="middle">Returns all 8 neighboring GeoHash cells</text>
+</svg>
\ No newline at end of file
diff --git a/docs/image/ST_H3CellDistance/ST_H3CellDistance.svg
b/docs/image/ST_H3CellDistance/ST_H3CellDistance.svg
new file mode 100644
index 0000000000..161628493c
--- /dev/null
+++ b/docs/image/ST_H3CellDistance/ST_H3CellDistance.svg
@@ -0,0 +1,33 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="400" height="210" viewBox="0 0
400 210">
+ <rect width="400" height="210" fill="#f5f5f5" rx="5"/>
+ <text x="200" y="18" font-family="monospace" font-size="12" fill="#333"
text-anchor="middle" font-weight="bold">ST_H3CellDistance</text>
+ <text x="200" y="32" font-family="monospace" font-size="9" fill="#888"
text-anchor="middle">Grid distance between two H3 cells</text>
+ <polygon points="93.0,95.0 84.0,110.6 66.0,110.6 57.0,95.0 66.0,79.5
84.0,79.5" fill="#4a90d9" stroke="#1565C0" stroke-width="1.5"
fill-opacity="0.35"/>
+ <polygon points="121.8,105.0 112.8,120.5 94.8,120.5 85.8,105.0 94.8,89.4
112.8,89.4" fill="#FFF9C4" stroke="#FFB300" stroke-width="1"
fill-opacity="0.5"/>
+ <polygon points="150.6,95.0 141.6,110.6 123.6,110.6 114.6,95.0 123.6,79.5
141.6,79.5" fill="#FFF9C4" stroke="#FFB300" stroke-width="1"
fill-opacity="0.5"/>
+ <polygon points="179.4,105.0 170.4,120.5 152.4,120.5 143.4,105.0 152.4,89.4
170.4,89.4" fill="#FFF9C4" stroke="#FFB300" stroke-width="1"
fill-opacity="0.5"/>
+ <polygon points="208.2,95.0 199.2,110.6 181.2,110.6 172.2,95.0 181.2,79.5
199.2,79.5" fill="#FFF9C4" stroke="#FFB300" stroke-width="1"
fill-opacity="0.5"/>
+ <polygon points="237.0,105.0 228.0,120.5 210.0,120.5 201.0,105.0 210.0,89.4
228.0,89.4" fill="#FFF9C4" stroke="#FFB300" stroke-width="1"
fill-opacity="0.5"/>
+ <polygon points="265.8,95.0 256.8,110.6 238.8,110.6 229.8,95.0 238.8,79.5
256.8,79.5" fill="#d94a4a" stroke="#C62828" stroke-width="1.5"
fill-opacity="0.35"/>
+ <line x1="75" y1="95" x2="104" y2="105" stroke="#FFB300" stroke-width="1.5"
stroke-dasharray="3,2"/>
+ <line x1="104" y1="105" x2="133" y2="95" stroke="#FFB300" stroke-width="1.5"
stroke-dasharray="3,2"/>
+ <line x1="133" y1="95" x2="161" y2="105" stroke="#FFB300" stroke-width="1.5"
stroke-dasharray="3,2"/>
+ <line x1="161" y1="105" x2="190" y2="95" stroke="#FFB300" stroke-width="1.5"
stroke-dasharray="3,2"/>
+ <line x1="190" y1="95" x2="219" y2="105" stroke="#FFB300" stroke-width="1.5"
stroke-dasharray="3,2"/>
+ <line x1="219" y1="105" x2="248" y2="95" stroke="#FFB300" stroke-width="1.5"
stroke-dasharray="3,2"/>
+ <text x="75" y="99" font-family="monospace" font-size="9" fill="#1565C0"
text-anchor="middle" font-weight="bold">A</text>
+ <text x="248" y="99" font-family="monospace" font-size="9" fill="#C62828"
text-anchor="middle" font-weight="bold">B</text>
+ <text x="104" y="109" font-family="monospace" font-size="7" fill="#F57F17"
text-anchor="middle">1</text>
+ <text x="133" y="99" font-family="monospace" font-size="7" fill="#F57F17"
text-anchor="middle">2</text>
+ <text x="161" y="109" font-family="monospace" font-size="7" fill="#F57F17"
text-anchor="middle">3</text>
+ <text x="190" y="99" font-family="monospace" font-size="7" fill="#F57F17"
text-anchor="middle">4</text>
+ <text x="219" y="109" font-family="monospace" font-size="7" fill="#F57F17"
text-anchor="middle">5</text>
+ <text x="200" y="150" font-family="monospace" font-size="11" fill="#2ecc71"
text-anchor="middle" font-weight="bold">Distance = 6</text>
+ <text x="200" y="170" font-family="monospace" font-size="10" fill="#333"
text-anchor="middle">Returns min grid steps between two H3 cells</text>
+ <circle cx="85" cy="192" r="5" fill="#4a90d9" fill-opacity="0.35"
stroke="#1565C0" stroke-width="0.8"/>
+ <text x="94" y="196" font-family="monospace" font-size="8"
fill="#1565C0">Cell A</text>
+ <circle cx="160" cy="192" r="5" fill="#d94a4a" fill-opacity="0.35"
stroke="#C62828" stroke-width="0.8"/>
+ <text x="169" y="196" font-family="monospace" font-size="8"
fill="#C62828">Cell B</text>
+ <circle cx="235" cy="192" r="5" fill="#FFF9C4" fill-opacity="0.5"
stroke="#FFB300" stroke-width="0.8"/>
+ <text x="244" y="196" font-family="monospace" font-size="8"
fill="#F57F17">Path cells</text>
+</svg>
\ No newline at end of file
diff --git a/docs/image/ST_H3CellIDs/ST_H3CellIDs.svg
b/docs/image/ST_H3CellIDs/ST_H3CellIDs.svg
new file mode 100644
index 0000000000..54952e0baf
--- /dev/null
+++ b/docs/image/ST_H3CellIDs/ST_H3CellIDs.svg
@@ -0,0 +1,67 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="400" height="230" viewBox="0 0
400 230">
+ <rect width="400" height="230" fill="#f5f5f5" rx="5"/>
+ <text x="200" y="18" font-family="monospace" font-size="12" fill="#333"
text-anchor="middle" font-weight="bold">ST_H3CellIDs</text>
+ <text x="200" y="32" font-family="monospace" font-size="9" fill="#888"
text-anchor="middle">Cover geometry with H3 hexagonal cells</text>
+ <polygon points="73.0,55.0 64.0,70.6 46.0,70.6 37.0,55.0 46.0,39.4
64.0,39.4" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="73.0,86.2 64.0,101.8 46.0,101.8 37.0,86.2 46.0,70.6
64.0,70.6" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="73.0,117.4 64.0,132.9 46.0,132.9 37.0,117.4 46.0,101.8
64.0,101.8" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="73.0,148.5 64.0,164.1 46.0,164.1 37.0,148.5 46.0,132.9
64.0,132.9" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="100.0,70.6 91.0,86.2 73.0,86.2 64.0,70.6 73.0,55.0
91.0,55.0" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="100.0,101.8 91.0,117.4 73.0,117.4 64.0,101.8 73.0,86.2
91.0,86.2" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="100.0,132.9 91.0,148.5 73.0,148.5 64.0,132.9 73.0,117.4
91.0,117.4" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="100.0,164.1 91.0,179.7 73.0,179.7 64.0,164.1 73.0,148.5
91.0,148.5" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="127.0,55.0 118.0,70.6 100.0,70.6 91.0,55.0 100.0,39.4
118.0,39.4" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="127.0,86.2 118.0,101.8 100.0,101.8 91.0,86.2 100.0,70.6
118.0,70.6" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="127.0,117.4 118.0,132.9 100.0,132.9 91.0,117.4 100.0,101.8
118.0,101.8" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="127.0,148.5 118.0,164.1 100.0,164.1 91.0,148.5 100.0,132.9
118.0,132.9" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="154.0,70.6 145.0,86.2 127.0,86.2 118.0,70.6 127.0,55.0
145.0,55.0" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="154.0,101.8 145.0,117.4 127.0,117.4 118.0,101.8 127.0,86.2
145.0,86.2" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="154.0,132.9 145.0,148.5 127.0,148.5 118.0,132.9 127.0,117.4
145.0,117.4" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="154.0,164.1 145.0,179.7 127.0,179.7 118.0,164.1 127.0,148.5
145.0,148.5" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="181.0,55.0 172.0,70.6 154.0,70.6 145.0,55.0 154.0,39.4
172.0,39.4" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="181.0,86.2 172.0,101.8 154.0,101.8 145.0,86.2 154.0,70.6
172.0,70.6" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="181.0,117.4 172.0,132.9 154.0,132.9 145.0,117.4 154.0,101.8
172.0,101.8" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="181.0,148.5 172.0,164.1 154.0,164.1 145.0,148.5 154.0,132.9
172.0,132.9" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="208.0,70.6 199.0,86.2 181.0,86.2 172.0,70.6 181.0,55.0
199.0,55.0" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="208.0,101.8 199.0,117.4 181.0,117.4 172.0,101.8 181.0,86.2
199.0,86.2" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="208.0,132.9 199.0,148.5 181.0,148.5 172.0,132.9 181.0,117.4
199.0,117.4" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="208.0,164.1 199.0,179.7 181.0,179.7 172.0,164.1 181.0,148.5
199.0,148.5" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="235.0,55.0 226.0,70.6 208.0,70.6 199.0,55.0 208.0,39.4
226.0,39.4" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="235.0,86.2 226.0,101.8 208.0,101.8 199.0,86.2 208.0,70.6
226.0,70.6" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="235.0,117.4 226.0,132.9 208.0,132.9 199.0,117.4 208.0,101.8
226.0,101.8" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="235.0,148.5 226.0,164.1 208.0,164.1 199.0,148.5 208.0,132.9
226.0,132.9" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="262.0,70.6 253.0,86.2 235.0,86.2 226.0,70.6 235.0,55.0
253.0,55.0" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="262.0,101.8 253.0,117.4 235.0,117.4 226.0,101.8 235.0,86.2
253.0,86.2" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="262.0,132.9 253.0,148.5 235.0,148.5 226.0,132.9 235.0,117.4
253.0,117.4" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="262.0,164.1 253.0,179.7 235.0,179.7 226.0,164.1 235.0,148.5
253.0,148.5" fill="#fff" stroke="#e0e0e0" stroke-width="0.6"/>
+ <polygon points="127.0,55.0 118.0,70.6 100.0,70.6 91.0,55.0 100.0,39.4
118.0,39.4" fill="#4a90d9" stroke="#1565C0" stroke-width="1.2"
fill-opacity="0.25"/>
+ <polygon points="127.0,86.2 118.0,101.8 100.0,101.8 91.0,86.2 100.0,70.6
118.0,70.6" fill="#4a90d9" stroke="#1565C0" stroke-width="1.2"
fill-opacity="0.25"/>
+ <polygon points="127.0,117.4 118.0,132.9 100.0,132.9 91.0,117.4 100.0,101.8
118.0,101.8" fill="#4a90d9" stroke="#1565C0" stroke-width="1.2"
fill-opacity="0.25"/>
+ <polygon points="127.0,148.5 118.0,164.1 100.0,164.1 91.0,148.5 100.0,132.9
118.0,132.9" fill="#4a90d9" stroke="#1565C0" stroke-width="1.2"
fill-opacity="0.25"/>
+ <polygon points="154.0,70.6 145.0,86.2 127.0,86.2 118.0,70.6 127.0,55.0
145.0,55.0" fill="#4a90d9" stroke="#1565C0" stroke-width="1.2"
fill-opacity="0.25"/>
+ <polygon points="154.0,101.8 145.0,117.4 127.0,117.4 118.0,101.8 127.0,86.2
145.0,86.2" fill="#4a90d9" stroke="#1565C0" stroke-width="1.2"
fill-opacity="0.25"/>
+ <polygon points="154.0,132.9 145.0,148.5 127.0,148.5 118.0,132.9 127.0,117.4
145.0,117.4" fill="#4a90d9" stroke="#1565C0" stroke-width="1.2"
fill-opacity="0.25"/>
+ <polygon points="154.0,164.1 145.0,179.7 127.0,179.7 118.0,164.1 127.0,148.5
145.0,148.5" fill="#4a90d9" stroke="#1565C0" stroke-width="1.2"
fill-opacity="0.25"/>
+ <polygon points="181.0,55.0 172.0,70.6 154.0,70.6 145.0,55.0 154.0,39.4
172.0,39.4" fill="#4a90d9" stroke="#1565C0" stroke-width="1.2"
fill-opacity="0.25"/>
+ <polygon points="181.0,86.2 172.0,101.8 154.0,101.8 145.0,86.2 154.0,70.6
172.0,70.6" fill="#4a90d9" stroke="#1565C0" stroke-width="1.2"
fill-opacity="0.25"/>
+ <polygon points="181.0,117.4 172.0,132.9 154.0,132.9 145.0,117.4 154.0,101.8
172.0,101.8" fill="#4a90d9" stroke="#1565C0" stroke-width="1.2"
fill-opacity="0.25"/>
+ <polygon points="181.0,148.5 172.0,164.1 154.0,164.1 145.0,148.5 154.0,132.9
172.0,132.9" fill="#4a90d9" stroke="#1565C0" stroke-width="1.2"
fill-opacity="0.25"/>
+ <polygon points="208.0,70.6 199.0,86.2 181.0,86.2 172.0,70.6 181.0,55.0
199.0,55.0" fill="#4a90d9" stroke="#1565C0" stroke-width="1.2"
fill-opacity="0.25"/>
+ <polygon points="208.0,101.8 199.0,117.4 181.0,117.4 172.0,101.8 181.0,86.2
199.0,86.2" fill="#4a90d9" stroke="#1565C0" stroke-width="1.2"
fill-opacity="0.25"/>
+ <polygon points="208.0,132.9 199.0,148.5 181.0,148.5 172.0,132.9 181.0,117.4
199.0,117.4" fill="#4a90d9" stroke="#1565C0" stroke-width="1.2"
fill-opacity="0.25"/>
+ <polygon points="208.0,164.1 199.0,179.7 181.0,179.7 172.0,164.1 181.0,148.5
199.0,148.5" fill="#4a90d9" stroke="#1565C0" stroke-width="1.2"
fill-opacity="0.25"/>
+ <polygon points="235.0,55.0 226.0,70.6 208.0,70.6 199.0,55.0 208.0,39.4
226.0,39.4" fill="#4a90d9" stroke="#1565C0" stroke-width="1.2"
fill-opacity="0.25"/>
+ <polygon points="235.0,86.2 226.0,101.8 208.0,101.8 199.0,86.2 208.0,70.6
226.0,70.6" fill="#4a90d9" stroke="#1565C0" stroke-width="1.2"
fill-opacity="0.25"/>
+ <polygon points="235.0,117.4 226.0,132.9 208.0,132.9 199.0,117.4 208.0,101.8
226.0,101.8" fill="#4a90d9" stroke="#1565C0" stroke-width="1.2"
fill-opacity="0.25"/>
+ <polygon points="235.0,148.5 226.0,164.1 208.0,164.1 199.0,148.5 208.0,132.9
226.0,132.9" fill="#4a90d9" stroke="#1565C0" stroke-width="1.2"
fill-opacity="0.25"/>
+ <polygon points="262.0,70.6 253.0,86.2 235.0,86.2 226.0,70.6 235.0,55.0
253.0,55.0" fill="#4a90d9" stroke="#1565C0" stroke-width="1.2"
fill-opacity="0.25"/>
+ <polygon points="262.0,101.8 253.0,117.4 235.0,117.4 226.0,101.8 235.0,86.2
253.0,86.2" fill="#4a90d9" stroke="#1565C0" stroke-width="1.2"
fill-opacity="0.25"/>
+ <polygon points="262.0,132.9 253.0,148.5 235.0,148.5 226.0,132.9 235.0,117.4
253.0,117.4" fill="#4a90d9" stroke="#1565C0" stroke-width="1.2"
fill-opacity="0.25"/>
+ <polygon points="262.0,164.1 253.0,179.7 235.0,179.7 226.0,164.1 235.0,148.5
253.0,148.5" fill="#4a90d9" stroke="#1565C0" stroke-width="1.2"
fill-opacity="0.25"/>
+ <polygon points="115,70 245,55 290,105 270,155 150,160 95,120" fill="none"
stroke="#E53935" stroke-width="2" stroke-dasharray="5,3"/>
+ <text x="200" y="193" font-family="monospace" font-size="10" fill="#1565C0"
text-anchor="middle">Returns array of H3 cell IDs covering the geometry</text>
+ <rect x="70" y="206" width="10" height="10" fill="rgba(74,144,217,0.25)"
stroke="#1565C0" stroke-width="1"/>
+ <text x="84" y="215" font-family="monospace" font-size="8"
fill="#1565C0">Covered cells</text>
+ <line x1="190" y1="211" x2="220" y2="211" stroke="#E53935"
stroke-width="1.5" stroke-dasharray="4,2"/>
+ <text x="224" y="215" font-family="monospace" font-size="8"
fill="#E53935">Input geometry</text>
+</svg>
\ No newline at end of file
diff --git a/docs/image/ST_H3KRing/ST_H3KRing.svg
b/docs/image/ST_H3KRing/ST_H3KRing.svg
new file mode 100644
index 0000000000..a0a0065899
--- /dev/null
+++ b/docs/image/ST_H3KRing/ST_H3KRing.svg
@@ -0,0 +1,34 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="400" height="230" viewBox="0 0
400 230">
+ <rect width="400" height="230" fill="#f5f5f5" rx="5"/>
+ <text x="200" y="18" font-family="monospace" font-size="12" fill="#333"
text-anchor="middle" font-weight="bold">ST_H3KRing</text>
+ <text x="200" y="32" font-family="monospace" font-size="9" fill="#888"
text-anchor="middle">H3 cells within k steps of center cell</text>
+ <polygon points="280.0,142.6 270.0,160.0 250.0,160.0 240.0,142.6 250.0,125.3
270.0,125.3" fill="#4a90d9" stroke="#1565C0" stroke-width="0.8"
fill-opacity="0.15"/>
+ <polygon points="250.0,160.0 240.0,177.3 220.0,177.3 210.0,160.0 220.0,142.6
240.0,142.6" fill="#4a90d9" stroke="#1565C0" stroke-width="0.8"
fill-opacity="0.15"/>
+ <polygon points="220.0,177.3 210.0,194.6 190.0,194.6 180.0,177.3 190.0,160.0
210.0,160.0" fill="#4a90d9" stroke="#1565C0" stroke-width="0.8"
fill-opacity="0.15"/>
+ <polygon points="190.0,160.0 180.0,177.3 160.0,177.3 150.0,160.0 160.0,142.6
180.0,142.6" fill="#4a90d9" stroke="#1565C0" stroke-width="0.8"
fill-opacity="0.15"/>
+ <polygon points="160.0,142.6 150.0,160.0 130.0,160.0 120.0,142.6 130.0,125.3
150.0,125.3" fill="#4a90d9" stroke="#1565C0" stroke-width="0.8"
fill-opacity="0.15"/>
+ <polygon points="160.0,108.0 150.0,125.3 130.0,125.3 120.0,108.0 130.0,90.7
150.0,90.7" fill="#4a90d9" stroke="#1565C0" stroke-width="0.8"
fill-opacity="0.15"/>
+ <polygon points="160.0,73.4 150.0,90.7 130.0,90.7 120.0,73.4 130.0,56.0
150.0,56.0" fill="#4a90d9" stroke="#1565C0" stroke-width="0.8"
fill-opacity="0.15"/>
+ <polygon points="190.0,56.0 180.0,73.4 160.0,73.4 150.0,56.0 160.0,38.7
180.0,38.7" fill="#4a90d9" stroke="#1565C0" stroke-width="0.8"
fill-opacity="0.15"/>
+ <polygon points="220.0,38.7 210.0,56.0 190.0,56.0 180.0,38.7 190.0,21.4
210.0,21.4" fill="#4a90d9" stroke="#1565C0" stroke-width="0.8"
fill-opacity="0.15"/>
+ <polygon points="250.0,56.0 240.0,73.4 220.0,73.4 210.0,56.0 220.0,38.7
240.0,38.7" fill="#4a90d9" stroke="#1565C0" stroke-width="0.8"
fill-opacity="0.15"/>
+ <polygon points="280.0,73.4 270.0,90.7 250.0,90.7 240.0,73.4 250.0,56.0
270.0,56.0" fill="#4a90d9" stroke="#1565C0" stroke-width="0.8"
fill-opacity="0.15"/>
+ <polygon points="280.0,108.0 270.0,125.3 250.0,125.3 240.0,108.0 250.0,90.7
270.0,90.7" fill="#4a90d9" stroke="#1565C0" stroke-width="0.8"
fill-opacity="0.15"/>
+ <polygon points="250.0,125.3 240.0,142.6 220.0,142.6 210.0,125.3 220.0,108.0
240.0,108.0" fill="#FF9800" stroke="#EF6C00" stroke-width="1"
fill-opacity="0.25"/>
+ <polygon points="220.0,142.6 210.0,160.0 190.0,160.0 180.0,142.6 190.0,125.3
210.0,125.3" fill="#FF9800" stroke="#EF6C00" stroke-width="1"
fill-opacity="0.25"/>
+ <polygon points="190.0,125.3 180.0,142.6 160.0,142.6 150.0,125.3 160.0,108.0
180.0,108.0" fill="#FF9800" stroke="#EF6C00" stroke-width="1"
fill-opacity="0.25"/>
+ <polygon points="190.0,90.7 180.0,108.0 160.0,108.0 150.0,90.7 160.0,73.4
180.0,73.4" fill="#FF9800" stroke="#EF6C00" stroke-width="1"
fill-opacity="0.25"/>
+ <polygon points="220.0,73.4 210.0,90.7 190.0,90.7 180.0,73.4 190.0,56.0
210.0,56.0" fill="#FF9800" stroke="#EF6C00" stroke-width="1"
fill-opacity="0.25"/>
+ <polygon points="250.0,90.7 240.0,108.0 220.0,108.0 210.0,90.7 220.0,73.4
240.0,73.4" fill="#FF9800" stroke="#EF6C00" stroke-width="1"
fill-opacity="0.25"/>
+ <polygon points="220.0,108.0 210.0,125.3 190.0,125.3 180.0,108.0 190.0,90.7
210.0,90.7" fill="#E53935" stroke="#C62828" stroke-width="1.5"
fill-opacity="0.35"/>
+ <text x="200" y="112" font-family="monospace" font-size="9" fill="#C62828"
text-anchor="middle" font-weight="bold">k=0</text>
+ <text x="165" y="95" font-family="monospace" font-size="8" fill="#EF6C00"
font-weight="bold">k=1</text>
+ <text x="135" y="77" font-family="monospace" font-size="8" fill="#1565C0"
font-weight="bold">k=2</text>
+ <text x="200" y="198" font-family="monospace" font-size="10" fill="#333"
text-anchor="middle">Returns H3 cells within distance k of center</text>
+ <circle cx="90" cy="215" r="5" fill="#E53935" fill-opacity="0.35"
stroke="#C62828" stroke-width="0.8"/>
+ <text x="99" y="219" font-family="monospace" font-size="8"
fill="#C62828">Center</text>
+ <circle cx="165" cy="215" r="5" fill="#FF9800" fill-opacity="0.25"
stroke="#EF6C00" stroke-width="0.8"/>
+ <text x="174" y="219" font-family="monospace" font-size="8"
fill="#EF6C00">Ring 1</text>
+ <circle cx="240" cy="215" r="5" fill="#4a90d9" fill-opacity="0.15"
stroke="#1565C0" stroke-width="0.8"/>
+ <text x="249" y="219" font-family="monospace" font-size="8"
fill="#1565C0">Ring 2</text>
+</svg>
\ No newline at end of file
diff --git a/docs/image/ST_H3ToGeom/ST_H3ToGeom.svg
b/docs/image/ST_H3ToGeom/ST_H3ToGeom.svg
new file mode 100644
index 0000000000..b3fa3ab865
--- /dev/null
+++ b/docs/image/ST_H3ToGeom/ST_H3ToGeom.svg
@@ -0,0 +1,22 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="0 0
400 200">
+ <rect width="400" height="200" fill="#f5f5f5" rx="5"/>
+ <text x="200" y="18" font-family="monospace" font-size="12" fill="#333"
text-anchor="middle" font-weight="bold">ST_H3ToGeom</text>
+ <text x="200" y="32" font-family="monospace" font-size="9" fill="#888"
text-anchor="middle">Convert H3 cell IDs to hexagonal Polygons</text>
+ <text x="60" y="72" font-family="monospace" font-size="10" fill="#666"
text-anchor="middle">Cell IDs</text>
+ <rect x="18" y="78" width="84" height="20" rx="3" fill="#e8eaf6"
stroke="#7986cb" stroke-width="1"/>
+ <text x="60" y="91" font-family="monospace" font-size="9" fill="#3949ab"
text-anchor="middle">612586</text>
+ <rect x="18" y="103" width="84" height="20" rx="3" fill="#e8eaf6"
stroke="#7986cb" stroke-width="1"/>
+ <text x="60" y="116" font-family="monospace" font-size="9" fill="#3949ab"
text-anchor="middle">612587</text>
+ <rect x="18" y="128" width="84" height="20" rx="3" fill="#e8eaf6"
stroke="#7986cb" stroke-width="1"/>
+ <text x="60" y="141" font-family="monospace" font-size="9" fill="#3949ab"
text-anchor="middle">612588</text>
+ <defs><marker id="arr" markerWidth="8" markerHeight="6" refX="8" refY="3"
orient="auto"><path d="M0,0 L8,3 L0,6" fill="#666"/></marker></defs>
+ <line x1="120" y1="108" x2="175" y2="108" stroke="#666" stroke-width="1.5"
marker-end="url(#arr)"/>
+ <polygon points="264.0,78.0 252.0,98.8 228.0,98.8 216.0,78.0 228.0,57.2
252.0,57.2" fill="#4a90d9" stroke="#4a90d9" stroke-width="1.5"
fill-opacity="0.25"/>
+ <polygon points="264.0,78.0 252.0,98.8 228.0,98.8 216.0,78.0 228.0,57.2
252.0,57.2" fill="none" stroke="#4a90d9" stroke-width="1.5"/>
+ <polygon points="300.0,99.0 288.0,119.8 264.0,119.8 252.0,99.0 264.0,78.2
288.0,78.2" fill="#d94a4a" stroke="#d94a4a" stroke-width="1.5"
fill-opacity="0.25"/>
+ <polygon points="300.0,99.0 288.0,119.8 264.0,119.8 252.0,99.0 264.0,78.2
288.0,78.2" fill="none" stroke="#d94a4a" stroke-width="1.5"/>
+ <polygon points="264.0,120.0 252.0,140.8 228.0,140.8 216.0,120.0 228.0,99.2
252.0,99.2" fill="#2ecc71" stroke="#2ecc71" stroke-width="1.5"
fill-opacity="0.25"/>
+ <polygon points="264.0,120.0 252.0,140.8 228.0,140.8 216.0,120.0 228.0,99.2
252.0,99.2" fill="none" stroke="#2ecc71" stroke-width="1.5"/>
+ <text x="310" y="103" font-family="monospace" font-size="10" fill="#666"
text-anchor="start">Polygons</text>
+ <text x="200" y="180" font-family="monospace" font-size="10" fill="#333"
text-anchor="middle">Returns array of hexagonal Polygon geometries</text>
+</svg>
\ No newline at end of file
diff --git a/docs/image/ST_S2CellIDs/ST_S2CellIDs.svg
b/docs/image/ST_S2CellIDs/ST_S2CellIDs.svg
new file mode 100644
index 0000000000..016be82480
--- /dev/null
+++ b/docs/image/ST_S2CellIDs/ST_S2CellIDs.svg
@@ -0,0 +1,98 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="400" height="230" viewBox="0 0
400 230">
+ <rect width="400" height="230" fill="#f5f5f5" rx="5"/>
+ <text x="200" y="18" font-family="monospace" font-size="12" fill="#333"
text-anchor="middle" font-weight="bold">ST_S2CellIDs</text>
+ <text x="200" y="32" font-family="monospace" font-size="9" fill="#888"
text-anchor="middle">Cover geometry with S2 square cells</text>
+ <rect x="55" y="45" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="55" y="73" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="55" y="101" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="55" y="129" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="55" y="157" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="83" y="45" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="83" y="73" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="83" y="101" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="83" y="129" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="83" y="157" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="111" y="45" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="111" y="73" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="111" y="101" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="111" y="129" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="111" y="157" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="139" y="45" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="139" y="73" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="139" y="101" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="139" y="129" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="139" y="157" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="167" y="45" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="167" y="73" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="167" y="101" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="167" y="129" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="167" y="157" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="195" y="45" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="195" y="73" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="195" y="101" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="195" y="129" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="195" y="157" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="223" y="45" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="223" y="73" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="223" y="101" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="223" y="129" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="223" y="157" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="251" y="45" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="251" y="73" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="251" y="101" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="251" y="129" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="251" y="157" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="279" y="45" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="279" y="73" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="279" y="101" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="279" y="129" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="279" y="157" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="307" y="45" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="307" y="73" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="307" y="101" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="307" y="129" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="307" y="157" width="28" height="28" fill="#fff" stroke="#e0e0e0"
stroke-width="0.6"/>
+ <rect x="83" y="45" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="83" y="73" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="83" y="101" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="83" y="129" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="111" y="45" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="111" y="73" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="111" y="101" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="111" y="129" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="111" y="157" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="139" y="45" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="139" y="73" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="139" y="101" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="139" y="129" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="139" y="157" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="167" y="45" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="167" y="73" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="167" y="101" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="167" y="129" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="167" y="157" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="195" y="45" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="195" y="73" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="195" y="101" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="195" y="129" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="195" y="157" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="223" y="45" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="223" y="73" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="223" y="101" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="223" y="129" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="223" y="157" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="251" y="45" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="251" y="73" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="251" y="101" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="251" y="129" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="251" y="157" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="279" y="73" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="279" y="101" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <rect x="279" y="129" width="28" height="28" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="0.8"/>
+ <polygon points="115,60 250,50 295,110 265,160 140,165 85,120" fill="none"
stroke="#E53935" stroke-width="2" stroke-dasharray="5,3"/>
+ <text x="200" y="200" font-family="monospace" font-size="10" fill="#1565C0"
text-anchor="middle">Returns array of S2 cell IDs covering the geometry</text>
+ <rect x="70" y="210" width="10" height="10" fill="rgba(74,144,217,0.2)"
stroke="#1565C0" stroke-width="1"/>
+ <text x="84" y="219" font-family="monospace" font-size="8"
fill="#1565C0">Covered cells</text>
+ <line x1="190" y1="215" x2="220" y2="215" stroke="#E53935"
stroke-width="1.5" stroke-dasharray="4,2"/>
+ <text x="224" y="219" font-family="monospace" font-size="8"
fill="#E53935">Input geometry</text>
+</svg>
\ No newline at end of file
diff --git a/docs/image/ST_S2ToGeom/ST_S2ToGeom.svg
b/docs/image/ST_S2ToGeom/ST_S2ToGeom.svg
new file mode 100644
index 0000000000..e3fd6ec475
--- /dev/null
+++ b/docs/image/ST_S2ToGeom/ST_S2ToGeom.svg
@@ -0,0 +1,19 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="0 0
400 200">
+ <rect width="400" height="200" fill="#f5f5f5" rx="5"/>
+ <text x="200" y="18" font-family="monospace" font-size="12" fill="#333"
text-anchor="middle" font-weight="bold">ST_S2ToGeom</text>
+ <text x="200" y="32" font-family="monospace" font-size="9" fill="#888"
text-anchor="middle">Convert S2 cell IDs to rectangular Polygons</text>
+ <text x="60" y="72" font-family="monospace" font-size="10" fill="#666"
text-anchor="middle">Cell IDs</text>
+ <rect x="18" y="78" width="84" height="20" rx="3" fill="#e8eaf6"
stroke="#7986cb" stroke-width="1"/>
+ <text x="60" y="91" font-family="monospace" font-size="9" fill="#3949ab"
text-anchor="middle">1153...</text>
+ <rect x="18" y="103" width="84" height="20" rx="3" fill="#e8eaf6"
stroke="#7986cb" stroke-width="1"/>
+ <text x="60" y="116" font-family="monospace" font-size="9" fill="#3949ab"
text-anchor="middle">1154...</text>
+ <rect x="18" y="128" width="84" height="20" rx="3" fill="#e8eaf6"
stroke="#7986cb" stroke-width="1"/>
+ <text x="60" y="141" font-family="monospace" font-size="9" fill="#3949ab"
text-anchor="middle">1155...</text>
+ <defs><marker id="arr2" markerWidth="8" markerHeight="6" refX="8" refY="3"
orient="auto"><path d="M0,0 L8,3 L0,6" fill="#666"/></marker></defs>
+ <line x1="120" y1="108" x2="175" y2="108" stroke="#666" stroke-width="1.5"
marker-end="url(#arr2)"/>
+ <rect x="195" y="68" width="55" height="48" fill="#4a90d9"
fill-opacity="0.2" stroke="#4a90d9" stroke-width="1.5"/>
+ <rect x="255" y="68" width="55" height="48" fill="#d94a4a"
fill-opacity="0.2" stroke="#d94a4a" stroke-width="1.5"/>
+ <rect x="195" y="120" width="55" height="48" fill="#2ecc71"
fill-opacity="0.2" stroke="#2ecc71" stroke-width="1.5"/>
+ <text x="330" y="100" font-family="monospace" font-size="10"
fill="#666">Polygons</text>
+ <text x="200" y="185" font-family="monospace" font-size="10" fill="#333"
text-anchor="middle">Returns array of rectangular Polygon geometries</text>
+</svg>
\ No newline at end of file
diff --git a/docs/image/ST_StraightSkeleton/ST_StraightSkeleton.svg
b/docs/image/ST_StraightSkeleton/ST_StraightSkeleton.svg
new file mode 100644
index 0000000000..7092867579
--- /dev/null
+++ b/docs/image/ST_StraightSkeleton/ST_StraightSkeleton.svg
@@ -0,0 +1,42 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="400" height="230" viewBox="0 0
400 230">
+ <rect width="400" height="230" fill="#f5f5f5" rx="5"/>
+ <text x="200" y="18" font-family="monospace" font-size="12" fill="#333"
text-anchor="middle" font-weight="bold">ST_StraightSkeleton</text>
+ <text x="200" y="32" font-family="monospace" font-size="9" fill="#888"
text-anchor="middle">Straight skeleton of a polygon</text>
+ <polygon points="84.0,162.0 106.0,162.0 106.0,74.0 139.0,74.0 139.0,52.0
51.0,52.0 51.0,74.0 84.0,74.0" fill="rgba(74,144,217,0.2)" stroke="#1565C0"
stroke-width="2"/>
+ <circle cx="84.0" cy="162.0" r="2.5" fill="#1565C0"/>
+ <circle cx="106.0" cy="162.0" r="2.5" fill="#1565C0"/>
+ <circle cx="106.0" cy="74.0" r="2.5" fill="#1565C0"/>
+ <circle cx="139.0" cy="74.0" r="2.5" fill="#1565C0"/>
+ <circle cx="139.0" cy="52.0" r="2.5" fill="#1565C0"/>
+ <circle cx="51.0" cy="52.0" r="2.5" fill="#1565C0"/>
+ <circle cx="51.0" cy="74.0" r="2.5" fill="#1565C0"/>
+ <circle cx="84.0" cy="74.0" r="2.5" fill="#1565C0"/>
+ <text x="95" y="190" font-family="monospace" font-size="9" fill="#1565C0"
text-anchor="middle" font-weight="bold">Input polygon</text>
+ <defs><marker id="arrsk" markerWidth="8" markerHeight="6" refX="8" refY="3"
orient="auto"><path d="M0,0 L8,3 L0,6" fill="#666"/></marker></defs>
+ <line x1="180" y1="105" x2="210" y2="105" stroke="#666" stroke-width="1.5"
marker-end="url(#arrsk)"/>
+ <polygon points="289.0,162.0 311.0,162.0 311.0,74.0 344.0,74.0 344.0,52.0
256.0,52.0 256.0,74.0 289.0,74.0" fill="rgba(74,144,217,0.1)" stroke="#90CAF5"
stroke-width="1.5" stroke-dasharray="4,2"/>
+ <line x1="300.0" y1="151.0" x2="300.0" y2="63.0" stroke="#E53935"
stroke-width="2"/>
+ <line x1="300.0" y1="63.0" x2="267.0" y2="63.0" stroke="#E53935"
stroke-width="2"/>
+ <line x1="300.0" y1="63.0" x2="333.0" y2="63.0" stroke="#E53935"
stroke-width="2"/>
+ <line x1="267.0" y1="63.0" x2="256.0" y2="63.0" stroke="#E53935"
stroke-width="2"/>
+ <line x1="267.0" y1="63.0" x2="278.0" y2="74.0" stroke="#E53935"
stroke-width="2"/>
+ <line x1="333.0" y1="63.0" x2="344.0" y2="63.0" stroke="#E53935"
stroke-width="2"/>
+ <line x1="333.0" y1="63.0" x2="322.0" y2="74.0" stroke="#E53935"
stroke-width="2"/>
+ <line x1="300.0" y1="151.0" x2="289.0" y2="151.0" stroke="#E53935"
stroke-width="2"/>
+ <line x1="300.0" y1="151.0" x2="311.0" y2="151.0" stroke="#E53935"
stroke-width="2"/>
+ <circle cx="344.0" cy="63.0" r="2.5" fill="#E53935"/>
+ <circle cx="311.0" cy="151.0" r="2.5" fill="#E53935"/>
+ <circle cx="322.0" cy="74.0" r="2.5" fill="#E53935"/>
+ <circle cx="300.0" cy="63.0" r="2.5" fill="#E53935"/>
+ <circle cx="267.0" cy="63.0" r="2.5" fill="#E53935"/>
+ <circle cx="256.0" cy="63.0" r="2.5" fill="#E53935"/>
+ <circle cx="333.0" cy="63.0" r="2.5" fill="#E53935"/>
+ <circle cx="300.0" cy="151.0" r="2.5" fill="#E53935"/>
+ <circle cx="289.0" cy="151.0" r="2.5" fill="#E53935"/>
+ <circle cx="278.0" cy="74.0" r="2.5" fill="#E53935"/>
+ <text x="300" y="190" font-family="monospace" font-size="9" fill="#E53935"
text-anchor="middle" font-weight="bold">Straight skeleton</text>
+ <line x1="80" y1="205" x2="100" y2="205" stroke="#90CAF5" stroke-width="1.5"
stroke-dasharray="4,2"/>
+ <text x="104" y="209" font-family="monospace" font-size="8"
fill="#1565C0">Polygon boundary</text>
+ <line x1="220" y1="205" x2="240" y2="205" stroke="#E53935" stroke-width="2"/>
+ <text x="244" y="209" font-family="monospace" font-size="8"
fill="#E53935">Skeleton edges</text>
+</svg>
\ No newline at end of file
diff --git a/docs/image/ST_Transform/ST_Transform.svg
b/docs/image/ST_Transform/ST_Transform.svg
new file mode 100644
index 0000000000..802befdddd
--- /dev/null
+++ b/docs/image/ST_Transform/ST_Transform.svg
@@ -0,0 +1,46 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="400" height="250" viewBox="0 0
400 250">
+ <rect width="400" height="250" fill="#f5f5f5" rx="5"/>
+ <text x="200" y="18" font-family="monospace" font-size="12" fill="#333"
text-anchor="middle" font-weight="bold">ST_Transform</text>
+ <text x="200" y="32" font-family="monospace" font-size="9" fill="#888"
text-anchor="middle">Re-project geometry between CRS</text>
+ <circle cx="95" cy="120" r="65" fill="#e3f2fd" stroke="#1565C0"
stroke-width="1.5"/>
+ <ellipse cx="95" cy="169.8" rx="41.8" ry="5.0" fill="none" stroke="#BBDEFB"
stroke-width="0.5"/>
+ <ellipse cx="95" cy="142.2" rx="61.1" ry="7.3" fill="none" stroke="#BBDEFB"
stroke-width="0.5"/>
+ <ellipse cx="95" cy="120.0" rx="65.0" ry="7.8" fill="none" stroke="#BBDEFB"
stroke-width="0.5"/>
+ <ellipse cx="95" cy="97.8" rx="61.1" ry="7.3" fill="none" stroke="#BBDEFB"
stroke-width="0.5"/>
+ <ellipse cx="95" cy="70.2" rx="41.8" ry="5.0" fill="none" stroke="#BBDEFB"
stroke-width="0.5"/>
+ <ellipse cx="72" cy="120" rx="7" ry="65" fill="none" stroke="#BBDEFB"
stroke-width="0.5"/>
+ <ellipse cx="95" cy="120" rx="8" ry="65" fill="none" stroke="#BBDEFB"
stroke-width="0.5"/>
+ <ellipse cx="118" cy="120" rx="7" ry="65" fill="none" stroke="#BBDEFB"
stroke-width="0.5"/>
+ <rect x="87" y="107.33487672140222" width="14" height="14"
fill="rgba(233,30,99,0.4)" stroke="#C2185B" stroke-width="1.5" rx="1"/>
+ <text x="105" y="117.33487672140222" font-family="monospace" font-size="7"
fill="#C2185B">5°N</text>
+ <rect x="90" y="59.755117121215534" width="14" height="14"
fill="rgba(46,204,113,0.4)" stroke="#1B5E20" stroke-width="1.5" rx="1"/>
+ <text x="108" y="69.75511712121553" font-family="monospace" font-size="7"
fill="#1B5E20">55°N</text>
+ <text x="95" y="201" font-family="monospace" font-size="9" fill="#1565C0"
text-anchor="middle" font-weight="bold">WGS 84 (EPSG:4326)</text>
+ <text x="95" y="213" font-family="monospace" font-size="8" fill="#999"
text-anchor="middle">Same-size regions</text>
+ <defs><marker id="arrt" markerWidth="8" markerHeight="6" refX="8" refY="3"
orient="auto"><path d="M0,0 L8,3 L0,6" fill="#666"/></marker></defs>
+ <line x1="172" y1="120" x2="210" y2="120" stroke="#666" stroke-width="1.5"
marker-end="url(#arrt)"/>
+ <text x="191" y="113" font-family="monospace" font-size="7" fill="#666"
text-anchor="middle">ST_Transform</text>
+ <rect x="222" y="45" width="155" height="150" fill="#fff" stroke="#2ecc71"
stroke-width="1.5"/>
+ <line x1="253" y1="45" x2="253" y2="195" stroke="#e8f5e9"
stroke-width="0.6"/>
+ <line x1="284" y1="45" x2="284" y2="195" stroke="#e8f5e9"
stroke-width="0.6"/>
+ <line x1="315" y1="45" x2="315" y2="195" stroke="#e8f5e9"
stroke-width="0.6"/>
+ <line x1="346" y1="45" x2="346" y2="195" stroke="#e8f5e9"
stroke-width="0.6"/>
+ <line x1="222" y1="163.7" x2="377" y2="163.7" stroke="#e8f5e9"
stroke-width="0.6"/>
+ <text x="380" y="166.7" font-family="monospace" font-size="6"
fill="#aaa">-50°</text>
+ <line x1="222" y1="135.4" x2="377" y2="135.4" stroke="#e8f5e9"
stroke-width="0.6"/>
+ <text x="380" y="138.4" font-family="monospace" font-size="6"
fill="#aaa">-20°</text>
+ <line x1="222" y1="120.0" x2="377" y2="120.0" stroke="#e8f5e9"
stroke-width="0.6"/>
+ <text x="380" y="123.0" font-family="monospace" font-size="6"
fill="#aaa">0°</text>
+ <line x1="222" y1="104.6" x2="377" y2="104.6" stroke="#e8f5e9"
stroke-width="0.6"/>
+ <text x="380" y="107.6" font-family="monospace" font-size="6"
fill="#aaa">20°</text>
+ <line x1="222" y1="76.3" x2="377" y2="76.3" stroke="#e8f5e9"
stroke-width="0.6"/>
+ <text x="380" y="79.3" font-family="monospace" font-size="6"
fill="#aaa">50°</text>
+ <text x="219" y="123.0" font-family="monospace" font-size="6" fill="#aaa"
text-anchor="end">eq</text>
+ <rect x="276.2" y="110.9" width="16.8" height="10.6"
fill="rgba(233,30,99,0.4)" stroke="#C2185B" stroke-width="1.5" rx="1"/>
+ <rect x="284.0" y="60.8" width="16.8" height="18.6"
fill="rgba(46,204,113,0.4)" stroke="#1B5E20" stroke-width="1.5" rx="1"/>
+ <line x1="305.8" y1="60.8" x2="305.8" y2="79.4" stroke="#1B5E20"
stroke-width="1" stroke-dasharray="2,1"/>
+ <text x="308.8" y="73.1" font-family="monospace" font-size="6"
fill="#1B5E20">stretched</text>
+ <text x="299" y="211" font-family="monospace" font-size="9" fill="#2ecc71"
text-anchor="middle" font-weight="bold">Web Mercator (EPSG:3857)</text>
+ <text x="299" y="223" font-family="monospace" font-size="8" fill="#999"
text-anchor="middle">High latitudes appear larger</text>
+ <text x="200" y="238" font-family="monospace" font-size="9" fill="#333"
text-anchor="middle">ST_Transform re-projects coordinates, changing shape and
scale</text>
+</svg>
\ No newline at end of file
diff --git a/docs/image/skeleton/ST_ApproximateMedialAxis_illustration.png
b/docs/image/skeleton/ST_ApproximateMedialAxis_illustration.png
deleted file mode 100644
index b27c24b108..0000000000
Binary files a/docs/image/skeleton/ST_ApproximateMedialAxis_illustration.png
and /dev/null differ
diff --git a/docs/image/skeleton/ST_StraightSkeleton_illustration.png
b/docs/image/skeleton/ST_StraightSkeleton_illustration.png
deleted file mode 100644
index 7dd6592bd1..0000000000
Binary files a/docs/image/skeleton/ST_StraightSkeleton_illustration.png and
/dev/null differ