Có thể có tên lớp động trong dự án QGIS không?


9

Tôi có một dự án QGIS với các lớp, dựa trên các truy vấn SQL PostGIS sử dụng ngày hiện tại. Vì dữ liệu trong cơ sở dữ liệu thay đổi, các truy vấn này trả về dữ liệu khác nhau mỗi ngày mới.

Có thể tự động thay đổi tên của lớp trong bảng cây lớp, vì vậy nó đại diện cho ngày hiện tại? (tức là tên lớp như thế Traffic on 24.01.2015, thay đổi mỗi ngày mới). Dữ liệu cho chú thích nên được lấy từ thuộc tính của bất kỳ tính năng nào trong một lớp - tất cả chúng đều có cùng giá trị cho trường traffic_date.


Chính xác những gì bạn sẽ trích xuất từ ​​bảng cơ sở dữ liệu của bạn, "Lưu lượng truy cập" hoặc ngày hiện tại?
Germán Carrillo

Tôi đang trích xuất dữ liệu cho ngày hiện tại sang một lớp và dự báo dữ liệu cho các lớp khác. Vì vậy, "24.01.2015" thực sự là một giá trị trường, xuất phát từ cơ sở dữ liệu. Tôi cần tên lớp trong dự án để tự động thay đổi tương ứng với ngày.
mofoyoda

Có thể thay đổi tên mỗi khi dự án tải không?
Nathan W

Câu trả lời:


13

Nếu tôi hiểu đúng về bạn, câu trả lời là có, QGIS hỗ trợ tên lớp động.

Bạn sẽ cần phải viết một macro Python để được chạy mỗi khi dự án được mở. Đây sẽ là quy trình công việc:

  1. Chuyển đến QGIS->Project->Project Propertiesvà thay thế openProject()bằng mã Python sau:

    def openProject():
        import re, qgis     
        iface = qgis.utils.iface
        layers = iface.mapCanvas().layers()
        for lyr in layers:
            # Get date from layer
            it=lyr.getFeatures()
            feat = next(it)
            idx = lyr.fieldNameIndex('traffic_da')
            currDate = feat.attributes()[idx]
    
            # Set new layer name
            name = lyr.name()
            if re.search(' on \d{2,2}.\d{2,2}.\d{4,4}$', name):
                 name = name[:-14]
            name = name + " on " + currDate
            lyr.setLayerName( name )
    

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

    Lưu ý 1: Tôi đã thử nghiệm nó trên shapefiles, vì vậy trường mà tôi lấy ngày là traffic_davì Shapefiles không hỗ trợ thêm chữ cái trong tên trường. Điều chỉnh trong mã để làm việc trên các lớp của bạn.

    Lưu ý 2: Tùy thuộc vào cấu hình dự án của bạn, bạn nên thêm mã xác thực để chỉ hành động trên các lớp bạn muốn. Chẳng hạn, nếu bạn chạy mã trên các lớp raster, chắc chắn sẽ xuất hiện lỗi. Nếu bạn cần giúp đỡ với điều này, hãy mở một câu hỏi mới, tôi có thể giúp bạn.

  2. Hãy chắc chắn rằng bạn bật macro trên dự án của bạn, theo cách này: Settings->Options->General->Enable macros: Always

  3. Tải các lớp của bạn vào dự án.

  4. Lưu dự án của bạn.

Mỗi khi bạn mở dự án của mình từ thời điểm này, tên lớp của bạn sẽ động, ngày sẽ được lấy từ trường traffic_datetrên bảng thuộc tính của mỗi lớp.

Sau lần đầu tiên tôi mở dự án, đây là cách tên lớp của tôi được tạo động:

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

Tôi nghĩ rằng điều này có thể giúp bạn bắt đầu. Hãy cho tôi biết nếu bạn phải đối mặt với những rắc rối không rõ ràng.


Tôi đã tìm ra nó bằng cách đọc bình luận của bạn, đăng 1s trước khi tôi gửi câu trả lời. Một số điều chỉnh nên được thực hiện trong mã để phù hợp với sự sắp xếp cụ thể của các lớp, nhưng tôi hy vọng @mofoyoda có thể giải quyết chúng.
Germán Carrillo

1
Vâng, đó là một lần đầu tiên tốt. Bạn cũng có thể chỉ cần tìm chỉ mục onvà dải từ đó đến cuối để tiết kiệm khi sử dụng regex.
Nathan W

1
@gcarrillo dữ dội! Nhưng thật tuyệt!
DPSSpatial

1
@gcarrillo Rất tuyệt, cảm ơn! Vẫn đang cố gắng tìm ra cách áp dụng cho chỉ một số lớp nhất định, tôi hy vọng tôi sẽ làm được. Cảm ơn cho một câu trả lời tuyệt vời!
mofoyoda
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.