จัดแต่งทรงผมแบบไม่ต่อเนื่องโดยใช้ QGIS?


11

ฉันมีแรสเตอร์ที่มีค่าไม่ต่อเนื่อง (ประเภทการใช้ที่ดินค่าบูลีน ... ) ฉันต้องการที่จะสามารถจัดวางพวกเขาในลักษณะที่ไม่ต่อเนื่อง:

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

ฉันต้องการบางอย่างเช่น "หมวดหมู่ที่ไม่ซ้ำ" ใน ArcGIS: http://resources.arcgis.com/th/help/main/10.1/index.html#/representing_unique_categories_such_as_land_use/009t00000074000000/

อย่างไรก็ตามตัวเลือกทั้งหมดที่ฉันเห็นเกี่ยวข้องกับทางลาดสี ... ฉันพลาดอะไรไปหรือเปล่า


ฉันเปิดคำขอคุณลักษณะเนื่องจากดูเหมือนว่าจะมีเพียงวิธีแก้ปัญหาเท่านั้นไม่ใช่วิธีแก้ปัญหา: http://hub.qgis.org/issues/14845

คำตอบ:


8

คุณสามารถสร้างรูปแบบสไตล์ที่กำหนดเองบางอย่างเช่นหมวดหมู่ที่ไม่ซ้ำกัน แต่คุณจะต้องเพิ่มหมวดหมู่ทั้งหมดด้วยตนเอง (ฉันต้องใช้อย่างน้อยที่สุด แต่ฉันใช้ QGIS รุ่นเก่ากว่า)

คลิกขวาที่ raster -> properties -> style ในนั้นเลือกsingleband pseudocolorเป็นRender typeและคลิกที่เครื่องหมายบวกสีแดงเพื่อเพิ่มค่าของคุณเองและสีที่เกี่ยวข้อง บางสิ่งบางอย่างตาม: ป้อนคำอธิบายรูปภาพที่นี่

โปรดทราบว่าคุณยังสามารถใช้การจัดประเภทเพื่อรับค่าโดยอัตโนมัติ แต่ถ้าคุณมีค่าที่แยกจากกันคุณอาจจะดีกว่าที่จะเพิ่มค่าเหล่านั้นด้วยตนเองขึ้นอยู่กับวิธีการกระจายข้อมูลของคุณ

ถ้าข้อมูลของคุณตามรูปแบบถ้ามันเป็น 0,1,2 .... 10 คุณสามารถตั้งค่าModeเพื่อช่วงเวลาเท่ากันกำหนดช่วงMin:0, Max:10และClasses:11คลิกClassifyและคุณจะได้รับค่าทั้งหมดโดยอัตโนมัติ จากนั้นคุณสามารถปรับเปลี่ยนได้ตามที่เห็นสมควร ป้อนคำอธิบายรูปภาพที่นี่ ฉันรู้ว่ามันไม่สมบูรณ์แบบ แต่นี่คือสิ่งที่ดีที่สุดที่ฉันเคยพบมา อาจมีปลั๊กอินที่เกี่ยวข้องกับปัญหานี้


ฉันหวังว่าจะเป็นไปได้ที่จะดึงค่าทั้งหมดที่เป็นไปได้ของแรสเตอร์โดยสิ้นเชิงของฉันโดยอัตโนมัติ ขอบคุณ!
Stéphane Henriod

เท่าที่ฉันทราบมันยังเป็นไปไม่ได้ แต่อาจมีปลั๊กอินที่ทำสิ่งนี้
Hasan Mustafa

@ Stéphเพื่อรับค่าทั้งหมดโดยอัตโนมัติ: ภายใต้ 'โหลดขั้นต่ำ / ค่าสูงสุด' คุณสามารถเลือก 'ต่ำสุด / สูงสุด' แล้วคลิก 'โหลด' จากนั้นตั้งค่าจำนวนคลาสเพื่อให้ครอบคลุมช่วงนั้น (ตามหมายเหตุของ Hasan ) และคลิก 'แยกประเภท' หากคุณไม่มีค่าในช่วงคุณจะต้องลบค่าเหล่านั้นด้วยตนเอง
Simbamangu

2
ขอบคุณนั่นเป็นวิธีแก้ปัญหาที่ฉันใช้ แต่ฉันไม่พบว่าใช้งานง่ายมากส่วนใหญ่เมื่อฉันสอน Qgis แก่ผู้ใช้ใหม่ ยิ่งไปกว่านั้นถ้าฉันมีค่า "6" ที่ฉันไม่ต้องการให้ปรากฏบนแรสเตอร์ของฉันฉันมีปัญหา: พิกเซลทั้งหมดที่มี "6" จะเดิมพันสีที่แทรกระหว่าง "5" และ "7" แน่นอนฉันสามารถพูดได้ว่า "6" ควรได้รับการพิจารณาเป็น NoData หรือฉันสามารถใช้เครื่องคำนวณแรสเตอร์เพื่อสร้างแรสเตอร์ใหม่โดยไม่มี "6" แต่อีกครั้งนั่นเป็นวิธีแก้ปัญหาทั้งหมด โดยหลักการแล้วฉันต้องการให้ปุ่ม "ดึงค่าเดียวทั้งหมด" ฉันจะตรวจสอบหากมีการวางแผนสำหรับอนาคตรุ่น ...
Stéphane Henriod

1
ฉันได้สร้างตั๋วในเรื่องที่เกี่ยวข้องแล้ว: hub.qgis.org/issues/14449
Kurt Menke

5

นี่คือสคริปต์การประมวลผลที่รวดเร็วและสกปรกที่ทำสิ่งที่คุณต้องการอย่างแท้จริง (ขออภัยในการเลือกสี!) วางไว้ในไดเรกทอรีสคริปต์การประมวลผลของคุณ (เช่น C: \ Users \ .qgis2 \ processing \ script) และมันจะปรากฏในกล่องเครื่องมือการประมวลผลภายใต้สคริปต์> Raster

มอบเครดิตให้แก่ Yury Ryabov สำหรับสคริปต์ Unique_values_count.py ซึ่งเป็นไปตามนี้

แก้ไข: ฉันแค่ส่งคำขอดึงเพื่อรับสิ่งนี้ในพื้นที่เก็บข้อมูลการประมวลผลสคริปต์

##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()

มันใช้งานได้ดีไร้ที่ติ! คำขอ Cheeky แต่มีโอกาสในการอัปเดตฉลากเพื่อให้แสดงค่าใน TOC หรือไม่ ด้วยเหตุผลบางอย่างมันไม่แสดงให้พวกเขาเห็น
Ed Rollason

เสร็จสิ้น - เพิ่งแก้ไขสคริปต์
Andy Harfoot

ขอบคุณมาก! Btw ฉันกำลังรวบรวมคำอธิบายคุณลักษณะบางอย่างเพื่อให้มีโหมดแสดงภาพรวมอยู่ใน 3.0: docs.google.co.th/document/d/… ใครก็ตามอย่าลังเลที่จะตรวจสอบ / แสดงความคิดเห็น / แก้ไข มันจะเป็นการดีถ้าคุณสามารถจัดสไตล์ rasters แยกกันได้อย่างง่ายดายด้วยการใช้วิธีแก้ปัญหา / การเขียนสคริปต์ใด ๆ ...
Stéphane Henriod

4

คุณสามารถลองสิ่งนี้:

1) สร้างสไตล์อย่างง่ายในคุณสมบัติเลเยอร์จากนั้นบันทึกลงในไฟล์ส่งออกโดยใช้ปุ่มบันทึก เหล่านี้อยู่ในรูปแบบ:

ค่า, R, G, B, Alpha, ฉลาก

2) ใช้ r.category ในกล่องเครื่องมือหญ้า (6 หรือ 7) ของโมดูลการประมวลผล สิ่งนี้ควรจัดทำรายการค่าแรสเตอร์ คัดลอกค่าเหล่านี้ คุณสามารถใช้ r.quantile สำหรับข้อมูลต่อเนื่อง

3) เปิดไฟล์ส่งออกที่คุณบันทึกไว้ก่อนหน้านี้ในเท็กซ์เอดิเตอร์ (เช่น notepad ++ บน windows โหลดตัวเลือกบน linux) วางค่าและฟอร์แมตใหม่ให้เหมาะสม

@Stephane

3a) สำหรับค่าที่ไม่ต่อเนื่องคุณสามารถตั้งค่า alpha เป็น 0 หรือลบหรือใส่เครื่องหมายข้อคิดเห็น (ใช้ # ที่จุดเริ่มต้นของบรรทัด) ข้อมูลใด ๆ ที่คุณไม่ต้องการแสดงในไฟล์หมวดหมู่

3b) สำหรับค่าต่อเนื่องสร้างแถวสำหรับค่าเริ่มต้นและอีกค่าสำหรับค่าสิ้นสุด ตั้งค่าอัลฟาสำหรับทั้งคู่เป็น 0

4) ตัวอย่างเช่นสมมติว่าคุณสร้างสามไฟล์:

categories.txt - ผลลัพธ์ของ r.category คัดลอกและวางเพิ่มสองบรรทัดว่างที่ด้านบน ความยาวรวม 1 คอลัมน์ ตรวจสอบจำนวนค่าที่ไม่ซ้ำกันและสร้างสไตล์ที่มีจำนวนรายการเท่ากันใน QGIS

colours.txt - ไฟล์ส่งออกแผนที่สี QGIS ที่สร้างขึ้นด้วยสีที่คุณชอบ ความยาวรวม 6 คอลัมน์

labels.txt - ไฟล์ที่มีป้ายกำกับที่คุณต้องการเพิ่มบรรทัดว่างสองบรรทัดที่ด้านบน ความยาวรวม 1 คอลัมน์

ใช้สเปรดชีตเพื่อรวมไฟล์และบันทึกเป็น csv เปิดสิ่งนี้ใน QGIS

อีกวิธีหนึ่งบนบรรทัดคำสั่ง (bash หรือ msys):

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

ดูสิ่งนี้ด้วย:

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

จานสีขั้นสูงสำหรับข้อมูลแรสเตอร์


เป็นวิธีที่ดีมาก! แต่ถึงกระนั้นหากมีบางหมวดหมู่ในแรสเตอร์ของฉันที่ฉันไม่ต้องการที่จะแสดงฉันติดอยู่ ...
Stéphane Henriod
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.