베 지어 곡선 또는 SIA (Iterative Averaging ) 알고리즘을 사용하여 postgis 테이블에서 라인 스트링을 매끄럽게하기 위해 SQL 예제를 제공 할 수 있습니까 ?
베 지어 곡선 또는 SIA (Iterative Averaging ) 알고리즘을 사용하여 postgis 테이블에서 라인 스트링을 매끄럽게하기 위해 SQL 예제를 제공 할 수 있습니까 ?
답변:
휴리스틱을 기반으로 입력 LineString을 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;
지오메트리 유형의 커브를 반환 할 때 QGIS와 같은 GIS에서 사용하려면 커브를 PostGIS 함수로 감싸서 변환해야합니다. 사용 구문은 다음과 같습니다.
SELECT ST_AsText(ST_CurveToLine(CreateCurve(geom))) AS geom FROM linestringtable;
이것은 2.2.6 장 "곡선 형상"의 "동작중인 PostGIS"책에 명시된 PostGIS (및 기타 GIS 도구)에서 여전히 공개 된 문제입니다.
다음은 알고리즘 및 코드에 대한 참조입니다.
ST_LineToCurve 를 사용하여 선 스트링을 곡선으로 변환 한 다음 ST_CurveToLine을 사용 하여 선 스트링으로 다시 변환 할 수 있습니다 .
ST_CurveToLine에서 원하는 분기 원당 세그먼트 수를 설정할 수 있습니다.