Показ символів антени на карті: символи або функції точок (полігони)


12

Хочу показати на карті стільникову мережу. Вхідні дані - це .csv файл, де кожен рядок - це стільниковий сектор. Атрибути: ідентифікатор сектора, його координати, його азимут та кут ширини променя антени.

Значення ширини променя антен в діапазоні від 30 до 360 градусів. 360 ширина променя антени означає, що він повинен бути показаний на карті як коло. Антени з іншими ширинами променя повинні бути показані як сектори з відповідними кутами діафрагми.

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

Чи можливо показувати антени лише за допомогою символів? Я знаю, як створити свій власний символ SVG і сподіваюся знайти, як його обертати відповідно до азимуту. Але чи можна застосувати змінну ширину променя антени відповідно до її значення атрибута від 30 до 360 градусів?

Я думаю, що символи є найкращим способом намалювати антени через динамічну візуалізацію на карті відповідно до масштабу зору, якщо такий спосіб можливий у QGIS.

Звичайно, завдання можна вирішити, намалювавши відповідні багатокутники як особливість шару, але це було б вирішенням способу вирішення.


Тож вам потрібно намалювати дугу в правильному напрямку, який є різним для кожної ділянки?
Nathan W

Зовсім ні, якщо я правильно розумію. Він повинен бути сектором кола (або цілим колом у разі пропускання променя = 360), як показано на малюнку.
E Бобров

Так, це я маю на увазі.
Натан Ш

Добре, я бачу. Якщо говорити загалом, символ дуги не потрібен суворо. Основними атрибутами є азимут і ширина променя. Я можу використовувати будь-який символ, щоб намалювати антени не дугою.
Е Бобров

Можливо, я знайшов приклад, який може допомогти: Створення власних типів шару символів . Але я не впевнений. Тож хтось намагався створити свій власний клас шару символів, який малює, наприклад, напрямок кожного шару, залежно від його атрибуту (тобто азимут антени у словах малюнка вище)?
E Бобров

Відповіді:


7

Кілька днів тому до QGIS був доданий новий плагін під назвою Алгоритм обробки буферних клинів . Це виглядає так, ніби це може зацікавити.

Як випливає з назви, це алгоритм обробки, тому вам потрібно запустити його з панелі інструментів обробки. Ще не мав шансу спробувати це.

Він створює сектори кіл - як звичайний круговий буфер, але кут і радіус клину можна встановити за допомогою значень поля.

Документацію та скріншоти можна побачити на сторінці github


10

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


Ви шукали це рішення? Це працює?
мгрі

Ваш солютон повністю вирішить випадок, описаний у темі! Я реалізував це і зрозумів, що моя справжня справа трохи інша. Вибачте, що я винен.
Е Бобров

1) Щільність моїх секторів на карті відрізняється, тобто у випадку коротких відстаней між секторами визначена відстань у коді дасть багато секторів, що перекриваються, зміна масштабування карти не допоможе, тому це буде досить важко читати карту. Але у випадках великих відстаней між секторами показані сектори будуть дуже маленькими і, можливо, важко читати карту. Використання окремих символів не має цієї проблеми, їх масштаб змінюється масштабуванням карти.
Е Бобров

2) І є спотворення ширини променя: ширина променя 360 градусів виглядає як еліпси, сектори з різними азимутами, але однакова ширина променя не схожа на сектори з рівнозначною шириною променя. Це тому, що я використовую географічну систему координат? Тепер ви різні кути довготи / широти представляють різну відстань між точками на землі. Тому рішення потрібно було локалізувати в районах Землі, де розташовані сектори.
Е Бобров

У будь-якому разі ваше рішення та посилання на аналогічну відповідь "Створення галузевих ліхтарів у QGIS?" допомогло мені побачити якусь корисну функціональність. Ще раз дякую вам.
E Бобров

4

Великі кудо до мгрі.

У нашому тестовому шарі все працювало без проблем. У виробничому шарі через дві / три години мені вдалося віднайти проблему з $ геометрією . Експортував точковий шар з платформи, не помічав, але це був MultiPoint . Це, здавалося, спричинило проблеми: стрілка не була намальована; і як не дивно, тільки обчислені точки склали багатокутник кіл.

Інша справа, що я використовую змінний радіус . (не впевнений, що це правильне слово в цьому випадку, ви можете також назвати його «довжина променя» чи будь-що інше).

Ось що я зараз використовую з шаром типу геометрії MultiPoints (хоча насправді всі функції є єдиною точкою), і це працює для мене в QGis 2.18.3

Вираз стрілки Без стрілки, якщо 360 °.

CASE

WHEN ("BEAMWIDTH") = 360
THEN 
make_line(
 make_point($x, $y),
 make_point($x + "RADIUS"*cos(radians(90 -  "AZIMUTH" )), $y + "RADIUS"*sin(radians((90 - "AZIMUTH" ))))
)

END

Вираз багатокутника

CASE

WHEN ("BEAMWIDTH") <= 180
THEN
intersection(
  buffer(
   make_point($x,$y), "RADIUS"),
  make_polygon(
   geom_from_wkt(
    geom_to_wkt(
     make_line(
      make_point($x,$y),
      make_point($x + "RADIUS"*2*cos(radians(90 -  "AZIMUTH" - "BEAMWIDTH"/2 )), $y + "RADIUS"*2*sin(radians((90 - "AZIMUTH" - "BEAMWIDTH"/2 )))),
      make_point($x + "RADIUS"*2*cos(radians(90 -  "AZIMUTH" )), $y + "RADIUS"*2*sin(radians((90 - "AZIMUTH" )))),
      make_point($x + "RADIUS"*2*cos(radians(90 - "AZIMUTH" + "BEAMWIDTH" /2)), $y + "RADIUS"*2*sin(radians((90 - "AZIMUTH" + "BEAMWIDTH"/2)))),
      make_point($x,$y))
     )
    )
   )
  )

WHEN ("BEAMWIDTH") > 180
THEN
difference(
  buffer(
   make_point($x,$y), "RADIUS"),
   make_polygon(
    geom_from_wkt(
     geom_to_wkt(
      make_line(
       make_point($x,$y),
       make_point($x + "RADIUS"*2*cos(radians(90 -  "AZIMUTH" - "BEAMWIDTH"/2 )), $y + "RADIUS"*2*sin(radians((90 - "AZIMUTH" - "BEAMWIDTH"/2 )))),
       make_point($x - "RADIUS"*2*cos(radians(90 -  "AZIMUTH" )), $y - "RADIUS"*2*sin(radians((90 - "AZIMUTH" )))),
       make_point($x + "RADIUS"*2*cos(radians(90 - "AZIMUTH" + "BEAMWIDTH" /2)), $y + "RADIUS"*2*sin(radians((90 - "AZIMUTH" + "BEAMWIDTH"/2)))),
       make_point($x,$y))
      )
     )
    )
   )

END

У моїй відповіді запропоновано загальний підхід: оскільки у питанні було багато змінних, створити унікальну процедуру вирішення будь-якої ситуації було неможливо. Тож, дякуючи за вказівку на нього та запропонувавши підхід із функціями MultiPoint, це неодмінно допоможе комусь у майбутньому.
mgri

1

Я був обдарований частковим рішенням в Інтернеті без додаткових плагінів, просто qgis з коробки. Він не показує ширину проміння антени, просто обертайте простий маркер у потрібному напрямку: використовуйте простий маркер та обертайте його за азимутом антени + 180 градусів (властивості шару> одиночний символ-> маркер-> простий маркер-> трикутник-> обертання-> редагувати -> введіть <180 + "азимут антени"> у поле вираження. А також встановіть Top у полі точки прив’язки маркера). Використання <180 + "азимута антени"> потрібне через неправильне спрямування вбудованого простого маркера трикутника. Інакше воно покаже неправильне напрямок антени.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.