Если вы хотите использовать только символы, я предлагаю решение, основанное на ответе на аналогичный вопрос: Создание секторных источников света в QGIS? ,
Следуя аналогичному подходу и предполагая, что вы работаете с Projected CRS (вместо этого, если вы используете географическую систему координат, см. Примечание в конце ответа), я хочу подчеркнуть, что я сосредоточу внимание на объяснении. из минимальных действий, которые необходимо выполнить для воспроизведения желаемого результата: это означает, что некоторые другие второстепенные параметры (такие как размеры, ширина и т. д.) должны быть легко настроены вами для лучшего соответствия вашим потребностям.
Кроме того, я предполагаю, что "AZIMUTH"
это поле, в котором хранятся значения азимута, и "BEAMWIDTH"
поле, в котором хранятся ширины луча антенны.
Решение
Мы будем отображать точки с помощью a Single symbol
и возвращаясь к одному Simple Marker
и двум Geometry generator
слоям символов:
В дальнейшем объяснении я буду следовать тому же порядку символов на изображении выше.
1) Простой маркер
Я выбрал по умолчанию символ красного круга (это самая простая часть этого урока), размер которого составляет 3 мм, а ширина - 0,4 мм.
2) Генератор геометрии № 1
Добавьте новый слой символов и выберите Geometry generator
и те LineString / MultiLineString
тип:
Вставьте это выражение в Expression
поле:
make_line(
$geometry,
make_point($x + 300*cos(radians(90 - "AZIMUTH" )), $y + 300*sin(radians((90 - "AZIMUTH" ))))
)
Мы только что определили стрелку, которая указывает на набор азимута (для создания стрелки не забудьте выбрать Arrow
тип слоя символов под Line
опцией в главном меню символов). Обратите внимание, что 300
это расстояние в метрах и это произвольное значение, поэтому не стесняйтесь изменять его в соответствии с вашими потребностями.
3) Генератор геометрии № 2
Добавьте новый слой символов и выберите Geometry generator
тип и Polygon / MultiPolygon
типы:
Вставьте это выражение в Expression
поле:
CASE
WHEN ("BEAMWIDTH") <= 180
THEN
intersection(
buffer(
$geometry, 200),
make_polygon(
geom_from_wkt(
geom_to_wkt(
make_line(
$geometry,
make_point($x + 2000*cos(radians(90 - "AZIMUTH" - "BEAMWIDTH"/2 )), $y + 2000*sin(radians((90 - "AZIMUTH" - "BEAMWIDTH"/2 )))),
make_point($x + 2000*cos(radians(90 - "AZIMUTH" )), $y + 2000*sin(radians((90 - "AZIMUTH" )))),
make_point($x + 2000*cos(radians(90 - "AZIMUTH" + "BEAMWIDTH" /2)), $y + 2000*sin(radians((90 - "AZIMUTH" + "BEAMWIDTH"/2)))),
$geometry)
)
)
)
)
WHEN ("BEAMWIDTH") > 180
THEN
difference(
buffer(
$geometry, 200),
make_polygon(
geom_from_wkt(
geom_to_wkt(
make_line(
$geometry,
make_point($x + 2000*cos(radians(90 - "AZIMUTH" - "BEAMWIDTH"/2 )), $y + 2000*sin(radians((90 - "AZIMUTH" - "BEAMWIDTH"/2 )))),
make_point($x - 2000*cos(radians(90 - "AZIMUTH" )), $y - 2000*sin(radians((90 - "AZIMUTH" )))),
make_point($x + 2000*cos(radians(90 - "AZIMUTH" + "BEAMWIDTH" /2)), $y + 2000*sin(radians((90 - "AZIMUTH" + "BEAMWIDTH"/2)))),
$geometry)
)
)
)
)
END
Мы только что определили сектор. Обратите внимание, что 200
и 2000
представляют расстояния в метрах, и они являются произвольными значениями, потому что я пытаюсь создать многоугольник, который будет пересекаться с окружностью радиусом 200 м, поэтому смело меняйте их в соответствии с вашими потребностями.
Конечный результат
Если вы правильно выполняете предыдущие задачи, вы сможете получить результаты, подобные этим (метки добавляются отдельно от этого решения, и они должны только лучше объяснять контекст):
Запись
Если вы используете географическую систему координат , то есть если вы имеете дело с градусами, а не с расстояниями, этого должно быть достаточно, используя правильные значения, когда я использовал расстояние в предыдущих формулах. Расстояния, которые я использовал:
- 300 м (см. Генератор геометрии № 1);
- 200 м (см. Генератор геометрии № 2);
- 2000 м (см. Генератор геометрии № 2);
поэтому вы можете заменить его другими произвольными значениями, выраженными в градусах (например 0.0002
, 0.002
и т. д.).
бонус
Я прикрепил стиль здесь : вы можете открыть этот код в любом текстовом редакторе и сохранить его как файл стиля слоя QGIS (т.е. с .qml
расширением).
Приведенный выше стиль был создан с использованием QGIS 2.18.4 (он должен иметь то же имя используемого вами шейп- файла ).