У меня есть слой линий и слой многоугольников в QGIS:
Я хотел бы стилизовать часть слоя линии вне многоугольника, используя один стиль, а часть внутри, используя другой стиль:
Я не хочу создавать производный набор данных, напр. обрезать слой линии и стиль две части.
Это простой случай, но в моем проекте QGIS у меня есть +30 слоев, поэтому я думаю, что любое смешение слоев нарушит нижележащие слои.
Можно ли сделать что-то подобное?
Я не хочу показывать слой многоугольника, это просто здесь, чтобы визуализировать то, что я хотел бы сделать.
Ответы:
Не идеальное решение, но вы можете использовать Генератор геометрии, который добавляет визуализированную линию для представления пересечения. Затем вы можете установить это, чтобы перекрывать исходный линейный объект.
Добавьте новый слой символов, щелкнув знак плюс, и выберите
Geometry generator
тип слоя символов. Задайте для типа geoemtry значениеLineString / MultiLineString
и используйте следующее выражение:Вам нужно будет добавить информацию о вашем конкретном полигоне, где:
polygonLayer
имя вашего полигонального слояfieldName
это имя поляvalue
значение функции вашего конкретного многоугольникаОбратите внимание, что для окрашивания визуальной линии вам может потребоваться сделать это из свойства « Рисовать эффекты» :
Это был результат (обратите внимание, что визуальная линия не полностью перекрывала исходную линию, поэтому я слегка изменил смещение):
И без многоугольника
Редактировать:
Если вы хотите, чтобы это применялось к каждому линейному объекту, пересекающему полигональный объект, перейдите в Редактор функций и используйте следующую функцию (измените имя,
polygon example_2
чтобы оно соответствовало имени вашего полигонального слоя):Нажмите « Загрузить», затем перейдите на вкладку « Выражение » и введите
func()
. Надеемся, что результат должен выглядеть следующим образом (используя те же свойства стиля, которые указаны выше):источник
get_feature
требует имя поля и значение. У меня просто есть слой многоугольника, и я хотел бы использовать все элементы этого слоя для маскировки. Это возможно?Geometry Generator
вызывается ли методfunc
для каждого элемента на слое, где он используется для стилизации? Так что, если мой линейный слой имеет 3 объекта, то онfunc
вызывается 3 раза, а результат получается 3 раза?func
теперь его следует вызывать только для каждого линейного объекта и выводить результат только один раз (что, как показано на рисунке маркерами вершин внутри многоугольников, было скрыто под тем, что я пропустил). Спасибо за указание на это :)Продолжая ответ Джозефа , я придумал эту функцию. Он учитывает разные системы координат, и мне нужно было перейти к двум маскирующим слоям, поэтому он тоже справляется с этим. Более того, я хотел иметь возможность маскировать линии внутри полигонов или линии вне полигонов.
Это упражнение показало мне, что QGIS не слишком любит работать с большими наборами данных, и этот алгоритм с QGIS часто ломается у меня на пути. Я подозреваю, что рендерер QGIS не любит рендерить Geometry Generators, которые отнимают много времени.
источник