ঠিক আছে .. যেহেতু এটি মানচিত্রের ইউনিটে রয়েছে এটি সীমাবদ্ধতার মধ্যে মোটামুটি সোজা-এগিয়ে হওয়া উচিত। আপনি ইতিমধ্যে লেবেলের উচ্চতা জানেন। এটি যদি পয়েন্টগুলিতে থাকে তবে এটি স্কেল-নির্ভর।
এটি একটি স্থির লেবেলের আকার অনুমান করে, সুতরাং আপনার লেবেলগুলি কতটা সমান, এবং আপনি একটি সমানুপাতিক বা স্থির-প্রস্থের ফন্ট ব্যবহার করবেন কিনা তা নির্ভর করে (এটি নির্দিষ্ট প্রস্থটি সহজ - লেবেলের দৈর্ঘ্যের সাথে লেবেলের দৈর্ঘ্যকে গুণান) লেবেলের প্রস্থ পান)।
দুঃখের বিষয় কীভাবে লেবেলের সীমানা রেন্ডার করা যায় তা কীভাবে পাওয়া যায় সে সম্পর্কে এটি আপনার প্রশ্নের উত্তর দেয় না ।
আপনার 4 টি কেস রয়েছে (এনই, এনডাব্লু, এসই, এসডাব্লু)
আমি ধরে নিলাম আপনার টেবিলটি দেখতে এমন দেখাচ্ছে (ক্ষমা চাই, কিছু ক্ষেত্রের নাম আলাদা)
CREATE TABLE points
(
uniq int PRIMARY KEY,
geom geometry(Point,27700),
label_x int,
label_y int,
labeltext character varying(100)
);
ALTER TABLE points
OWNER TO user;
GRANT ALL ON TABLE points TO user;
GRANT SELECT ON TABLE points TO public;
এর পরে, 4 পয়েন্ট যুক্ত করুন (সমস্ত অভিন্ন) তবে 4 টি প্রধান ব্যবহারের ক্ষেত্রে প্রতিনিধিত্ব করতে 4 চতুর্ভুজগুলিতে লেবেল যুক্ত করুন
insert into points values
(1,ST_SetSRID(ST_Point(1000,1000),27700),750,750,'123');
insert into points values(2,ST_SetSRID(ST_Point(1000,1000),27700),1250,1250,'456')
insert into points values
(3,ST_SetSRID(ST_Point(1000,1000),27700),750,1250,'456')
insert into points values
(4,ST_SetSRID(ST_Point(1000,1000),27700),1250,750,'789')
আমি সিআরএস 27700 ব্যবহার করেছি (নীচে-বামে 0,0 মিটারে মানচিত্রের একক) আমি একটি লেবেলের প্রস্থ 50, উচ্চতা 30 মানচিত্রের ইউনিট ধরেছি।
-- SW use case
CREATE OR REPLACE VIEW leader_line_sw AS
SELECT
uniq,
ST_MakeLine(geom, ST_SetSRID(ST_MakePoint(label_x+50, label_y+30), 27700))::geometry(linestring, 27700) AS geom
FROM points
WHERE label_x IS NOT NULL AND
label_y<=ST_Y(geom) and label_x<=ST_X(geom);
-- SE use case
CREATE OR REPLACE VIEW leader_line_se AS
SELECT
uniq,
ST_MakeLine(geom, ST_SetSRID(ST_MakePoint(label_x, label_y-30), 27700))::geometry(linestring, 27700) AS geom
FROM points
WHERE label_x IS NOT NULL AND
label_y<=ST_Y(geom) and label_x>ST_X(geom);
-- NE use case
CREATE OR REPLACE VIEW leader_line_ne AS
SELECT
uniq,
ST_MakeLine(geom, ST_SetSRID(ST_MakePoint(label_x, label_y), 27700))::geometry(linestring, 27700) AS geom
FROM points
WHERE label_x IS NOT NULL AND
label_y>ST_Y(geom) and label_x>ST_X(geom);
-- NW use case
CREATE OR REPLACE VIEW leader_line_nw2 AS
SELECT
uniq,
ST_MakeLine(geom, ST_SetSRID(ST_MakePoint(label_x+50, label_y), 27700))::geometry(linestring, 27700) AS geom
FROM points
WHERE label_x IS NOT NULL AND
label_y>ST_Y(geom) and label_x<=ST_X(geom);
Affine রূপান্তর
আর একটি সম্ভাবনা হ'ল 80% বলতে গেলে সমস্ত নেতৃস্থানীয় লাইন সংক্ষিপ্ত করা।
- আপনি জিম_ও পেতে লাইনটি উত্সের দিকে সরানোর জন্য ST_Translate (geom, -ST_X (geom), - ST_Y (geom)) ব্যবহার করতে পারেন
- জিওম_ও_সেস্কেল করতে এসT_স্কেল (জিওম_ও, 0.8,0.8) ব্যবহার করুন
- তারপরে ST_Translate (geom_o_scaled, ST_X (geom), ST_Y (geom)) ব্যবহার করে মূল অবস্থানে ফিরে যান।
এটি আরও ভাল কাজ করতে পারে, যদিও আমি এটি চেষ্টা করেছিলাম না।