Đồng bộ hóa các khung nhìn trong trình soạn thảo in của QGIS?


10

Tôi tìm thấy một câu hỏi rất giống với vấn đề của tôi: Làm thế nào để liên kết các dataframes trong ArcGIS hoặc QGIS? . Nhưng giải pháp cho QGIS hiện không hoạt động (bổ trợ Dual View không còn khả dụng nữa).

Tôi muốn đồng bộ ba chế độ xem:

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

Ý tưởng là để di chuyển ba chế độ xem bản đồ cùng một lúc với bản đồ chính trong trình soạn thảo in của QGIS.

Có cách nào hoặc trình cắm để làm điều này không?

Câu trả lời:


2

Một giải pháp "không mã" thanh lịch khác để đồng bộ hóa bản đồ nhà soạn nhạc sử dụng cơ chế "Tổng quan" tích hợp của QGIS:

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

Do đó, chúng tôi thêm tổng quan "Khung bản đồ chính" cho mọi cửa sổ bản đồ, cần được đồng bộ hóa với bản đồ chính. Sau đó, chúng tôi đặt kiểu khung thành Không cọ / Không bút và bật "Trung tâm tổng quan".

Để sửa tỷ lệ của bản đồ con, chúng tôi nhập giá trị Biểu thức: nhập mô tả hình ảnh ở đây

Đó là tất cả.

Rất dễ dàng và rất năng động!


Tuyệt quá! Rất đơn giản ... công việc tuyệt vời xung quanh
aldo_tapia

4

Cách duy nhất mà tôi tìm thấy tại thời điểm này là tạo một tập lệnh nhỏ trong python, có thể điều này có thể di chuyển vào một plugin nhưng tôi không có kinh nghiệm về điều đó.

Là một mã thực sự cơ bản, chọn đúng nhà soạn nhạc và bản đồ:

from qgis.core import *
from qgis.utils import *

composerList = iface.activeComposers()

comp = composerList[4]

maps = comp.composition().composerMapItems()

masterMap = maps[0]
slave1 = maps[1]
slave2 = maps[4]

slave1.setNewExtent(masterMap.extent())
slave2.setNewExtent(masterMap.extent())

Tùy chọn khác sẽ duy trì tỷ lệ ban đầu trong bản đồ nô lệ để đặt sau phạm vi mới nếu bản đồ có hình dạng khác nhau, nhưng trong trường hợp cá nhân của tôi với mã này là đủ:

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

Tôi đang mở để cải thiện giải pháp này (tôi gần như không có kinh nghiệm với PyQGIS).


Xử lý các phạm vi và quy mô khác nhau

Mã ở trên hoạt động tuyệt vời với cùng mức độ (và do đó, hình dạng) và quy mô. Bây giờ tôi có một mã được cải tiến được thử nghiệm với các mức độ khác nhau, hình dạng và tỷ lệ:

from qgis.core import *
from qgis.utils import *

composerList = iface.activeComposers()

comp = composerList[0]

maps = comp.composition().composerMapItems()

masterMap = maps[2]
slave1 = maps[1]
slave2 = maps[0]

centroid = masterMap.extent().center()

diffx1 = slave1.extent().xMaximum() - slave1.extent().xMinimum()
diffy1 = slave1.extent().yMaximum() - slave1.extent().yMinimum()

diffx2 = slave2.extent().xMaximum() - slave2.extent().xMinimum()
diffy2 = slave2.extent().yMaximum() - slave2.extent().yMinimum()

newExtent1 = QgsRectangle(centroid[0]-(diffx1/2),centroid[1]-(diffy1/2),centroid[0]+(diffx1/2),centroid[1]+(diffy1/2))
newExtent2 = QgsRectangle(centroid[0]-(diffx2/2),centroid[1]-(diffy2/2),centroid[0]+(diffx2/2),centroid[1]+(diffy2/2))

slave1.setNewExtent(newExtent1)
slave2.setNewExtent(newExtent2)

Và kết quả kiểm tra:

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


Đừng quên chấp nhận câu trả lời của bạn bằng cách nhấp vào dấu phẩy màu xanh lục ở phía bên trái để hiển thị vấn đề của bạn đã được giải quyết :)
Joseph

1
@Joseph cảm ơn, nhưng đã giải quyết được một nửa. Tôi sẽ chấp nhận câu trả lời của riêng mình sau khi chuyển đổi câu hỏi này trong một trình cắm để cung cấp giải pháp hoàn chỉnh. Vẫn là một thử thách đối với tôi
aldo_tapia

2

Chỉ cần một mẹo nhỏ để làm điều đó mà không có mã. Nó ít hiệu quả hơn câu trả lời của aldo nhưng cuối cùng nó cũng có mẹo nếu đó là để làm một bản đồ cuối cùng. Bạn cũng không cần phải có chế độ xem chính, đó là phạm vi khung bản đồ được tính:

  1. Di chuyển bản đồ A như bạn muốn (nó sẽ là bản đồ chính)
  2. Nhấp vào "Xem phạm vi trong bản đồ vải"
  3. Chuyển sang bản đồ B
  4. Nhấp vào "Đặt thành phạm vi vải bản đồ"
  5. Chuyển sang bản đồ C
  6. Nhấp vào "Đặt thành phạm vi vải bản đồ"

Vân vân.

chế độ xem vải

Khi bạn cần một bản đồ khác để làm chủ, chỉ cần nhấp vào bản đồ khác rồi "xem phạm vi trong khung vẽ bản đồ" trước khi đặt các bản đồ khác.

Nếu bạn muốn giữ chế độ xem cụ thể cho lần sau, tôi khuyên bạn nên sử dụng bảng đánh dấu Không gian. Đặt khung vẽ bản đồ ở mức độ được chọn, sau đó nhấp vào Đặt để vẽ khung vải trong mỗi nô lệ bạn cần :)


Vâng, tôi đã từng làm theo cách này. Là một lựa chọn tuyệt vời, nhưng tỷ lệ trong bản đồ B và C luôn thay đổi, do đó, có thêm hai bước
aldo_tapia

câu trả lời hay của bạn, tôi cần phải thử nó ^^
gisnside

2

Tôi chỉ gặp vấn đề tương tự và có thể nhận được kết quả mong muốn bằng cách sử dụng biểu thức trên các bản đồ phụ thuộc. Điều này giả định tất cả các bản đồ có cùng kích thước trong bố cục.

  1. Cung cấp cho bản đồ chính của bạn một ID vật phẩm, ví dụ 'map1' (ở dưới cùng của thuộc tính vật phẩm)

  2. Trên mỗi bản đồ phụ thuộc, thêm biểu thức cho từng giá trị phạm vi:

    x_min(map_get(item_variables('map1'), 'map_extent'))
    

Mã sẽ nhận được các biến cho mục tổng hợp 'map1', lấy phạm vi dưới dạng hình học từ nó và cuối cùng nhận giá trị x_min của nó từ hình học. Thay đổi x_min thành y_min, x_max và y_max tương ứng.

Nhược điểm duy nhất là bạn cần làm mới các bản đồ phụ thuộc mỗi khi bạn di chuyển bản đồ chính. Khi xuất, nó sẽ tự động cập nhật.


Phiên bản nào của QGIS bạn đang sử dụng? Tôi đã thử trong 3.0.2 nhưng không thành công
aldo_tapia

@aldo_tapia QGIS 3.0.3 trên Ubuntu 16.04
rò rỉ_my_brain

Thật kỳ lạ, tôi không thể làm cho nó chạy ... Nhưng được nâng cấp!
aldo_tapia
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.