알겠습니다 ..지도 단위에 있기 때문에 제한이 없어도 매우 간단합니다. 이미 라벨의 높이를 알고 있습니다. 그것이 포인트에 있다면 규모에 따라 다릅니다.
이것은 고정 된 레이블 크기를 가정하므로 레이블의 균일 성 및 비례 또는 고정 너비 글꼴 사용 여부에 따라 달라집니다 (고정 너비가 더 쉽습니다)-레이블 길이에 레이블 길이를 곱하십시오. 라벨 너비를 얻습니다).
슬프게도 이것은 실제로 렌더링 된 레이블의 경계를 찾는 방법에 대한 귀하의 질문에 대답하지 않습니다 .
네 경우가 있습니다 (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 포인트 (모두 동일)를 추가하여 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, 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))을 사용하여 원래 위치로 다시 번역하십시오.
시도하지는 않았지만 더 잘 작동 할 수 있습니다.