বেজিয়ার কার্ভ বা আইট্রেটিভ এভারেজিং ( এসআইএ ) অ্যালগরিদম ব্যবহার করে পোস্টগ্রিজ টেবিল থেকে লাইনস্ট্রিংগুলি মসৃণ করার জন্য কেউ কি এসকিউএল উদাহরণ সরবরাহ করতে পারেন ?
বেজিয়ার কার্ভ বা আইট্রেটিভ এভারেজিং ( এসআইএ ) অ্যালগরিদম ব্যবহার করে পোস্টগ্রিজ টেবিল থেকে লাইনস্ট্রিংগুলি মসৃণ করার জন্য কেউ কি এসকিউএল উদাহরণ সরবরাহ করতে পারেন ?
উত্তর:
আমি একটি ছোট, নিষ্পাপ স্ক্রিপ্ট তৈরি করেছি যা কিছু হিউরিস্টিকের ভিত্তিতে ইনপুট লাইনস্ট্রিংগুলিকে কমপাউন্ড কারভেভে রূপান্তর করে।
এর মানে কি:
এটি কি করে না:
এই পান্ডুলিপি:
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;
এটি এখনও পোস্টজিআইএস (এবং অন্যান্য জিআইএস সরঞ্জামগুলি) এর একটি উন্মুক্ত ইস্যু হিসাবে অধ্যায় ২.২..6 "বক্ররেখার জ্যামিতিগুলি" এর "পোস্টজিআইএস ইন অ্যাকশন" বইয়ে বলা আছে।
এখানে অ্যালগরিদম এবং কোড সম্পর্কিত কিছু উল্লেখ রয়েছে:
তুমি তোমার linestrings সঙ্গে রেখাচিত্র রূপান্তর করার চেষ্টা করতে পারেন ST_LineToCurve সঙ্গে linestrings ফিরে এবং তারপর ST_CurveToLine ।
আপনি এস-কুর্ভেটোলাইনটিতে আপনি চান প্রতি ত্রৈমাসিকের বৃত্তের বিভাগগুলি নির্ধারণ করতে পারেন।