This example converts a linear Polygon approximating a circle to a CurvePolygon.
WITH data AS (
SELECT ST_Buffer('POINT(1 3)'::geometry, 3) AS geom
)
SELECT geom AS "input_Linear polygon",
ST_LineToCurve(geom) AS "Curved polygon"
FROM data;
-[ RECORD 1 ]----------
input_Linear polygon | POLYGON((4 3,3.942 2.415,3.772 1.852,3.494 1.333,3.121 0.879,2.667 0.506,2.148 0.228,1.585 0.058,1 0,0.415 0.058,-0.148 0.228,-0.667 0.506,-1.121 0.879,-1.494 1.333,-1.772 1.852,-1.942 2.415,-2 3,-1.942 3.585,-1.772 4.148,-1.494 4.667,-1.121 5.121,-0.667 5.494,-0.148 5.772,0.415 5.942,1 6,1.585 5.942,2.148 5.772,2.667 5.494,3.121 5.121,3.494 4.667,3.772 4.148,3.942 3.585,4 3))
Curved polygon | CURVEPOLYGON(CIRCULARSTRING(4 3,-2 3,4 3))
01030000000100000021000000000000000000104000000000000008408485F9DBF1890F40DE30AC745D510340F4E965DB502C0E40F600FD0296A1FD3F3AF9CA9E8CF40B40D4627A292755F53FDA6CDFCC76F808409C4C82CC241EEC3F97CE426B6C550540181BD484CD2DE03F867F81FE342F0140C060A149F23ACD3F459EA716455DF93F009F9E018983AD3F000000000000F03F0000000000000000F48661A5EB8ADA3F009F9E018983AD3F50F817E84FF3C2BFC060A149F23ACD3F523A0BADB155E5BF101BD484CD2DE03FB2D9BE99EDF0F1BF984C82CC241EEC3F76F2953D19E9F7BFD4627A292755F53FE8D3CBB6A158FCBFF400FD0296A1FD3F080BF3B7E313FFBFDC30AC745D51034000000000000000C00000000000000840080BF3B7E313FFBF22CF538BA2AE0C40EAD3CBB6A158FCBFC2BF407F9A97104078F2953D19E9F7BF4A67A135B6AA1240B4D9BE99EDF0F1BF6CB66F663B7C1440583A0BADB155E5BF9D7C654F46FA154090F817E84FF3C2BFFAF4B26D28161740DA8661A5EB8ADA3FC2C2FCEDF8C41740000000000000F03F0000000000001840449EA716455DF93FC2C2FCEDF8C41740867F81FE342F0140FAF4B26D2816174094CE426B6C5505409E7C654F46FA1540D86CDFCC76F808406DB66F663B7C14403AF9CA9E8CF40B404B67A135B6AA1240F3E965DB502C0E40C4BF407F9A9710408385F9DBF1890F4025CF538BA2AE0C4000000000000010400000000000000840 | 010A000000010000000108000000030000000000000000001040000000000000084000000000000000C0000000000000084000000000000010400000000000000840
This example converts a 3D linear ring to a CircularString while preserving Z.
WITH data AS (
SELECT ST_Translate(
ST_Force3D(ST_Boundary(ST_Buffer(ST_Point(1, 3), 2, 2))),
0, 0, 3
) AS geom
)
SELECT geom AS "input_Linear ring at Z=3",
ST_LineToCurve(geom) AS "Circular string at Z=3"
FROM data;
-[ RECORD 1 ]----------
input_Linear ring at Z=3 | LINESTRING Z (3 3 3,2.414 1.586 3,1 1 3,-0.414 1.586 3,-1 3 3,-0.414 4.414 3,1 5 3,2.414 4.414 3,3 3 3)
Circular string at Z=3 | CIRCULARSTRING Z (3 3 3,-1 3 3,3 3 3)
010200008009000000000000000000084000000000000008400000000000000840E69D3F334F50034034C48099615FF93F0000000000000840000000000000F03F000000000000F03F000000000000084030EFFC997982DABF33C48099615FF93F0000000000000840000000000000F0BF0000000000000840000000000000084038EFFC997982DABFF3CE9F9927A811400000000000000840000000000000F03F00000000000014400000000000000840E69D3F334F500340F4CE9F9927A811400000000000000840000000000000084000000000000008400000000000000840 | 010800008003000000000000000000084000000000000008400000000000000840000000000000F0BF00000000000008400000000000000840000000000000084000000000000008400000000000000840