Избегать функций маркировки, если они перекрываются другим слоем в QGIS?

16

С QGIS 2.12.2, как я могу настроить маркировку слоя, чтобы избежать размещения меток там, где объекты из другого слоя уже существуют?

Например, если у меня есть слой полилинии потока / реки, который содержит «центральные линии» озера, и я размещаю слой многоугольника «озеро» над ним в порядке рисования, я не хочу, чтобы слой реки размещал метку внутри озера. , Вместо этого я бы предпочел, чтобы река была помечена за пределами озера (по мере необходимости). Таким образом, я могу размещать метки из слоя озер и не сталкиваться с коллизиями меток.

Вот пример, где (я намеренно поместил линии сверху для визуальных целей), чего я надеюсь достичь, это отсутствие меток центральной линии реки, показанных внутри многоугольника озера: Линии разметки внутри полигона

RyanKDalton
источник
4
Как ваши данные хранятся и обслуживаются? Работая с PostGIS, я испытал бы желание определить мои реки с видом, где части рек, пересекающих озера, полностью обрезаны. Хорошая автоматизированная маркировка - сложная задача, а геометрия - меньше.
alphabetasoup
Это были шейп-файлы, но ваша идея перейти на PostGIS и решить проблемы с данными на лету - действительно хорошая идея. Я бы посоветовал вам переместить ваш комментарий в ответ, поскольку я мог бы привести достаточно веские доводы в пользу того, что это хорошее решение.
RyanKDalton

Ответы:

9

Автоматическая маркировка - действительно сложная проблема, но геометрия объектов не так уж и плоха.

Даже если вы в большинстве случаев можете заставить работать должным образом, возможны исключения. Некоторые из них вы заметите и, возможно, сможете решить. Другие вы не заметите, когда создаете большую карту или набор плиток, потому что вы не можете пролить каждый дюйм вашей карты в различных масштабах. Почти всегда у вас будет желание переместить некоторые автоматически размещенные метки вручную с картографической точки зрения.

Как я предложил в своем комментарии, я бы облегчил задачу для механизма маркировки. В этом случае я бы сделал это, определив мои реки как табличное представление *, с геометрией реки, обрезанной с учетом границ озера. Таким образом, в озерах нет речных объектов, которые будут помечены, и нет столкновений.

* Я предполагаю использование здесь СУБД, такой как PostgreSQL / PostGIS, для удобства и возможности обновлять только ваш авторитетный источник данных и получать представление самостоятельно без вашего вмешательства. Но вы также можете заранее поработать со статическими файлами, чтобы обрезать и удалить объекты, но я не рекомендую это делать, если вы когда-нибудь планируете вернуться к карте.

Пример:

Начиная с двух шейп-файлов (может быть таблиц базы данных) рек и озер, когда реки пересекают озера и вызывают проблемы с маркировкой, которые трудно решить полностью и уверенно:

введите описание изображения здесь

Добавьте их в Postgres, если вам нужно с shp2pgsql :

shp2pgsql -s 4326 /data/lake public.lakes | psql -d mydb

shp2pgsql -s 4326 /data/river public.rivers | psql -d mydb

Затем определите представление с помощью ST_Difference :

CREATE OR REPLACE VIEW rivers_clipped AS
SELECT r.id, ST_Difference(r.geom, l.geom) AS geom, r.name
FROM public.rivers AS r, public.lakes AS l;

Добавьте вид к вашему макету:

введите описание изображения здесь

Хотя проблема в моем примере специально сфабрикована, стили в двух слоях реки (исходный и вид) одинаковы, и они расположены на вершине озера в порядке рисования. Когда вы обновляете геометрию озер или рек, вам не нужно будет делать гораздо больше, чем обновлять рендеринг.

введите описание изображения здесь

alphabetasoup
источник
2
Хотя я не работал непосредственно со слоем БД, это решение имело для меня наибольшее значение, поскольку не требовало редактирования геометрии исходных источников данных (кроме загрузки их в БД). Это отличный пример нестандартного подхода к формированию шейп-файлов и ограничений приложений и поиску творческого решения проблемы путем объединения логики приложения и БД.
RyanKDalton
13

В QGIS> = 2.12 вы можете установить слой многоугольника «озеро» в качестве препятствия для метки. Это делается через свойства слоя «lake» в разделе «Метки». Измените поле со списком в верхней части с « Без меток » на «Не позволяйте другим меткам закрывать объекты в этом слое ».

ndawson
источник
1
Благодарю. Я искал что-то подобное и раньше не замечал этот вариант выпадающего меню. Тем не менее, я бы сказал, что это был только умеренно успешным. 1) Это только «своего рода» обескураживающие надписи из слоя River (они все еще появляются внутри озера, но менее), и 2) теперь у меня нет моих надписей названий Lake :( Я также попытался установить метки рек> Препятствия «Препятствовать тому, чтобы метки не покрывали объекты» (безуспешно) и задать весовые коэффициенты «Низкий и высокий» (безуспешно), а также установить «Размещение»> «Приоритет = Низкий и высокий» (без успеха).
RyanKDalton
Ах, может быть, я неправильно понял. Если у вас есть надписи на слое озера, убедитесь, что на вкладке рендеринга установлен флажок «не использовать надписи от элементов покрытия». Возможно, вам придется поиграть с ползунком «вес» и другими параметрами в этой группе, чтобы получить желаемые результаты.
ndawson
1
Нет, ты определенно был на правильном пути. Я поиграл с весами (большой вес на многоугольниках озера + «минимизировать размещение меток над внутренними элементами, малый вес на реках) и приблизился, но так и не добрался до того момента, когда метки реки не были на озере. Проблема кажется, связано с линиями, которые находятся как внутри, так и снаружи многоугольника
RyanKDalton
4
почему вы не удаляете (или не разбиваете) эти строки, когда речь идет о маркировке? Они все равно не пригодны для вашей карты.
Radouxju
4

Я нахожу маркировку в целом довольно сложной, по крайней мере, для создания меток, которые удовлетворяют чувства моего картографа. Хотя функция автоматической маркировки работает нормально в 80% случаев, в некоторых случаях, таких как проблема с маркировкой реки / озера, не возникает хорошая маркировка. Автоматическая маркировка часто связана с геометрией элемента, например, сколько деталей находится в одной линии, так что сначала все детали маркируются. Конечно, в QGIS есть средства для предотвращения повторной маркировки, что также зависит от масштаба текущего вида карты.

Ну, в любом случае, мой совет не быстрое решение. Я часто создаю специализированный слой только для надписей, чтобы мои надписи легче контролировать. И часто геометрия элементов для картографического представления может столкнуться с хорошей геометрией для маркировки. Поэтому я бы предложил создать новый слой, где потоки не пересекают озера, чтобы вы могли обойти проблему в целом. Наличие дополнительного слоя надписи также может помочь предотвратить проблемы, когда направление надписи не соответствует предполагаемому, поскольку оно связано с тем, как была создана геометрия.

Ну, я боюсь, что мой совет не соответствует вашим ожиданиям, но я надеюсь, что мой альтернативный подход поможет вам как-то.

Фрэнк
источник
Вы делаете правильное замечание, что я мог бы создать новый набор данных (что было бы легко сделать в этом случае ... просто стереть линейные объекты под полигонами), удвоение наборов данных не кажется слишком привлекательным или управляемым, если вы не используете метод, управляемый базой данных, такой как @Richard Law.
RyanKDalton
Я понимаю вашу точку зрения и понимаю вашу нерешительность, чтобы создать подобный набор данных дважды. По моему опыту слой надписей часто отличается от исходного слоя данных. Например, чтобы придерживаться своего примера реки, вы можете захотеть изменить геометрию реки, чтобы объединить или разделить части объектов, чтобы создать более приятную маркировку, которая повторяется более регулярно. По крайней мере, это часто имеет место для меня, например, когда дело касается дорог OSM, которые иногда совершенно произвольно организованы.
Фрэнк
3

есть плагин под названием « Маска », который можно использовать для фильтрации меток на основе полигонов.

Однако, как упоминалось в моем предыдущем комментарии, было бы намного проще, если бы вы могли разделить свои линии на пересечении с озерами (см. Различные методы здесь ). Затем вы можете определить метку нулевого размера для сегментов, которые находятся внутри озер («Слой»> «Маркировка»> «Определенные данные настройки»> «Размер», затем выберите столбец, в котором вы храните размер метки). Разделение сохраняет большинство свойств вашей речной сети и является обратимым при растворении, поэтому вы можете продолжить работу с одним слоем (при необходимости сохраните общую длину в определенной таблице атрибутов).

radouxju
источник
Спасибо, плагин звучит многообещающе, поэтому я попробую.
RyanKDalton