পোস্টজিআইএসে কীভাবে এসআইএ বা বেজিয়ার লাইন মসৃণ করা যায়?


9

বেজিয়ার কার্ভ বা আইট্রেটিভ এভারেজিং ( এসআইএ ) অ্যালগরিদম ব্যবহার করে পোস্টগ্রিজ টেবিল থেকে লাইনস্ট্রিংগুলি মসৃণ করার জন্য কেউ কি এসকিউএল উদাহরণ সরবরাহ করতে পারেন ?

উত্তর:


6

আমি একটি ছোট, নিষ্পাপ স্ক্রিপ্ট তৈরি করেছি যা কিছু হিউরিস্টিকের ভিত্তিতে ইনপুট লাইনস্ট্রিংগুলিকে কমপাউন্ড কারভেভে রূপান্তর করে।

এর মানে কি:

  • আসল কোণগুলি কেটে দেয় মূল ডেটার চেয়ে দৃশ্যমানভাবে বেশি আবেদনময়ী ফলাফল তৈরি করতে।
  • Plpgsql ব্যবহার করে। কোন অতিরিক্ত এক্সটেনশন প্রয়োজন।
  • জ্যামিতির পাশাপাশি 0 এবং 100 এর মধ্যে একটি alচ্ছিক "স্মুথিং ফ্যাক্টর" গ্রহণ করে।

এটি কি করে না:

  • প্রক্রিয়াগুলি মাল্টলাইনস্ট্রিংস। অন্য কোনও জ্যামিতির ধরণের জন্য, এটি কেবল ইনপুটটি দেয়।
  • জেড এবং এম মান ব্যবহার করে। এটি কেবল তাদের ড্রপ করে। এটি কেবল 2 ডি কার্টোগ্রাফিক উদ্দেশ্যে ব্যবহার করুন।
  • গাণিতিকভাবে সঠিক ফলাফল তৈরি করে। ফলাফলগুলি সঠিক থেকে দূরে, এবং কিছু ক্ষেত্রে (যেমন তীক্ষ্ণ কোণ) এমনকি চাক্ষুষভাবে বিন্দু হতে পারে। আমি এটি ভালভাবে পরীক্ষা করিনি। সর্বদা ফলাফল পর্যালোচনা!
  • দ্রুত দৌড়ায়. আমি নিশ্চিত যে এটিকে আবার আরও অনুকূল আকারে আবারও লেখা যেতে পারে।
  • আসল স্মুথিং করে। বাস্তব স্মুথিংয়ের জন্য আরও অনেক ভাল অ্যালগরিদম রয়েছে (যেমন চাইকেন বা প্রশ্নের মধ্যে উল্লিখিত) use এই উত্তরটি আমার মতো লোকেদের টার্গেট করে খাঁটি পোস্টজিআইএস পদ্ধতির জন্য স্বয়ংক্রিয়ভাবে বাস্তব তথ্য থেকে কিছু ধরণের বাঁকা লাইন তৈরি করে।

এই পান্ডুলিপি:

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.5 থেকে পরবর্তী সময়ে একটি ফাংশন হিসাবে উপলব্ধ হবে, যা আমি প্রত্যাশা করছি।
_ ওয়েডস

1

এটি এখনও পোস্টজিআইএস (এবং অন্যান্য জিআইএস সরঞ্জামগুলি) এর একটি উন্মুক্ত ইস্যু হিসাবে অধ্যায় ২.২..6 "বক্ররেখার জ্যামিতিগুলি" এর "পোস্টজিআইএস ইন অ্যাকশন" বইয়ে বলা আছে।

এখানে অ্যালগরিদম এবং কোড সম্পর্কিত কিছু উল্লেখ রয়েছে:


আমি postgis.17.x6 ... লিঙ্কগুলি যুক্ত করেছি
মার্টিন এফ

0

তুমি তোমার linestrings সঙ্গে রেখাচিত্র রূপান্তর করার চেষ্টা করতে পারেন ST_LineToCurve সঙ্গে linestrings ফিরে এবং তারপর ST_CurveToLine

আপনি এস-কুর্ভেটোলাইনটিতে আপনি চান প্রতি ত্রৈমাসিকের বৃত্তের বিভাগগুলি নির্ধারণ করতে পারেন।


লাইনটুকুভে কার্ভটোলাইন আউটপুট হস্তান্তর করার জন্য তৈরি করা হয়েছে, স্বেচ্ছাসেবীর ইনপুট থেকে কার্ভগুলি নিষ্কাশনের জন্য নয়।
পল রামসে

@ পোলাম্যামেসি পরবর্তী পোস্টগিজ সংস্করণগুলিতে বেজিয়ার স্মুথিং যুক্ত হবে? আমি উদাহরণস্বরূপ এর মতো কিছু নিয়ে ভাবছিলাম: ওয়েবহেল্প.সরি.কম
গ্যারি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.