Tượng trưng cho phác thảo đa giác nơi nó không trùng với tính năng khác bằng cách sử dụng trình tạo hình học trong QGIS?


10

Tôi muốn tượng trưng cho một đa giác mà không chuyển đổi chúng thành một dòng. Tôi có một tính năng đa giác (nở và giới hạn bởi đường màu đỏ) trùng với đỉnh và đáy của đường bờ biển (đường màu xanh). Tôi muốn tượng trưng cho phác thảo của một đa giác chỉ ở hai bên và muốn bỏ màu đỏ ở trên và dưới.

Hình ảnh

Tôi muốn xem kết quả cuối cùng như thế này.

Hình ảnh


Bạn có thể cung cấp thêm một số thông tin về quy trình làm việc của bạn? Ví dụ, nếu đây là trường hợp sử dụng một lần, hoặc bạn sẽ phải hiển thị một số đa giác theo cách này? Nếu một vài đa giác, chúng được định hướng khác nhau và chúng có tỷ lệ khác nhau hoặc tương tự nhau? Số hóa thủ công của các dòng bên có thể là một lựa chọn phù hợp?
Erik

1
Đây không phải là trường hợp sử dụng một lần. Tôi có một số đa giác và chúng sẽ được cập nhật để hình dạng thay đổi rất thường xuyên. Và tôi không muốn số hóa chúng theo cách thủ công hoặc biến đa giác thành các dòng.
Raj

Câu trả lời:


12

Tôi đã vật lộn một chút với cái Geometry generatortên @GSienko. Đối với phần giao nhau, bạn cũng có thể sử dụng chức năng tích hợp aggregate. Ngoài ra tôi đã sử dụng segment_to_lineschức năng chuyển đổi đa giác thành dòng.

difference(
    segments_to_lines($geometry),
    aggregate(
        layer:= 'line',
        aggregate:='collect',  
        expression:= $geometry,
        filter:=intersects($geometry, geometry(@parent))
    )
)

hoặc là

difference(
    segments_to_lines($geometry),
    aggregate('line','collect',$geometry,intersects($geometry, geometry(@parent)))
)

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

Nếu bạn có một số đa giác "không liên quan" đến các dòng, bạn có thể thêm ifđiều kiện cho giao lộ. Nếu các lớp nằm trong giao điểm, thì sự khác biệt được áp dụng cho hệ thống ký hiệu, nếu không thì toàn bộ hình học được áp dụng.

if(
    intersects(
        segments_to_lines($geometry),
        aggregate('line','collect',$geometry,intersects($geometry, geometry(@parent)))
    ),
    difference(
        segments_to_lines($geometry),
        aggregate('line','collect',$geometry,intersects($geometry, geometry(@parent)))
    ),
    segments_to_lines($geometry)
)

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

chỉnh sửa : Sử dụng trình tạo dòng theo cách này có một điểm yếu - bạn phải xử lý biểu tượng chú giải, bởi vì nó hiển thị dòng thông qua đa giác (không phải là một đường viền). Tuy nhiên, bạn vẫn có thể nhân đôi layer, đặt fill đơn giản và sử dụng nó cho huyền thoại.

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


1
Giải pháp phức tạp hơn và tôi tìm hiểu thêm một chút nữa :)
GSienko

Tôi cũng vậy :). Trước đây tôi không cần sử dụng trình tạo Hình học , nhưng đó là điều đầu tiên tôi nghĩ đến sau khi đọc OP. Đã bị mắc kẹt một chút về điều này khi cố gắng kết hợp các giao lộ, và câu trả lời của bạn cũng giúp tôi, vì tôi hoàn toàn quên mất chức năng Khác biệt :).
Oto Kaláb

Giải pháp hoàn hảo cho trường hợp của tôi. Tôi rất trân trọng tất cả sự giúp đỡ của bạn :)
Raj

Nhược điểm duy nhất của việc sử dụng trình tạo dòng là bạn phải xử lý ký hiệu chú giải, bởi vì nó hiển thị dòng thông qua đa giác (không phải là một đường viền). Tuy nhiên, bạn vẫn có thể nhân đôi layer, đặt fill đơn giản và sử dụng nó cho huyền thoại.
Oto Kaláb

4

Hãy thử sử dụng plugin refFunction trong trình tạo hình học.

Giả thiết. 2 lớp - một dòng là dòng và đa giác là đa giác.

Kiểu đa giác như thế:nhập mô tả hình ảnh ở đây

difference(exterior_ring( $geometry ),geom_from_wkt(geomintersects('line','$geometry')))

geomintersect sẽ thực hiện truy vấn không gian giữa lớp đa giác và lớp đường và trả về hình học của giao điểm của hai trong số chúng, trong trường hợp của chúng ta, hai đường viền của đa giác. Bước tiếp theo là tạo sự khác biệt với đường viền của đa giác. Tôi không biết liệu bạn sẽ có lỗ hổng bên trong hay không, khi đó outs_ring () sẽ chỉ trả lại đường viền bên ngoài.

Kết quả cuối cùng: nhập mô tả hình ảnh ở đây

Giới hạn - geomintersect sẽ chỉ kiểm tra giao lộ cho một đa giác. Tôi quản lý giới hạn đó bằng cách tạo lớp đa giác thành một đa giác lớn, ví dụ bằng lớp ảo để tạo kiểu viền.


3

Làm thế nào về việc thêm một dòng trắng dưới dòng màu xanh trong lớp khác, có cùng chiều rộng với dòng màu đỏ? Nếu bạn đặt đường màu xanh bên trên lớp đa giác, đường màu trắng sẽ che khuất đường màu đỏ.

Điều này tất nhiên giả định rằng bạn có một nền trắng như trong ví dụ của bạn, và rằng bạn ổn với một số dấu thập cũng bị che khuất.

Đây là kết quả kiểm tra nhanh của tôi:

Bản đồ hình ảnh thể hiện phong cách

Cài đặt cho dòng màu xanh:

Ký hiệu


Trong trường hợp của tôi, độ dày và màu sắc dòng có thể thay đổi. Ngoài ra, tôi phải sử dụng các ký hiệu đường đánh dấu cho đa giác trên bản đồ nơi độ dày của đối tượng địa lý khác và độ dày của đa giác sẽ không giống nhau.
Raj

2

Tuyên bố miễn trừ trách nhiệm: Câu trả lời này sẽ không hoạt động nếu bạn có nhiều đa giác

Những gì bạn có thể làm là tìm ra các nút tạo thành bốn góc của đa giác mà bạn muốn vẽ các đường giữa và sau đó sử dụng các nút trong các hàm MAKE_LINE () để vẽ các đường:

Để tìm những nút bạn cần:

  • Đầu tiên thêm một hệ thống ký hiệu hình học
  • Đặt loại hình học thành Điểm / Đa điểm
  • Sử dụng biểu thức POINT_N($geometry, 1)để hiển thị nút đầu tiên làm điểm
  • Tiếp tục thay đổi giá trị cho đến khi bạn biết số lượng của bốn góc của đa giác, hãy lưu ý những điều này vì bạn sẽ sử dụng các cặp này để vẽ các đường

Để vẽ các đường:

  • Thay đổi loại hình học của trình tạo hình học thành LineString / MultiLineString
  • Sử dụng biểu thức MAKE_LINE(POINT_N($geometry, *first point*), POINT_N($geometry, *second point*)
  • Sao chép này bằng cặp điểm khác
  • Điều này sẽ vẽ hai đường biên

Tiếp theo, bạn chỉ cần thêm một biểu tượng điền thông thường vào biểu tượng bên dưới hai trình tạo hình học đó


Thật không may, tôi có vô số đa giác.
Raj
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.