Кажется, я не единственный, кто столкнулся с такими проблемами Очень похожая проблема
Один из ответов сделал то, что я хотел.Я только что преобразовал этот ответ в функцию psql, которая генерирует изогнутую дугу, используя коэффициент того, насколько изогнутым вы хотите получить ответ, низкие значения очень изогнутые, высокие значения - прямая линия.
--
-- Draw an arc geom between two differentlocations
--
-- point1 must be a point starting location
-- point2 must be a point ending location
-- arc_fractor how curved you want the result
-- returns a curved geometry
create or replace function mk_arg_geom(point1 geometry, point2 geometry, arc_factor integer )
returns geometry
as $$
DECLARE
ret geometry;
ret_srid integer;
tmp_geom geometry;
c_geom geometry;
BEGIN
ret := null;
ret_srid:=st_srid(point1);
tmp_geom=st_makeline(point1,point2);
c_geom:= ST_CurveToLine('CIRCULARSTRING(' ||
st_x(st_startpoint(tmp_geom)) ||
' ' ||
st_y(st_startpoint(tmp_geom)) ||
', ' ||
st_x(st_centroid(ST_OffsetCurve(tmp_geom, st_length(tmp_geom)/arc_factor, 'quad_segs=4 join=bevel'))) ||
' ' ||
st_y(st_centroid(ST_OffsetCurve(tmp_geom, st_length(tmp_geom)/arc_factor, 'quad_segs=4 join=bevel'))) ||
', ' ||
st_x(st_endpoint(tmp_geom)) ||
' ' ||
st_y(st_endpoint(tmp_geom))
|| ')');
ret=st_setsrid(c_geom,ret_srid);
return ret;
END;
$$
LANGUAGE plpgsql;