মজার প্রশ্ন! এটি এমন কিছু যা আমি নিজের চেষ্টা করতে চেয়েছিলাম, তাই এটিকে চালিয়ে যান।
আপনি বহুগুণের একটি সেট তৈরি করে এমন একটি ফাংশন সহ পোস্টগ্রিজ / পোস্টজিআইএস এ এটি করতে পারেন।
আমার ক্ষেত্রে, আমার কাছে একটি বৈশিষ্ট্যযুক্ত একটি টেবিল রয়েছে (একটি মাল্টলাইনস্ট্রিং) যা রেললাইনটির প্রতিনিধিত্ব করে। এটি মিটারে একটি সিআরএস ব্যবহার করতে হবে, আমি ওএসজিবি (27700) ব্যবহার করছি। আমি 4km x 2km 'পৃষ্ঠা' করেছি।
এখানে, আপনি ফলাফলটি দেখতে পাচ্ছেন ... সবুজ স্টাফটি হ'ল রাস্তা নেটওয়ার্ক, রেলওয়ের চারপাশে 1 কিলোমিটার বাফারে ক্লিপড, যা বহুভুজগুলির উচ্চতার সাথে সুন্দরভাবে মিলে যায়।
এখানে ফাংশনটি ...
CREATE OR REPLACE FUNCTION getAllPages(wid float, hite float, srid integer, overlap float) RETURNS SETOF geometry AS
$BODY$
DECLARE
page geometry; -- holds each page as it is generated
myline geometry; -- holds the line geometry
startpoint geometry;
endpoint geometry;
azimuth float; -- angle of rotation
curs float := 0.0 ; -- how far along line left edge is
step float;
stepnudge float;
currpoly geometry; -- used to make pages
currline geometry;
currangle float;
numpages float;
BEGIN
-- drop ST_LineMerge call if using LineString
-- replace this with your table.
SELECT ST_LineMerge(geom) INTO myline from traced_osgb;
numpages := ST_Length(myline)/wid;
step := 1.0/numpages;
stepnudge := (1.0-overlap) * step;
FOR r in 1..cast (numpages as integer)
LOOP
-- work out current line segment
startpoint := ST_SetSRID(ST_Line_Interpolate_Point(myline,curs),srid);
endpoint := ST_SetSRID(ST_Line_Interpolate_Point(myline,curs+step),srid);
currline := ST_SetSRID(ST_MakeLine(startpoint,endpoint),srid);
-- make a polygon of appropriate size at origin of CRS
currpoly := ST_SetSRID(ST_Extent(ST_MakeLine(ST_MakePoint(0.0,0.0),ST_MakePoint(wid,hite))),srid);
-- then nudge downwards so the midline matches the current line segment
currpoly := ST_Translate(currpoly,0.0,-hite/2.0);
-- Rotate to match angle
-- I have absolutely no idea how this bit works.
currangle := -ST_Azimuth(startpoint,endpoint) - (PI()/2.0) + PI();
currpoly := ST_Rotate(currpoly, currangle);
-- then move to start of current segment
currpoly := ST_Translate(currpoly,ST_X(startpoint),ST_Y(startpoint));
page := currpoly;
RETURN NEXT page as geom; -- yield next result
curs := curs + stepnudge;
END LOOP;
RETURN;
END
$BODY$
LANGUAGE 'plpgsql' ;
এই ফাংশন ব্যবহার করে
এখানে একটি উদাহরণ; 4km x 2km পৃষ্ঠাগুলি, epsg: 27700 এবং 10% ওভারল্যাপ
select st_asEwkt(getallpages) from getAllPages(4000.0, 2000.0, 27700, 0.1);
এটি চালানোর পরে আপনি পিজএডমিনিআইআইআই থেকে একটি সিএসভি ফাইলে রফতানি করতে পারবেন। আপনি এটি কিউজিআইএস এ আমদানি করতে পারেন, তবে আপনার স্তরের জন্য ম্যানুয়ালি সিআরএস সেট করার দরকার হতে পারে - কিউজিআইএস আপনার জন্য স্তর সিআরএস সেট করতে EWKT এ এসআরআইডি ব্যবহার করে না: /
বিয়ারিং বৈশিষ্ট্য যুক্ত করা হচ্ছে
পোস্টগ্রিসে এটি সম্ভবত সহজ কাজ, এটি কিউজিআইএস এক্সপ্রেশনে করা যেতে পারে তবে আপনাকে কিছু কোড লিখতে হবে। এটার মতো কিছু...
create table pages as (
select getallpages from getAllPages(4000.0, 2000.0, 27700, 0.1)
);
alter table pages add column bearing float;
update pages set bearing=ST_Azimuth(ST_PointN(getallpages,1),ST_PointN(getallpages,2));
আদেশ সহকারে
এটি কিছুটা হ্যাক-একসাথে, এবং কেবলমাত্র একটি ডেটাसेटে পরীক্ষার সুযোগ ছিল।
100% নিশ্চিত নয় যে দুটি ভার্টিকোস আপনাকে সেই ভারবহন বৈশিষ্ট্য আপডেটে চয়ন করতে হবে query
.. তার জন্য পরীক্ষার প্রয়োজন হতে পারে।
আমার নিশ্চয়ই স্বীকার করতে হবে যে বর্তমান লাইনের অংশটি মেলানোর জন্য বহুভুজকে ঘোরানোর জন্য কেন আমাকে এই জাতীয় সংশ্লেষিত সূত্রটি করা দরকার। আমি ভেবেছিলাম আমি ST_Azimuth () থেকে ST_Rotate () এ আউটপুটটি ব্যবহার করতে পারি, তবে মনে হয় না।