क्या कोई बेज़ियर कर्व्स या इटरेटिव एवरेजिंग ( SIA ) एल्गोरिथ्म का उपयोग करके पोस्टगिस टेबल से लाइनस्ट्रीम को चिकना करने के लिए एक उदाहरण एसक्यूएल प्रदान कर सकता है?
क्या कोई बेज़ियर कर्व्स या इटरेटिव एवरेजिंग ( SIA ) एल्गोरिथ्म का उपयोग करके पोस्टगिस टेबल से लाइनस्ट्रीम को चिकना करने के लिए एक उदाहरण एसक्यूएल प्रदान कर सकता है?
जवाबों:
मैंने एक छोटी, भोली स्क्रिप्ट बनाई, जो इनपुट लाइनस्ट्रीम को कुछ आंकड़ों के आधार पर 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;
चूंकि यह एक ज्यामिति प्रकार में घटता है, यदि आप इसे जीआईएस में उपयोग करना चाहते हैं जैसे कि क्यूजीआईएस, तो आपको इसे पोस्टजीआईएस कार्यों में लपेटना होगा जो उन्हें चारों ओर परिवर्तित कर रहे हैं। इच्छित उपयोग सिंटैक्स है:
SELECT ST_AsText(ST_CurveToLine(CreateCurve(geom))) AS geom FROM linestringtable;
यह अभी भी पोस्टजीआईएस (और अन्य जीआईएस टूल्स) में एक खुला मुद्दा है जैसा कि अध्याय 2.2.6 "घुमावदार ज्यामितीय" में "पोस्टजीआईएस इन एक्शन" पुस्तक में कहा गया है।
एल्गोरिदम और कोड के कुछ संदर्भ यहां दिए गए हैं:
आप अपने LineStrings साथ घटता में बदलने की कोशिश कर सकते हैं ST_LineToCurve साथ LineStrings वापस करने के लिए और फिर ST_CurveToLine ।
आप ST_CurveToLine में इच्छित प्रति वर्ग सर्कल की संख्या निर्धारित कर सकते हैं।