मैं एक छद्म 3 डी प्रभाव बनाने के लिए पोस्टगिस में एक बहुभुज आकार निकालना चाहता हूं। इसके लिए मैंने इसे प्राप्त करने के लिए एक क्रूड फ़ंक्शन लिखा है। यह बहुत अधिक परीक्षण कोड है और यह बहुभुज पर प्रत्येक बिंदु के लिए एक नया 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
यह साधारण बहुभुजों के साथ काम करता है लेकिन आंतरिक रिंगों के साथ समस्या है, लेकिन मुख्य मुद्दा यह है कि यह वास्तव में धीमा है। मुझे परिणामी आकृति को बहुभुज के रूप में आउटपुट करने की आवश्यकता होती है जिसे छायांकित किया जा सकता है और मानचित्रकार में प्रस्तुत किया जा सकता है। इसलिए अंत में बफ़र ऑपरेशन, जो एकमात्र तरीका है कि मैं इसके रूपरेखा को आकार को कम करने के बारे में जानता हूं।
अंतिम परिणाम मूल बहुभुज का प्रतिनिधित्व करने वाला एक extruded आकार होगा। फिर मैं मूल बहुभुज को समान एक्सट्रूज़न दूरी से ऑफसेट कर सकता हूं और छत बनाने के लिए इसे शीर्ष पर रख सकता हूं।
मैंने पोस्टगिस-2.1.1 में ST_Extrude फ़ंक्शन का उपयोग करने पर विचार किया लेकिन यह एक ST_PolyhedralSurface प्रकार बनाता है और मैं इसे मैप्सवर में रेंडर करने में सक्षम नहीं हूं। जहाँ तक मैं बता सकता हूँ कि इस की रूपरेखा तैयार करने का कोई तरीका नहीं है क्योंकि ST_Buffer ST_polyhedralsurfaces के साथ काम नहीं करता है।
तो, मेरा प्रश्न यह है कि क्या मेरे कार्य में सुधार हो सकता है? या एक बेहतर दृष्टिकोण है। आउटपुट को आरेख के अनुसार देखने की जरूरत है जो मैंने अपने एक्सट्रूडेड आकार पर ऑफसेट बहुभुज को रखकर बनाया है।