의사 3D 효과를 만들기 위해 postgis에서 다각형 모양을 돌출시키고 싶습니다. 이를 위해 나는 그것을 달성하기 위해 조잡한 기능을 작성했습니다. 이것은 매우 많은 테스트 코드이며 다각형의 각 점에 대해 새로운 Y 꼭지점을 만든 다음 원래 점으로 돌아가 닫습니다.
CREATE OR REPLACE FUNCTION public.extrude_polygon(wkb_geometry_param geometry, height integer, simplify boolean DEFAULT false)
RETURNS geometry AS
$BODY$
DECLARE
f int;
ret_geom geometry;
wkb_geometry geometry;
BEGIN
--convert polygon to linestring
IF ST_GeometryType(wkb_geometry_param) != 'ST_Polygon' THEN
RETURN NULL;
END IF;
IF simplify THEN
wkb_geometry = ST_Simplify(ST_Transform(ST_Exteriorring(wkb_geometry_param), 27700), 0.5);
ELSE
wkb_geometry = ST_Transform(ST_Exteriorring(wkb_geometry_param), 27700);
END IF;
--initialise output geometry
ret_geom =ST_MakeLine(ST_PointN(wkb_geometry,1),ST_PointN(wkb_geometry,1));
--Move first point to up
SELECT ST_AddPoint(ret_geom,
ST_MakePoint(ST_X(ST_PointN(wkb_geometry, 1)),
ST_Y(ST_PointN(wkb_geometry, 1)) + height)
) into ret_geom;
FOR f IN 1..ST_NPoints(wkb_geometry) LOOP
IF f < ST_NPoints(wkb_geometry) THEN
--across to next high point
SELECT ST_AddPoint(ret_geom,
ST_MakePoint(ST_X(ST_PointN(wkb_geometry, f + 1)),
ST_Y(ST_PointN(wkb_geometry, f + 1)) + height)
) into ret_geom;
--down to next point
SELECT ST_AddPoint(ret_geom, ST_PointN(wkb_geometry,f + 1)) into ret_geom;
--back to last point
SELECT ST_AddPoint(ret_geom, ST_PointN(wkb_geometry,f)) into ret_geom;
--back then up again
SELECT ST_AddPoint(ret_geom, ST_PointN(wkb_geometry,f + 1)) into ret_geom;
SELECT ST_AddPoint(ret_geom,
ST_MakePoint(ST_X(ST_PointN(wkb_geometry, f + 1)),
ST_Y(ST_PointN(wkb_geometry, f + 1)) + height)
) into ret_geom;
ELSE
--across to first high point
SELECT ST_AddPoint(ret_geom,
ST_MakePoint(ST_X(ST_PointN(wkb_geometry, 1)),
ST_Y(ST_PointN(wkb_geometry, 1)) + height)
) into ret_geom;
SELECT ST_AddPoint(ret_geom, ST_PointN(wkb_geometry,1)) into ret_geom;
END IF;
END LOOP;
RETURN ST_Buffer(ST_Buffer(ST_MakePolygon(ret_geom),10), -10);
END;
$BODY$
LANGUAGE plpgsql
간단한 다각형에서는 작동하지만 내부 링에는 문제가 있지만 주된 문제는 실제로 느리다는 것입니다. 결과 모양을 맵 서버에서 음영 처리 및 렌더링 할 수있는 다각형으로 출력해야합니다. 따라서 버퍼 동작은 끝에서 모양을 윤곽선으로 줄이는 유일한 방법입니다.
최종 결과는 원래 다각형을 나타내는 돌출 된 모양입니다. 그런 다음 원래 폴리곤을 동일한 돌출 거리만큼 간격 띄우고 상단에 배치하여 지붕을 만들 수 있습니다.
postgis-2.1.1에서 ST_Extrude 함수를 사용하는 것을 고려했지만 ST_PolyhedralSurface 유형을 생성하고 맵 서버에서 렌더링 할 수 없습니다. 내가 알 수있는 한 ST_Buffer가 ST_polyhedralsurfaces에서 작동하지 않기 때문에 이것의 개요를 만들 수있는 방법이 없습니다.
제 질문은 제 기능을 향상시킬 수 있습니까? 아니면 더 나은 접근 방식이 있습니까? 출력은 돌출 다각형에 오프셋 다각형을 배치하여 생성 한 다이어그램에 따라 표시되어야합니다.