Hiển thị biểu tượng ăng-ten trên bản đồ: biểu tượng điểm hoặc tính năng (đa giác)


12

Tôi muốn hiển thị một mạng di động trên bản đồ. Dữ liệu đầu vào là một tệp .csv trong đó mỗi chuỗi là một vùng di động. Các thuộc tính là: sector id, tọa độ của nó, góc phương vị và góc của độ rộng chùm ăng ten.

Giá trị độ rộng chùm ăng-ten nằm trong phạm vi từ 30 đến 360 độ. Độ rộng chùm ăng-ten 360 có nghĩa là nó phải được hiển thị trên bản đồ dưới dạng hình tròn. Ăng-ten với độ rộng chùm khác phải được hiển thị dưới dạng các cung có góc khẩu độ thích hợp.

nhập mô tả hình ảnh ở đây

Có thể chỉ hiển thị các ăng-ten chỉ sử dụng các biểu tượng? Tôi biết cách tạo biểu tượng SVG của riêng mình và hy vọng tìm ra cách xoay nó theo góc phương vị. Nhưng có cách nào để áp dụng độ rộng chùm ăng ten thay đổi theo giá trị thuộc tính của nó từ 30 đến 360 độ không?

Tôi nghĩ rằng các biểu tượng là cách tốt nhất để vẽ ăng-ten vì hình ảnh động trên bản đồ theo tỷ lệ khung nhìn, nếu cách này có thể thực hiện được trong QGIS.

Tất nhiên, nhiệm vụ có thể được giải quyết bằng cách vẽ các đa giác thích hợp làm tính năng lớp, nhưng đó sẽ là một giải pháp khắc phục.


Vì vậy, bạn cần phải vẽ vòng cung theo đúng hướng khác nhau cho mỗi trang web?
Nathan W

Không có gì nếu tôi hiểu đúng. Nó phải là một khu vực của vòng tròn (hoặc toàn bộ vòng tròn trong trường hợp chùm tia = 360) như được hiển thị trong hình.
E Bobrov

Vâng, đó là những gì tôi có ý nghĩa.
Nathan W

Ok, tôi hiểu rồi. Nói chung, biểu tượng vòng cung là không cần thiết nghiêm ngặt. Các thuộc tính chính là góc phương vị và độ rộng chùm. Tôi có thể sử dụng bất kỳ biểu tượng nào để vẽ ăng-ten chứ không phải chỉ một vòng cung.
E Bobrov

Có lẽ tôi đã tìm thấy ví dụ có thể giúp: Tạo các loại lớp biểu tượng tùy chỉnh . Nhưng tôi không chắc. Vì vậy, có ai đã cố gắng tạo lớp lớp biểu tượng của riêng bạn, ví dụ như mỗi hướng tính năng của lớp tùy thuộc vào thuộc tính của nó (tức là góc phương vị ăng-ten trong các từ của hình trên)?
E Bobrov

Câu trả lời:


7

Vài ngày trước, một plugin mới đã được thêm vào QGIS có tên là Thuật toán xử lý bộ đệm Wedge . Điều này có vẻ như nó có thể được quan tâm.

Như tên cho thấy nó là một thuật toán xử lý, vì vậy bạn sẽ cần chạy nó từ hộp công cụ xử lý. Không có cơ hội để thử nó mặc dù.

Nó tạo ra các cung của các vòng tròn - giống như một bộ đệm tròn bình thường, nhưng góc và bán kính nêm có thể được đặt bằng các giá trị trường.

Tài liệu và ảnh chụp màn hình có thể được nhìn thấy trên trang github


10

Nếu bạn chỉ muốn sử dụng hệ thống ký hiệu, tôi đề xuất một giải pháp lấy cảm hứng từ câu trả lời của tôi từ một câu hỏi tương tự: Tạo đèn chiếu sáng trong QGIS? .


Theo một cách tiếp cận tương tự và giả sử bạn đang làm việc với CRS được chiếu (thay vào đó, nếu bạn đang sử dụng Hệ thống tọa độ địa lý, hãy xem ghi chú ở cuối câu trả lời), tôi muốn nhấn mạnh rằng tôi sẽ tập trung chú ý vào phần giải thích về những điều tối thiểu cần làm để tái tạo kết quả mong muốn: điều này có nghĩa là một số thông số nhỏ khác (như kích thước, chiều rộng, v.v.) nên được bạn dễ dàng điều chỉnh để phù hợp hơn với nhu cầu của bạn.

Hơn nữa, tôi giả sử đó "AZIMUTH"là trường lưu trữ các giá trị góc phương vị và "BEAMWIDTH"là trường lưu trữ độ rộng của chùm ăng ten.

Giải pháp

Chúng tôi sẽ kết xuất các điểm bằng một Single symbolvà bằng cách lặp lại thành một Simple Markervà hai Geometry generatorlớp biểu tượng:

nhập mô tả hình ảnh ở đây

Trong phần giải thích thêm, tôi sẽ làm theo thứ tự tương tự của các biểu tượng trong hình trên.

1) Điểm đánh dấu đơn giản

Tôi đã chọn một biểu tượng mặc định của một vòng tròn màu đỏ (đây là phần dễ dàng hơn trong hướng dẫn này), có kích thước 3 mm và chiều rộng 0,4 mm.

2) Máy phát điện hình học số 1

Thêm một lớp biểu tượng mới và chọn Geometry generatorvà các LineString / MultiLineStringloại:

nhập mô tả hình ảnh ở đây

Chèn biểu thức này vào Expressiontrường:

make_line(
 $geometry,
 make_point($x + 300*cos(radians(90 -  "AZIMUTH" )), $y + 300*sin(radians((90 - "AZIMUTH" ))))
)

Chúng ta vừa xác định mũi tên chỉ vào bộ góc phương vị (để tạo mũi tên, hãy nhớ chọn Arrowloại lớp biểu tượng trong Linetùy chọn từ Menu biểu tượng chính). Xin lưu ý rằng 300khoảng cách tính bằng mét và đó là một giá trị tùy ý, vì vậy hãy thoải mái thay đổi nó theo nhu cầu của bạn.

3) Máy phát điện hình học số 2

Thêm một lớp biểu tượng mới và chọn Geometry generatorloại và các Polygon / MultiPolygonloại:

nhập mô tả hình ảnh ở đây

Chèn biểu thức này vào Expressiontrường:

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

Chúng tôi vừa xác định ngành. Xin lưu ý rằng 2002000biểu thị khoảng cách tính bằng mét và chúng là các giá trị tùy ý vì tôi đang cố gắng tạo một đa giác để giao với vòng tròn có bán kính 200 m, vì vậy hãy thoải mái thay đổi chúng theo nhu cầu của bạn.

Kết quả cuối cùng

Nếu bạn thực hiện chính xác các tác vụ trước đó, bạn sẽ có thể nhận được kết quả như những tác vụ này (các nhãn được thêm vào ngoài giải pháp này và chúng chỉ nên giải thích rõ hơn về ngữ cảnh):

nhập mô tả hình ảnh ở đây

Ghi chú

Nếu bạn đang sử dụng Hệ thống tọa độ địa lý , nghĩa là nếu bạn đang xử lý độ và không phải khoảng cách, thì nên sử dụng các giá trị phù hợp khi tôi sử dụng khoảng cách trong các công thức trước đó là đủ. Khoảng cách tôi đã sử dụng là:

  • 300 m (xem Máy phát hình học số 1);
  • 200 m (xem Máy phát hình học số 2);
  • 2000 m (xem Máy phát hình học số 2);

vì vậy bạn có thể thay thế nó với các giá trị tùy ý khác được thể hiện độ (ví dụ 0.0002, 0.002và vân vân).

Tặng kem

Tôi đã đính kèm kiểu ở đây : bạn có thể mở mã này bằng bất kỳ trình soạn thảo văn bản nào và lưu nó dưới dạng tệp Kiểu lớp của QGIS (nghĩa là có .qmlphần mở rộng).

Kiểu trên được tạo bằng cách sử dụng QGIS 2.18.4 (nó phải có cùng tên của shapefile bạn đang sử dụng).


Bạn đang tìm kiếm giải pháp này? Nó có hoạt động không?
mgri

Soluton của bạn hoàn toàn giải quyết các trường hợp được mô tả trong chủ đề! Tôi đã thực hiện nó và hiểu rằng trường hợp thực tế của riêng tôi là hơi khác nhau. Xin lỗi đó là lỗi của tôi.
E Bobrov

1. để đọc bản đồ. Nhưng trong trường hợp khoảng cách xa giữa các ngành cho thấy các ngành sẽ rất nhỏ và có thể khó đọc bản đồ. Sử dụng các ký hiệu đơn lẻ không có vấn đề đó, tỷ lệ của chúng thay đổi theo tỷ lệ thu phóng bản đồ.
E Bobrov

2. Có phải vì tôi đang sử dụng Hệ thống tọa độ địa lý? Bây giờ, các góc độ kinh độ / vĩ độ khác nhau biểu thị khoảng cách khác nhau giữa các điểm trên trái đất. Vì vậy, giải pháp cần thiết được định vị vào các khu vực Trái đất nơi có các khu vực.
E Bobrov

Dù sao, giải pháp của bạn và tài liệu tham khảo cho câu trả lời tương tự "Tạo đèn khu vực trong QGIS?" đã giúp tôi thấy một số chức năng hữu ích. Cám ơn bạn một lần nữa.
E Bobrov

4

Kudos lớn để mgri.

Trong lớp thử nghiệm của chúng tôi, mọi thứ hoạt động trơn tru. Trong một lớp sản xuất, sau hai hoặc ba giờ, tôi quản lý để theo dõi một vấn đề với $ hình học . Đã xuất một lớp điểm từ một nền tảng, đã không chú ý, nhưng đó là MultiPoint . Điều này dường như gây ra vấn đề: mũi tên không được rút ra; và thật kỳ lạ chỉ có các điểm được tính làm cho đa giác của các vòng tròn.

Một điều nữa là tôi đang sử dụng bán kính thay đổi . (không chắc đó có phải là từ đúng trong trường hợp này hay không, bạn cũng có thể đặt tên cho nó là 'độ dài chùm' hoặc bất cứ thứ gì).

Đây là những gì tôi đang sử dụng, với lớp loại hình học MultiPoints (trong khi thực tế tất cả các tính năng là một điểm duy nhất) và nó hoạt động với tôi trong QGis 2.18.3

Biểu hiện mũi tên Không có mũi tên nếu 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

Biểu thức đa giác

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

Câu trả lời của tôi đề xuất một cách tiếp cận chung: vì có rất nhiều biến số liên quan đến vấn đề, nên việc tạo ra một quy trình duy nhất để giải quyết mọi tình huống là điều không thể. Vì vậy, cảm ơn bạn đã chỉ ra nó và đề xuất một cách tiếp cận với các tính năng MultiPoint, nó chắc chắn sẽ giúp được ai đó trong tương lai.
mgri

1

Tôi đã có năng khiếu với một phần giải pháp trong trang web mà không cần bất kỳ bổ sung nào, chỉ cần qgis ra khỏi hộp. Nó không hiển thị băng thông ăng-ten, chỉ xoay điểm đánh dấu đơn giản theo đúng hướng: sử dụng điểm đánh dấu đơn giản và xoay nó với góc phương vị ăng-ten + 180 độ (Thuộc tính lớp> Simbol đơn-> Điểm đánh dấu-> Dấu tam giác-> xoay-> chỉnh sửa -> gõ <180 + "góc phương vị anten"> trong trường biểu thức. Và cũng đặt Top trong trường Điểm neo của điểm đánh dấu). Sử dụng <180 + "góc phương vị anten"> là cần thiết vì hướng không phù hợp của điểm đánh dấu tam giác đơn giản được nhúng. Nếu không nó sẽ hiển thị hướng ăng ten sai.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.