Tôi muốn đùn hình dạng đa giác trong postgis để tạo hiệu ứng giả 3D. Cuối cùng, tôi đã viết một hàm thô để đạt được nó. Đây là rất nhiều mã kiểm tra và nó tạo ra một đỉnh Y mới cho mỗi điểm trên đa giác và sau đó đóng nó bằng cách quay lại điểm ban đầu: -
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
Nó hoạt động với các đa giác đơn giản nhưng có vấn đề với vòng bên trong, nhưng vấn đề chính là nó thực sự chậm. Tôi cần xuất hình dạng kết quả dưới dạng đa giác có thể được tô bóng và hiển thị trong mapserver. Do đó, các hoạt động của bộ đệm ở cuối là cách duy nhất tôi biết để giảm hình dạng cho đường viền của nó.
Kết quả cuối cùng sẽ là một hình dạng đùn thể hiện đa giác ban đầu. Sau đó tôi có thể bù đa giác ban đầu bằng cùng khoảng cách đùn và đặt nó lên trên cùng để làm mái nhà.
Tôi đã cân nhắc sử dụng hàm ST_Extrude trong postgis-2.1.1 NHƯNG điều này tạo ra một loại ST_PolyheccaSurface và tôi không thể kết xuất nó trong mapserver. Theo như tôi có thể nói, không có cách nào để tạo ra một phác thảo về điều này vì ST_Buffer không hoạt động với ST_polyhedralsurfaces.
Vì vậy, câu hỏi của tôi là, chức năng của tôi có thể được cải thiện? Hoặc là có một cách tiếp cận tốt hơn. Đầu ra cần phải nhìn theo sơ đồ mà tôi đã tạo bằng cách đặt đa giác bù vào hình dạng đùn của tôi.