Câu trả lời:
Tôi đã tạo một tập lệnh nhỏ, ngây thơ để chuyển đổi LineStrings đầu vào thành CompoundCurves dựa trên một số phương pháp phỏng đoán.
Những gì nó làm:
Những gì nó không làm:
Kịch bản:
CREATE OR REPLACE FUNCTION CreateCurve(geom geometry, percent int DEFAULT 40)
RETURNS geometry AS
$$
DECLARE
result text;
p0 geometry;
p1 geometry;
p2 geometry;
intp geometry;
tempp geometry;
geomtype text := ST_GeometryType(geom);
factor double precision := percent::double precision / 200;
i integer;
BEGIN
IF percent < 0 OR percent > 100 THEN
RAISE EXCEPTION 'Smoothing factor must be between 0 and 100';
END IF;
IF geomtype != 'ST_LineString' OR factor = 0 THEN
RETURN geom;
END IF;
result := 'COMPOUNDCURVE((';
p0 := ST_PointN(geom, 1);
IF ST_NPoints(geom) = 2 THEN
p1:= ST_PointN(geom, 2);
result := result || ST_X(p0) || ' ' || ST_Y(p0) || ',' || ST_X(p1) || ' ' || ST_Y(p1) || '))';
ELSE
FOR i IN 2..(ST_NPoints(geom) - 1) LOOP
p1 := ST_PointN(geom, i);
p2 := ST_PointN(geom, i + 1);
result := result || ST_X(p0) || ' ' || ST_Y(p0) || ',';
tempp := ST_Line_Interpolate_Point(ST_MakeLine(p1, p0), factor);
p0 := ST_Line_Interpolate_Point(ST_MakeLine(p1, p2), factor);
intp := ST_Line_Interpolate_Point(
ST_MakeLine(
ST_Line_Interpolate_Point(ST_MakeLine(p0, p1), 0.5),
ST_Line_Interpolate_Point(ST_MakeLine(tempp, p1), 0.5)
), 0.5);
result := result || ST_X(tempp) || ' ' || ST_Y(tempp) || '),CIRCULARSTRING(' || ST_X(tempp) || ' ' || ST_Y(tempp) || ',' || ST_X(intp) || ' ' ||
ST_Y(intp) || ',' || ST_X(p0) || ' ' || ST_Y(p0) || '),(';
END LOOP;
result := result || ST_X(p0) || ' ' || ST_Y(p0) || ',' || ST_X(p2) || ' ' || ST_Y(p2) || '))';
END IF;
RETURN ST_SetSRID(result::geometry, ST_SRID(geom));
END;
$$
LANGUAGE 'plpgsql' IMMUTABLE;
Vì nó trả về các đường cong theo kiểu hình học, nếu bạn muốn sử dụng nó trong một hệ thống GIS như QGIS, bạn phải bọc nó thành các hàm PostGIS chuyển đổi chúng xung quanh. Cú pháp sử dụng dự định là:
SELECT ST_AsText(ST_CurveToLine(CreateCurve(geom))) AS geom FROM linestringtable;
Đây vẫn là một vấn đề mở trong PostGIS (và các công cụ GIS khác) như đã nêu trong cuốn sách "PostGIS in Action" trong chương 2.2.6 "Hình học cong".
Dưới đây là một số tài liệu tham khảo về thuật toán và mã:
Bạn có thể thử chuyển đổi các linestrings của mình thành các đường cong với ST_LineToCurve và sau đó quay lại các linestrings với ST_CurveToLine .
Bạn có thể đặt số lượng phân khúc trên mỗi vòng tròn quý bạn muốn trong ST_CurveToLine.