Якщо ви хочете використовувати лише символіку, я пропоную рішення, натхнене моєю відповіддю з подібного питання: Створення галузевих ліхтарів у QGIS? .
Дотримуючись аналогічного підходу та припускаючи, що ви працюєте над проектованою системою обліку даних (замість цього, якщо ви використовуєте географічну систему координат, див. Примітку в кінці відповіді), я хочу підкреслити, що я сфокусую увагу на поясненні мінімальних речей для відтворення бажаного результату: це означає, що деякі інші незначні параметри (наприклад, розміри, ширина тощо) повинні бути легко відрегульовані вами для кращого задоволення ваших потреб.
Крім того, я припускаю, що "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 (він повинен мати те саме ім'я форми форми, який ви використовуєте).