Tạo kiểu raster rời rạc bằng cách sử dụng QGIS?


11

Tôi có các trình quét với các giá trị riêng biệt (danh mục Landuse, giá trị boolean ...). Tôi muốn có thể tạo kiểu cho chúng theo cách riêng biệt:

0 -> Red
1 -> Blue
2 -> Green
...

Tôi muốn một cái gì đó giống như "Danh mục duy nhất" trong ArcGIS: http://resource.arcgis.com/en/help/main/10.1/index.html#/interesenting_unique_clists_such_as_land_use/009t00000074000000/

Tuy nhiên, tất cả các tùy chọn tôi thấy liên quan đến các đường dốc màu sắc ... Tôi đã bỏ lỡ điều gì chưa?


Tôi đã mở một yêu cầu tính năng, vì dường như chỉ có giải pháp thay thế, không phải là giải pháp: http://hub.qgis.org/issues/14845

Câu trả lời:


7

Bạn có thể tạo một lược đồ kiểu tùy chỉnh, giống như các danh mục độc đáo nhưng bạn sẽ phải thêm tất cả các danh mục theo cách thủ công (Toàn bộ tôi phải làm, nhưng tôi đang sử dụng phiên bản cũ hơn của QGIS).

Nhấp chuột phải vào raster -> property -> style. Trong đó chọn singleband pseudocolorlàm Render typevà nhấp vào cộng với màu đỏ nhỏ để thêm giá trị của riêng bạn và màu tương ứng. Một cái gì đó dọc theo dòng: nhập mô tả hình ảnh ở đây

Lưu ý rằng bạn cũng có thể sử dụng phân loại để nhận các giá trị tự động nhưng nếu bạn có các giá trị riêng biệt, bạn có thể tốt hơn nếu chỉ thêm chúng theo cách thủ công, tùy thuộc vào cách dữ liệu của bạn được phân phối.

Nếu dữ liệu của bạn sau một mô hình, nếu nó là 0,1,2 .... 10, bạn có thể thiết lập Modeđể khoảng bằng nhau, xác định phạm vi Min:0, Max:10Classes:11, nhấp vào Classifyvà bạn sẽ nhận được tất cả các giá trị tự động. Sau đó, bạn có thể thay đổi chúng khi bạn thấy phù hợp. nhập mô tả hình ảnh ở đây Tôi biết nó không hoàn hảo, nhưng đây là thứ tốt nhất tôi tìm thấy cho đến nay. Có thể có một plugin liên quan đến vấn đề này.


Tôi đã hy vọng khả năng tự động truy xuất tất cả các giá trị có thể có của raster rời rạc của tôi nhưng dường như điều này không tồn tại (chưa?). Cảm ơn!
Stéphane Henriod

Theo như tôi biết thì chưa thể, nhưng có thể có một plugin thực hiện điều này.
Hasan Mustafa

@ Stéph, để tự động nhận toàn bộ phạm vi giá trị: trong 'Tải giá trị tối thiểu / tối đa', bạn có thể chọn 'min / max' và sau đó nhấp vào 'tải', sau đó đặt số lượng lớp để bao phủ phạm vi đó (theo ghi chú của Hasan ) và nhấp vào 'phân loại'. Nếu bạn thiếu các giá trị trong phạm vi, bạn sẽ cần xóa chúng theo cách thủ công.
Simbamangu

2
Cảm ơn, đó thực sự là cách giải quyết mà tôi sử dụng. Nhưng tôi không thấy nó rất trực quan, chủ yếu là khi tôi dạy Qgis cho người dùng mới. Hơn nữa, nếu tôi có giá trị "6" mà tôi không muốn hiển thị trên raster của mình, tôi có một vấn đề: tất cả các pixel có "6" sẽ đặt cược một màu được nội suy giữa "5" và "7". Tất nhiên tôi có thể nói rằng "6" nên được coi là NoData hoặc tôi có thể sử dụng máy tính raster để tạo một raster mới mà không có "6", nhưng, một lần nữa, đó đều là cách giải quyết. Lý tưởng nhất, tôi muốn có một nút "Lấy tất cả các giá trị duy nhất". Tôi sẽ kiểm tra xem nó có kế hoạch cho các phiên bản trong tương lai không ...
Stéphane Henriod

1
Tôi đã tạo một vé về một vấn đề liên quan: hub.qgis.org/issues/14449
Kurt Menke

5

Đây là một kịch bản Xử lý nhanh và bẩn, thực hiện chính xác những gì bạn đang yêu cầu (xin lỗi về các lựa chọn màu sắc!). Đặt nó trong thư mục Xử lý tập lệnh (ví dụ: C: \ Users \ .qgis2 \ process \ scripts) và nó sẽ hiển thị trong hộp công cụ Xử lý trong Tập lệnh> Raster.

Tín dụng cho Yury Ryabov cho tập lệnh Unique_values_count.py dựa trên tập lệnh này.

EDIT: Tôi chỉ đang gửi một yêu cầu kéo để đưa nó vào kho xử lý tập lệnh.

##Raster=group
##Generate unique values style=name
##Raster_to_extract_unique_values=raster
##round_values_to_ndigits=number 0

from osgeo import gdal
from random import randint
import math
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
from qgis.utils import iface

# Rename verbose input vars
input = Raster_to_extract_unique_values
rdig = round_values_to_ndigits

# Initialize unique values list
sort_values = []
# create set for unique values list
cell_values = set()

# load raster
gdalData =  gdal.Open(str(input))

# get width and heights of the raster
xsize = gdalData.RasterXSize
ysize = gdalData.RasterYSize

# get number of bands
bands = gdalData.RasterCount

# process the raster
for i in xrange(1, bands + 1):
    progress.setText("processing band " + str(i) + " of " + str(bands))
    band_i = gdalData.GetRasterBand(i)
    raster = band_i.ReadAsArray() # This loads the entire raster into memory!
    # count unique values for the given band
    for col in range( xsize ):
        if col % 10 == 0: progress.setPercentage(int(100*col/xsize))
        for row in range( ysize ):
            cell_value = raster[row, col]
            # check if cell_value is NaN - don't add if it is
            if not math.isnan(cell_value):
                # round floats if needed
                if rdig:
                    try:
                        cell_value = round(cell_value, int(rdig))
                    except:
                        cell_value = round(cell_value)
                # Add to the unique values set
                cell_values.add(cell_value)

del(gdalData)

# decide whether to sort by the count-column or the value-column
sort_values = sorted(cell_values)

# Now load the layer and apply styling
layer = processing.getObjectFromUri(input)

qCRS = QgsColorRampShader()

# Build the colour ramp using random colours
colList = ['#ff0000','#ffff00','#0000ff','#00ffff','#00ff00','#ff00ff']

lst = []
for i,val in enumerate(sort_values):
    lst.append(QgsColorRampShader.ColorRampItem(val,QColor(colList[i % 6]),str(val)))

qCRS.setColorRampItemList(lst)
qCRS.setColorRampType(QgsColorRampShader.EXACT)

shader = QgsRasterShader()
shader.setRasterShaderFunction(qCRS)

renderer = QgsSingleBandPseudoColorRenderer(layer.dataProvider(), layer.type(), shader)
layer.setRenderer(renderer)
layer.triggerRepaint()

Đó là công việc hoàn hảo, công cụ tuyệt vời! Yêu cầu táo bạo, nhưng bất kỳ cơ hội cập nhật nhãn để nó hiển thị các giá trị trong TOC? Vì một số lý do, nó không hiển thị chúng.
Ed Rollason

Xong - chỉ cần chỉnh sửa tập lệnh
Andy Harfoot

Cảm ơn rất nhiều! Btw Tôi đang kết hợp một số mô tả tính năng để có một trình kết xuất như vậy được bao gồm trong 3.0: docs.google.com/document/d/ mẹo Bất cứ ai, vui lòng kiểm tra / nhận xét / sửa đổi. Thật tuyệt vời khi có thể dễ dàng tạo kiểu cho các trình quét rời rạc bằng cách sử dụng bất kỳ cách giải quyết / kịch bản nào, ...
Stéphane Henriod

4

Bạn có thể thử điều này:

1) Tạo một kiểu đơn giản trong các thuộc tính Lớp, sau đó lưu nó vào tệp xuất bằng nút lưu. Đây là dưới dạng:

giá trị, R, G, B, Alpha, nhãn

2) Sử dụng r.c Category trong hộp công cụ (6 hoặc 7) của mô-đun xử lý. Điều này sẽ cung cấp một danh sách các giá trị raster. Sao chép các giá trị này. Bạn có thể sử dụng r.quantile cho dữ liệu liên tục.

3) Mở tệp xuất mà bạn đã lưu trước đó trong trình soạn thảo văn bản (ví dụ: notepad ++ trên windows, vô số lựa chọn trên linux). Dán các giá trị và định dạng lại cho phù hợp.

@Stephane

3a) Đối với các giá trị riêng biệt, bạn có thể đặt alpha thành 0 hoặc xóa hoặc nhận xét (sử dụng # ở đầu dòng) bất kỳ dữ liệu nào bạn không muốn hiển thị trong tệp danh mục.

3b) Đối với các giá trị liên tục, tạo một hàng cho giá trị bắt đầu và một hàng khác cho giá trị cuối. Đặt alpha cho cả hai thành 0.

4) Ví dụ: giả sử bạn đã tạo ba tệp:

chuyên mục.txt - đầu ra của r.c Category, sao chép và dán, thêm hai dòng trống ở trên cùng. Tổng chiều dài 1 cột. Kiểm tra số lượng giá trị duy nhất và tạo kiểu có cùng số lượng mục trong QGIS.

colours.txt - Tệp xuất bản đồ màu được tạo bởi QGIS với các màu bạn thích. Tổng chiều dài 6 cột.

nhãn.txt - tệp có nhãn bạn muốn, thêm hai dòng trống ở trên cùng. Tổng chiều dài 1 cột.

Sử dụng bảng tính để hợp nhất các tệp và lưu dưới dạng csv. Mở cái này trong QGIS.

Ngoài ra, trên dòng lệnh (bash hoặc msys):

paste -d, categories.txt colours.txt labels.txt |cut -d, -f 1,3-6,8 > new_style.txt

Xem thêm:

https://pvanb.wordpress.com/2014/02/05/creating-a-qgis-color-map-from-text-file/

Bảng màu nâng cao cho dữ liệu raster


Phương pháp rất hay! Tuy nhiên, nếu có một số danh mục trong raster của tôi mà tôi không muốn hiển thị, tôi bị kẹt ...
Stéphane Henriod
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.