EDIT Tôi đã chỉnh sửa câu trả lời để quản lý các tình huống cụ thể (do các giá trị góc cụ thể) và không hiển thị các đường chấm chấm khi xác định góc tròn.
Tôi đề xuất một giải pháp bằng cách chỉ định kỳ về ký hiệu và ghi nhãn dựa trên quy tắc.
Trước khi bắt đầu, 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 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 điều chỉnh dễ dàng bởi bạn để phù hợp hơn với nhu cầu của bạn.
Hơn nữa, giải pháp này chỉ hoạt động nếu bạn cho rằng 0
mức độ là Bắc thay vì Nam (thay vào đó 0
là Nam, thay vào đó, nó sẽ đủ để tổng 180
giá trị mỗi khi xuất hiện '90' trong các công thức xử lý các góc, ví dụ như cos(radians(90))
sẽ trở thành cos(radians(180 + 90))
). Tôi thích làm điều này chỉ vì mục đích đưa ra một giải pháp tổng quát hơn.
Tạo kiểu
Chúng tôi sẽ kết xuất các điểm bằng một Single symbol
và bằng cách lặp lại một Simple Marker
và ba Geometry generator
lớp biểu tượng:
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 ngôi sao đen (đâ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 generator
loại:
Chèn biểu thức này vào Expression
trường:
CASE
WHEN abs( "ALKUKULMA" - "LOPPUKULMA") < 360
THEN
make_line(
$geometry,
make_point(
$x + 1000*cos(radians(90 - "ALKUKULMA")),
$y + 1000*sin(radians(90 - "ALKUKULMA"))
)
)
END
Chúng tôi vừa xác định dòng đầu tiên hướng đến điểm bắt đầu của ngành ánh sáng. Đường này dài 1000 m và nó chỉ được tạo khi góc mở của ánh sáng khu vực không phải là góc tròn (điều này xảy ra để tránh rằng đường đó sẽ phá vỡ cả một vòng tròn).
3) Máy phát điện hình học số 2
Tương tự như trên, nhưng trong bước này, bạn cần sử dụng biểu thức này:
CASE
WHEN abs( "ALKUKULMA" - "LOPPUKULMA") < 360
THEN
make_line(
$geometry,
make_point(
$x + 1000*cos(radians(90 - "LOPPUKULMA")),
$y + 1000*sin(radians(90 - "LOPPUKULMA"))
)
)
END
Chúng tôi vừa xác định dòng đầu tiên hướng đến điểm mà ngành ánh sáng kết thúc tại. Đường này dài 1000 m và nó chỉ được tạo khi góc mở của ánh sáng khu vực không phải là góc tròn (điều này xảy ra để tránh rằng đường đó sẽ phá vỡ cả một vòng tròn).
4) Máy phát điện hình học số 3
Chèn biểu thức này vào Expression
trường:
CASE
WHEN abs("ALKUKULMA" - "LOPPUKULMA") <= 180 AND "ALKUKULMA" >= "LOPPUKULMA"
THEN
difference(
boundary(
buffer(
$geometry, 900)
),
make_polygon(
geom_from_wkt(
geom_to_wkt(
make_line(
$geometry,
make_point($x + 2000*cos(radians(90 - "ALKUKULMA" )), $y + 2000*sin(radians((90 - "ALKUKULMA" )))),
make_point($x + 2000*cos(radians(90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )), $y + 2000*sin(radians((90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )))),
make_point($x + 2000*cos(radians(90 - "LOPPUKULMA")), $y + 2000*sin(radians((90 - "LOPPUKULMA")))),
$geometry)
)
)
)
)
WHEN abs("ALKUKULMA" - "LOPPUKULMA") <= 180 AND "ALKUKULMA" <= "LOPPUKULMA"
THEN
intersection(
boundary(
buffer(
$geometry, 900)
),
make_polygon(
geom_from_wkt(
geom_to_wkt(
make_line(
$geometry,
make_point($x + 2000*cos(radians(90 - "ALKUKULMA" )), $y + 2000*sin(radians((90 - "ALKUKULMA" )))),
make_point($x + 2000*cos(radians(90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )), $y + 2000*sin(radians((90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )))),
make_point($x + 2000*cos(radians(90 - "LOPPUKULMA")), $y + 2000*sin(radians((90 - "LOPPUKULMA")))),
$geometry)
)
)
)
)
WHEN abs("ALKUKULMA" - "LOPPUKULMA") > 180 AND "ALKUKULMA" >= "LOPPUKULMA"
THEN
intersection(
boundary(
buffer(
$geometry, 900)
),
make_polygon(
geom_from_wkt(
geom_to_wkt(
make_line(
$geometry,
make_point($x + 2000*cos(radians(90 - "ALKUKULMA" )), $y + 2000*sin(radians((90 - "ALKUKULMA" )))),
make_point($x - 2000*cos(radians(90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )), $y - 2000*sin(radians((90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )))),
make_point($x + 2000*cos(radians(90 - "LOPPUKULMA")), $y + 2000*sin(radians((90 - "LOPPUKULMA")))),
$geometry)
)
)
)
)
WHEN abs("ALKUKULMA" - "LOPPUKULMA") > 180 AND "ALKUKULMA" <= "LOPPUKULMA"
THEN
difference(
boundary(
buffer(
$geometry, 900)
),
make_polygon(
geom_from_wkt(
geom_to_wkt(
make_line(
$geometry,
make_point($x + 2000*cos(radians(90 - "ALKUKULMA" )), $y + 2000*sin(radians((90 - "ALKUKULMA" )))),
make_point($x - 2000*cos(radians(90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )), $y - 2000*sin(radians((90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )))),
make_point($x + 2000*cos(radians(90 - "LOPPUKULMA")), $y + 2000*sin(radians((90 - "LOPPUKULMA")))),
$geometry)
)
)
)
)
END
Chúng tôi vừa xác định cung giữa điểm bắt đầu và điểm kết thúc của ngành ánh sáng (xin lưu ý rằng đó 2000
là một giá trị tùy ý vì tôi đang cố gắng tạo một đa giác để giao với ranh giới của vòng tròn có bán kính 900 m).
Hơn nữa, chúng ta cần đặt màu được lưu trữ trong "VARIS"
trường. Để làm điều này, chúng ta cần chỉ định nó với một biểu thức tùy chỉnh. Thực hiện theo mũi tên trong hình dưới đây:
và sau đó nhập biểu thức này sau khi nhấp vào Edit...
nút:
CASE
WHEN "VARIS" = 'vi' THEN color_rgb(51,160,44)
WHEN "VARIS" = 'v' THEN color_rgb(255,255,255)
WHEN "VARIS" = 'p' THEN color_rgb(227,26,28)
END
Xin lưu ý rằng, đối với lớp biểu tượng này, tôi đã tạo hai dòng: dòng trên xác định màu sẽ sử dụng (thực tế tôi đặt biểu thức tùy chỉnh cho lớp này), trong khi lớp dưới hữu ích để xác định đường viền màu đen (nó sẽ có chiều rộng lớn hơn đường kẻ trên). Cũng cần nhớ để thiết lập Flat
như Cap style
cho cả hai dòng để tránh bất kỳ màu sắc chồng chéo.
Dán nhãn
1) Đặt nhãn
Đi tới Layer Properties
> Labels
và, như thường lệ, đi theo mũi tên màu đỏ:
và sau đó gõ biểu thức này:
CASE
WHEN "VARIS" = 'vi' THEN 'G'
WHEN "VARIS" = 'v' THEN 'W'
WHEN "VARIS" = 'p' THEN 'R'
END
Chúng tôi vừa xác định quy tắc màu bằng cách sử dụng giá trị được lưu trữ trong "VARIS"
trường.
2) Đặt vị trí cho nhãn
Chọn Placement
tùy chọn trong Labels
Menu và chọn Offset from point
.
Sau đó, với tham chiếu đến hình ảnh dưới đây:
theo mũi tên màu đỏ và gõ biểu thức này:
CASE
WHEN "ALKUKULMA" > "LOPPUKULMA"
THEN
concat(
-1000*cos(radians(90 - ("ALKUKULMA" + "LOPPUKULMA")/2)),
',',
1000*sin(radians(90 - ("ALKUKULMA" + "LOPPUKULMA")/2))
)
WHEN "ALKUKULMA" <= "LOPPUKULMA"
THEN
concat(
1000*cos(radians(90 - ("ALKUKULMA" + "LOPPUKULMA")/2)),
',',
-1000*sin(radians(90 - ("ALKUKULMA" + "LOPPUKULMA")/2))
)
END
Sau đó, làm theo mũi tên màu xanh lá cây và gõ biểu thức này:
CASE
WHEN "ALKUKULMA" >= "LOPPUKULMA"
THEN
180-(("ALKUKULMA" + "LOPPUKULMA")/2)
WHEN "ALKUKULMA" < "LOPPUKULMA"
THEN
- (("ALKUKULMA" + "LOPPUKULMA")/2)
END
Kết quả cuối cùng
Nếu bạn thực hiện đúng các nhiệm vụ trước đó, bạn sẽ có thể nhận được kết quả này:
Tiền thưởng
Vì các tham số nhỏ có quá nhiều để được bao phủ hoàn toàn trong câu trả lời này, 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ó .qml
phầ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).