Я пытаюсь создать динамические выносные линии, используя представление PostGIS в дополнение к инструменту QGIS «Move Label».
CREATE VIEW leader_line AS
SELECT
gid,
ST_MakeLine(geom, ST_SetSRID(ST_MakePoint(xcord_label, ycord_label), SRID))::geometry(linestring, SRID) AS geom
FROM point
WHERE xcord_label IS NOT NULL;
Это прекрасно работает для всех этикеток, WHERE ST_X(geom) < xcord_label
но создает неправильно выглядящие лидерные линии для этикеток WHERE ST_X(geom) > xcord_label
.
Кто-нибудь знает, как правильно расположить лидерские линии для ярлыков WHERE ST_X(geom) > xcord_label
? Есть ли способ ссылаться на координату xmax меток?
qgis
postgis
labeling
coordinates
dynamic-layer
Лунное море
источник
источник
Ответы:
Вы можете использовать спецификатор размещения квадранта QGIS, определенный по азимуту линии, чтобы разместить метку получше. Квадрант определяет 8 позиций вокруг точки:
Вот пример вокруг Нулевого острова , создание таблицы и двух представлений.
Затем в QGIS добавьте:
points
-geom
leader_line
-geom
- первичный ключ должен бытьgid
point_labels
-geom
- первичный ключ должен бытьgid
Теперь настройте свойства слоя для
point_labels
:label
и измените размещение на «Смещение от точки», изменив «Квадрант» для использования поля атрибута.quadrant
Бинго!
Обратите внимание, что для
geography
типов требуется немного другой подход , поскольку ST_Azimuth ведет себя по-разному.Обновление: при добавлении новых точек в
points
слой,geom
поле обновляется как обычно, ноlabel_geom
это не так. Чтобы заполнить значение по умолчаниюlabel_geom
новыми точками, необходимо создать триггер . Но если используется триггерная функция,quadrant
спецификатор может быть сохранен вpoints
таблице, аpoint_labels
представление может быть проигнорировано:Например, давайте начнем снова с немного другого примера с одной таблицей и одним представлением:
Из первого примера, повторно сделать
INSERT INTO points
иCREATE OR REPLACE VIEW leader_line
заявление, поскольку они не требуют модификации. Но игнорируйтеleader_line
мнение.Затем в QGIS добавьте:
points
-geom
points
-label_geom
leader_line
-geom
- первичный ключ должен бытьgid
Теперь настройте свойства слоя для
points
сlabel_geom
как первый пример сделал дляpoint_labels
. Спецификаторquadrant
будет изменен автоматически для новых и перемещенных точек, но вы будете замечать эти изменения только каждый раз, когда сохраняете свои изменения.источник
gid | label_geom | label
иgid, geom, label
).label_geom
, а также обновляетquadrant
значение, поэтомуpoint_label
слой / представление больше не требуется.label_geom
я должен сохранить слой, отредактировать и обновить холст, чтобы увидеть фактическое положение метки. Жаль, что невозможно использовать спецификатор квадранта с инструментом QGIS «Метка перемещения».хорошо ... так как это в единицах карты, это должно быть довольно просто, в пределах ограничений. Вы уже знаете высоту этикетки. Если бы это было в пунктах, это будет зависеть от масштаба.
Это предполагает фиксированный размер метки, поэтому насколько хорошо это работает, зависит от того, насколько однородны ваши метки, и от того, используете ли вы шрифт пропорциональной или фиксированной ширины (фиксированная ширина проще - умножьте длину метки на размер метки, чтобы получить ширину метки).
К сожалению, это не ответит на ваш вопрос о том, как на самом деле найти границы метки как предоставленные .
у вас есть 4 случая (NE, NW, SE, SW).
я предполагаю, что ваша таблица выглядит следующим образом (извинения, некоторые имена полей отличаются)
Затем добавьте 4 балла (все идентичные), но с метками в 4 квадрантах, чтобы представить 4 основных варианта использования
Я использовал CRS 27700 (0,0 слева внизу, единицы измерения карты в м). Я принял ширину метки 50, высоту 30 единиц карты.
Аффинные преобразования
Другая возможность - сократить все лидирующие позиции, скажем, на 80%.
Это может работать лучше, хотя я не пробовал.
источник