Tránh các tính năng ghi nhãn nếu bị chồng chéo bởi một lớp khác trong QGIS?


16

Với QGIS 2.12.2, làm cách nào tôi có thể thiết lập ghi nhãn lớp để tránh đặt nhãn nơi các tính năng từ lớp khác đã tồn tại?

Ví dụ, nếu tôi có một dòng suối / sông polyline lớp có chứa hồ "centerlines", và tôi đặt một "hồ" đa giác lớp trên nó theo thứ tự bản vẽ, tôi không muốn lớp sông để đặt một nhãn bên hồ . Thay vào đó, tôi thà để dòng sông được dán nhãn bên ngoài hồ (khi cần thiết). Bằng cách đó, tôi có thể đặt nhãn từ lớp hồ và tôi không gặp phải va chạm nhãn.

Dưới đây là một ví dụ, trong đó (tôi đã cố tình đặt các dòng lên hàng đầu cho mục đích trực quan) điều tôi hy vọng đạt được là không có nhãn dòng trung tâm sông được hiển thị bên trong đa giác hồ: Các dòng được dán nhãn bên trong đa giác


4
Dữ liệu của bạn được lưu trữ và phục vụ như thế nào? Làm việc với PostGIS, tôi rất muốn xác định các con sông của mình bằng một khung nhìn, trong đó các phần của các con sông giao nhau giữa các hồ được cắt hoàn toàn. Ghi nhãn tự động tốt là một vấn đề khó khăn, hình học ít như vậy.
alphabetasoup

Đây là những shapefile, nhưng ý tưởng của bạn về việc chuyển sang PostGIS và quản lý các vấn đề dữ liệu một cách nhanh chóng là một điều thực sự tốt. Tôi sẽ đề nghị bạn chuyển nhận xét của mình sang Trả lời, vì tôi có thể đưa ra một lập luận khá hợp lệ rằng đây là một giải pháp tốt.
RyanKDalton-OffTheGridMaps

Câu trả lời:


9

Dán nhãn tự động là một vấn đề thực sự khó khăn, nhưng tính năng hình học không phải là quá xấu.

Ngay cả khi bạn có thể có được vị trí để làm việc đầy đủ hầu hết thời gian, vẫn có khả năng có ngoại lệ. Một số trong số này bạn sẽ nhận thấy và có thể giải quyết. Những người khác bạn sẽ không chú ý khi tạo một bản đồ lớn hoặc ô vuông vì bạn không thể đổ trên mỗi inch trên bản đồ của mình ở nhiều tỷ lệ khác nhau. Hầu như luôn luôn bạn sẽ có nhu cầu di chuyển một số nhãn được đặt tự động theo cách thủ công, từ góc độ bản đồ.

Như tôi đã đề xuất trong nhận xét của mình, tôi sẽ làm cho vấn đề dễ dàng hơn đối với công cụ ghi nhãn. Trong trường hợp này, tôi sẽ làm điều này bằng cách xác định các dòng sông của mình là chế độ xem bảng *, với hình học sông được cắt bớt để tôn trọng ranh giới hồ. Theo cách đó, không có đặc điểm sông bên trong hồ được dán nhãn và không có va chạm nhãn.

* Tôi giả sử việc sử dụng RDBMS ở đây, như PostgreSQL / PostGIS, để thuận tiện và khả năng chỉ cập nhật nguồn dữ liệu có thẩm quyền của bạn và có chế độ xem mà không cần sự can thiệp của bạn. Nhưng bạn cũng có thể thực hiện một số công việc trả trước với các tệp tĩnh để cắt và xóa các tính năng, nhưng tôi không khuyên bạn nên làm điều này nếu bạn có kế hoạch xem lại bản đồ.

Thí dụ:

Bắt đầu với hai shapefile (có thể là bảng cơ sở dữ liệu) của sông và hồ, với các con sông giao nhau với hồ và gây ra các vấn đề về nhãn khó giải quyết hoàn toàn và tự tin:

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

Mang những thứ này vào Postgres nếu bạn cần với shp2pgsql :

shp2pgsql -s 4326 /data/lake public.lakes | psql -d mydb

shp2pgsql -s 4326 /data/river public.rivers | psql -d mydb

Sau đó, xác định chế độ xem với ST_Difference :

CREATE OR REPLACE VIEW rivers_clipped AS
SELECT r.id, ST_Difference(r.geom, l.geom) AS geom, r.name
FROM public.rivers AS r, public.lakes AS l;

Thêm chế độ xem vào bố cục của bạn:

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

Mặc dù vấn đề trong ví dụ của tôi là cố tình bịa đặt, các kiểu trong hai lớp sông (nguyên bản và khung nhìn) là như nhau, và chúng được đặt trên đỉnh hồ theo thứ tự vẽ. Khi bạn cập nhật hình học của hồ hoặc sông, bạn sẽ không cần phải làm gì nhiều hơn là làm mới kết xuất.

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


2
Mặc dù tôi không trực tiếp làm việc với lớp DB, nhưng giải pháp này có ý nghĩa nhất đối với tôi, vì nó không yêu cầu chỉnh sửa hình dạng của các nguồn dữ liệu ban đầu (ngoài việc tải chúng vào DB). Đây là một ví dụ tuyệt vời về suy nghĩ bên ngoài hộp shapefiles và giới hạn ứng dụng và tìm giải pháp sáng tạo cho vấn đề bằng cách kết hợp cả ứng dụng và logic DB.
RyanKDalton-OffTheGridMaps

13

Trong QGIS> = 2.12, bạn có thể đặt lớp đa giác "hồ" làm chướng ngại vật nhãn. Điều này được thực hiện thông qua các thuộc tính lớp của lớp "hồ", trong phần 'Nhãn'. Thay đổi hộp tổ hợp ở trên cùng từ " Không nhãn " thành " Không khuyến khích các nhãn khác che các tính năng trong lớp này ".


1
Cảm ơn. Tôi đang tìm kiếm một cái gì đó như thế, và đã không nhận thấy tùy chọn thả xuống trước đó. Tuy nhiên, tôi sẽ nói rằng điều này chỉ thành công vừa phải. 1) Nó chỉ có các nhãn "loại tương tự" từ lớp sông (chúng vẫn xuất hiện trong hồ, nhưng ít hơn) và 2) bây giờ tôi không có nhãn tên Hồ của mình :( Tôi cũng đã thử đặt nhãn Sông> Trở ngại "Không khuyến khích nhãn che phủ các tính năng" (không thành công) và đặt trọng số Thấp & Cao (không thành công) và đặt Vị trí> Ưu tiên = Thấp & Cao (không thành công).
RyanKDalton-OffTheGridMaps

À, có lẽ tôi đã hiểu lầm. Nếu bạn có nhãn trên lớp hồ thì hãy đảm bảo hộp kiểm "không khuyến khích nhãn che các tính năng" trong tab kết xuất được đánh dấu. Bạn có thể cần chơi với thanh trượt "trọng lượng" và các tùy chọn khác trong nhóm này để có kết quả mong muốn.
ndawson

1
Không, bạn chắc chắn đã đi đúng hướng. Tôi đã chơi xung quanh với các trọng số (trọng lượng cao trên đa giác hồ + "giảm thiểu việc đặt nhãn trên các tính năng bên trong, trọng lượng thấp trên sông) và tiến gần hơn, nhưng chưa bao giờ thực sự đến điểm mà các nhãn sông không ở trên hồ. dường như được liên kết với các dòng ở cả bên trong và bên ngoài đa giác.
RyanKDalton-OffTheGridMaps

4
Tại sao bạn không xóa (hoặc tách) các dòng đó khi nói đến ghi nhãn? Chúng không hữu ích cho bản đồ của bạn nào.
radouxju

4

Tôi thấy việc dán nhãn nói chung khá khó khăn, ít nhất là để tạo ra các nhãn làm hài lòng các giác quan của người vẽ bản đồ của tôi. Mặc dù tính năng ghi nhãn tự động hoạt động tốt 80% thời gian, nhưng có những trường hợp như vấn đề ghi nhãn sông / hồ của bạn không tạo ra nhãn tốt. Việc ghi nhãn tự động thường được gắn với hình dạng của tính năng, ví dụ: có bao nhiêu phần trong một dòng để lúc đầu tất cả các phần được dán nhãn. Tất nhiên, QGIS có nghĩa là ngăn chặn việc dán nhãn lặp lại, điều này cũng phụ thuộc vào tỷ lệ của chế độ xem bản đồ hiện tại.

Dù sao, mẹo của tôi không phải là một giải pháp nhanh chóng. Tôi thường tạo một lớp chuyên dụng chỉ để ghi nhãn, để nhãn của tôi dễ kiểm soát hơn. Và thường thì các tính năng hình học cho biểu diễn bản đồ có thể va chạm với một hình học tốt để ghi nhãn. Vì vậy, tôi sẽ đề xuất tạo một lớp mới trong đó các luồng không qua các hồ, để bạn có thể tránh được vấn đề hoàn toàn. Có thêm một lớp ghi nhãn cũng có thể giúp ngăn ngừa các vấn đề trong đó hướng ghi nhãn không nằm trong hướng dự định vì nó được gắn với cách tạo hình học.

Chà, tôi sợ rằng tiền boa của tôi không như bạn mong đợi, nhưng tôi hy vọng rằng cách tiếp cận thay thế của tôi sẽ giúp bạn bằng cách nào đó.


Bạn đưa ra một điểm hợp lệ để tôi có thể tạo một bộ dữ liệu mới (có thể dễ dàng thực hiện trong trường hợp này ... chỉ cần xóa các tính năng dòng theo đa giác), nhân đôi bộ dữ liệu không có vẻ quá hấp dẫn hoặc có thể quản lý được, trừ khi bạn sử dụng một phương pháp dựa trên cơ sở dữ liệu như @Richard Law đã đề cập.
RyanKDalton-OffTheGridMaps

Tôi thấy quan điểm của bạn và tôi hiểu sự do dự của bạn để tạo ra một bộ dữ liệu tương tự hai lần. Theo kinh nghiệm của tôi, lớp nhãn thường khác với lớp dữ liệu gốc. Ví dụ, để gắn bó với ví dụ về dòng sông của bạn, bạn có thể muốn thay đổi hình học của dòng sông hơn nữa để nối hoặc tách các phần tính năng để tạo nhãn hiệu đẹp hơn được lặp lại nhiều lần hơn. Ít nhất đây thường là trường hợp đối với tôi khi xử lý các đường OSM, đôi khi được tổ chức khá tùy tiện.
Frank

3

có một plugin gọi là " Mặt nạ " có thể được sử dụng để lọc nhãn dựa trên đa giác.

Tuy nhiên, như đã đề cập trong bình luận trước đây của tôi, sẽ dễ dàng hơn rất nhiều nếu bạn có thể phân chia các dòng của mình tại giao lộ với các hồ (xem các phương pháp khác nhau ở đây ). Sau đó, bạn có thể xác định nhãn có kích thước bằng 0 cho các phân đoạn nằm trong hồ ("Lớp"> "Dán nhãn"> "Cài đặt được xác định dữ liệu"> "Kích thước" sau đó chọn cột nơi bạn lưu trữ kích thước nhãn). Việc chia tách giữ hầu hết các thuộc tính của mạng sông của bạn và có thể đảo ngược khi hòa tan, do đó bạn có thể tiếp tục làm việc với một lớp duy nhất (lưu trữ tổng chiều dài trong bảng thuộc tính cụ thể nếu cần).


Cảm ơn, plugin nghe có vẻ hứa hẹn, vì vậy tôi sẽ dùng thử.
RyanKDalton-OffTheGridMaps
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.