Sahte bir 3D efekti oluşturmak için postgis bir çokgen şekli ekstrüde etmek istiyorum. Bu amaçla, bunu başarmak için kaba bir işlev yazdım. Bu çok fazla test kodudur ve çokgendeki her nokta için yeni bir Y köşesi oluşturur ve ardından orijinal noktaya dönerek kapatır:
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
Basit çokgenlerle çalışır, ancak iç halkalarla ilgili problemleri vardır, ancak asıl mesele gerçekten yavaş olmasıdır. Ortaya çıkan şekli gölgeli ve mapserver içinde render edilebilir bir çokgen olarak çıktı gerekiyor. Bu yüzden sonunda tampon işlemi, şeklini ana hatlarına indirgemenin tek yoludur.
Sonuç, orijinal çokgeni temsil eden ekstrüde edilmiş bir şekil olacaktır. Daha sonra orijinal çokgeni aynı ekstrüzyon mesafesiyle dengeleyebilir ve çatıyı yapmak için üstüne yerleştirebilirim.
Postgis-2.1.1 ST_Extrude işlevini kullanarak düşündüm ama bu bir ST_PolyhedralSurface türü oluşturur ve ben mapserver içinde render mümkün değil. Anlayabildiğim kadarıyla ST_Buffer ST_polyhedralsurfaces ile çalışmadığı için bunun bir anahat oluşturmak için bir yolu yoktur.
Benim sorum şu, fonksiyonum geliştirilebilir mi? Yoksa daha iyi bir yaklaşım var mı? Çıktı, ofset poligonu ekstrüde şeklim üzerine yerleştirerek oluşturduğum şemaya göre görünmelidir.