Превращение отрезков в дуги, красивый транспортный дисплей - PullRequest
0 голосов
/ 09 декабря 2018

Я пытаюсь включить отображение сегмента линии enter image description here для отображения сегмента дуги

enter image description here Мои данные linput кодируются в виде серииГеометрия MultiLineString,
Я пробовал такие вещи, как st_forcecurve (st_linemerge (geom)), который превращает мои данные в серии очень хороших прямых линий, закодированных как геометрии CompoundCurve.Есть какой-нибудь способ, чтобы сгенерировать изогнутую линию вместо прямой линии.

1 Ответ

0 голосов
/ 09 декабря 2018

Кажется, я не единственный, кто столкнулся с такими проблемами Очень похожая проблема

Один из ответов сделал то, что я хотел.Я только что преобразовал этот ответ в функцию 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;
...