Jeśli chcesz używać tylko symboliki, proponuję rozwiązanie inspirowane moją odpowiedzią z podobnego pytania: Tworzenie świateł sektorowych w QGIS? .
Zgodnie z podobnym podejściem i zakładając, że pracujesz nad Projekowanym CRS (zamiast tego, jeśli używasz Geograficznego Układu Współrzędnych, zobacz notatkę na końcu odpowiedzi), chcę podkreślić, że skupię uwagę na wyjaśnieniu minimalnych czynności, które należy wykonać, aby odtworzyć pożądany wynik: oznacza to, że niektóre inne drobne parametry (takie jak rozmiary, szerokości itp.) powinny być łatwo regulowane przez użytkownika w celu lepszego dopasowania do potrzeb.
Ponadto zakładam, że "AZIMUTH"
jest to pole przechowujące wartości azymutu i "BEAMWIDTH"
pole przechowujące szerokości wiązki anteny.
Rozwiązanie
Wyrenderujemy punkty za pomocą Single symbol
i, powtarzając się do jednej Simple Marker
i dwóch Geometry generator
warstw symboli:
W dalszym objaśnieniu zastosuję tę samą kolejność symboli na powyższym obrazku.
1) Prosty znacznik
Wybrałem domyślny symbol czerwonego koła (jest to łatwiejsza część tego samouczka) o rozmiarze 3 mm i szerokości 0,4 mm.
2) Generator geometrii nr 1
Dodaj nową warstwę symboli i wybierz Geometry generator
oraz LineString / MultiLineString
typy:
Wstaw to wyrażenie w Expression
pole:
make_line(
$geometry,
make_point($x + 300*cos(radians(90 - "AZIMUTH" )), $y + 300*sin(radians((90 - "AZIMUTH" ))))
)
Właśnie zdefiniowaliśmy strzałkę wskazującą na zestaw azymutu (przy tworzeniu strzałki pamiętaj, aby wybrać Arrow
typ warstwy symbolu pod Line
opcją z głównego menu symboli). Pamiętaj, że 300
reprezentuje odległość w metrach i jest to dowolna wartość, więc możesz ją zmienić w zależności od potrzeb.
3) Generator geometrii nr 2
Dodaj nową warstwę symboli i wybierz Geometry generator
typ oraz Polygon / MultiPolygon
typy:
Wstaw to wyrażenie w Expression
pole:
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
Właśnie zdefiniowaliśmy sektor. Należy pamiętać, że 200
i 2000
reprezentują odległości w metrach i są arbitralne wartości, ponieważ staram się stworzyć wielokąt do przecięcia z okręgu o promieniu 200 m, więc nie krępuj się je zmieniać w zależności od potrzeb.
Ostateczny wynik
Jeśli poprawnie wykonasz poprzednie zadania, powinieneś być w stanie uzyskać wyniki takie jak te (etykiety są dodawane oprócz tego rozwiązania i powinny one tylko lepiej wyjaśniać kontekst):
Uwaga
Jeśli używasz Geograficznego Układu Współrzędnych , tj. Jeśli masz do czynienia ze stopniami, a nie odległościami, powinno wystarczyć użycie odpowiednich wartości, gdy użyłem odległości w poprzednich formułach. Odległości, które zastosowałem to:
- 300 m (patrz generator geometrii nr 1);
- 200 m (patrz generator geometrii nr 2);
- 2000 m (patrz Geometry Generator nr 2);
więc można zastąpić go innym arbitralnych wartości wyrażone w stopniach (na przykład 0.0002
, 0.002
i tak dalej).
Premia
Tutaj załączyłem styl : możesz otworzyć ten kod w dowolnym edytorze tekstu i zapisać go jako plik stylu warstwy QGIS (tj. Z .qml
rozszerzeniem).
Powyższy styl został utworzony za pomocą QGIS 2.18.4 (musi mieć tę samą nazwę, z której korzystasz).