โอเค .. เนื่องจากอยู่ในหน่วยแผนที่จึงควรตรงไปตรงมาภายในข้อ จำกัด คุณทราบความสูงของฉลากแล้ว ถ้ามันอยู่ในจุดมันจะขึ้นอยู่กับขนาด
วิธีนี้จะใช้ขนาดป้ายผนึกที่คงที่ดังนั้นขนาดของฉลากจึงเป็นไปได้ดีเพียงใดและขึ้นอยู่กับว่าคุณใช้แบบอักษรที่มีสัดส่วนหรือความกว้างคงที่หรือไม่ รับความกว้างของฉลาก)
น่าเศร้าที่นี่ไม่ได้ตอบคำถามของคุณว่าจะหาขอบเขตของฉลากได้อย่างไร
คุณมี 4 ราย (NE, NW, SE, SW)
ฉันถือว่าตารางของคุณมีลักษณะเช่นนี้ (ขออภัยชื่อฟิลด์บางชื่อแตกต่างกัน)
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 Quadrants เพื่อเป็นตัวแทนของเคสหลักที่ใช้
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
- ใช้ ST_Scale (geom_o, 0.8,0.8) เพื่อรับ geom_o_scaled
- จากนั้นทำการแปลใหม่โดยใช้ ST_Translate (geom_o_scaled, ST_X (geom), ST_Y (geom)) กลับไปที่ตำแหน่งเดิม
สิ่งนี้อาจทำงานได้ดีขึ้นแม้ว่าฉันจะไม่ได้ลอง