ทุกคนสามารถให้ SQL ตัวอย่างสำหรับการปรับให้เรียบ linestrings จากตาราง postgis โดยใช้ Bezier curves หรืออัลกอริทึมIterative Averaging ( SIA )
ทุกคนสามารถให้ SQL ตัวอย่างสำหรับการปรับให้เรียบ linestrings จากตาราง postgis โดยใช้ Bezier curves หรืออัลกอริทึมIterative Averaging ( SIA )
คำตอบ:
ฉันสร้างสคริปต์ขนาดเล็กที่ไร้เดียงสาซึ่งแปลง LineStrings อินพุตไปเป็น CompoundCurves โดยอิงตามฮิวริสติกบางอย่าง
มันทำอะไร:
มันไม่ได้ทำอะไร:
สคริปต์:
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;
ในขณะที่มันคืนค่าเส้นโค้งในรูปทรงเรขาคณิตหากคุณต้องการใช้ใน GIS เช่น QGIS คุณจะต้องห่อมันไว้ในฟังก์ชัน PostGIS เพื่อแปลงมัน ไวยากรณ์การใช้งานที่ต้องการคือ:
SELECT ST_AsText(ST_CurveToLine(CreateCurve(geom))) AS geom FROM linestringtable;
นี่ยังคงเป็นปัญหาที่เปิดกว้างใน PostGIS (และเครื่องมือ GIS อื่น ๆ ) ตามที่ระบุไว้ในหนังสือ "PostGIS in Action" ในบทที่ 2.2.6 "รูปทรงโค้ง"
นี่คือการอ้างอิงถึงอัลกอริทึมและรหัส:
คุณสามารถพยายามที่จะแปลง LineStrings ของคุณเพื่อโค้งด้วยST_LineToCurveแล้วกลับไป LineStrings กับST_CurveToLine
คุณสามารถตั้งค่าจำนวนเซ็กเมนต์ต่อวงกลมควอเตอร์ที่คุณต้องการใน ST_CurveToLine