ठीक है .. जैसा कि मानचित्र इकाइयों में है, यह सीमाओं के भीतर काफी सीधा-आगे होना चाहिए। आप पहले से ही लेबल की ऊंचाई जानते हैं। अगर यह अंक में होता तो यह पैमाना निर्भर होता।
यह एक निश्चित लेबल आकार मानता है, इसलिए यह कितना अच्छा काम करता है यह इस बात पर निर्भर करता है कि आपके लेबल कितने समान हैं, और आप आनुपातिक या निश्चित-चौड़ाई वाले फ़ॉन्ट का उपयोग करते हैं या नहीं (निश्चित चौड़ाई आसान है - लेबल आकार द्वारा लेबल की लंबाई गुणा करें लेबल चौड़ाई प्राप्त करें)।
अफसोस की बात है कि यह आपके सवाल का जवाब नहीं देता है कि वास्तव में लेबल की सीमाओं को कैसे प्रदान किया जाए ।
आपके पास 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')
मैंने CRS 27700 (लो-लेफ्ट में 0,0, मैप यूनिट्स में m) का उपयोग किया है। मैंने एक लेबल चौड़ाई 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);
ट्रान्सफ़ॉर्मेशन ट्रांसफ़ॉर्मेशन
एक और संभावना 80% कहने के लिए सभी प्रमुख लाइनों को छोटा करना है।
- आप लाइन को स्थानांतरित करने के लिए ST_Translate (geom, -ST_X (geom), - ST_Y (geom) का उपयोग कर सकते हैं ताकि geom_o प्राप्त कर सकें
- geom_o_scaled प्राप्त करने के लिए ST_Scale (geom_o, 0.8,0.8) का उपयोग करें
- उसके बाद मूल स्थिति में वापस ST_Translate (geom_o_scaled, ST_X (geom), ST_Y (geom)) का उपयोग करके पुन: प्रारंभ करें।
यह बेहतर काम कर सकता है, हालांकि मैंने इसकी कोशिश नहीं की है।