QGIS का उपयोग करके स्टाइल असतत रास्टर?


11

मेरे पास असतत मूल्यों (लैंड्यूज श्रेणियां, बूलियन मूल्य ...) के साथ आपदाएं हैं। मैं उन्हें असतत तरीके से स्टाइल करना चाहूंगा:

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

मैं आर्कजीआईएस में "यूनीक कैटेगरीज" की तरह कुछ चाहता हूं: http://resources.arcgis.com/en/help/main/10.1/index.html#/repreting_unique_categories_such_as_land_use_009t00000074000000/

हालाँकि, मेरे द्वारा चुने गए सभी विकल्पों में रंग रैंप शामिल हैं ... क्या मुझे कुछ याद है?


मैंने एक सुविधा अनुरोध खोला है, क्योंकि वहाँ केवल समाधान उपलब्ध हैं, समाधान नहीं लगता: http://hub.qgis.org/issues/14845

जवाबों:


8

आप एक कस्टमाइज्ड स्टाइल स्कीम बना सकते हैं, कुछ यूनीक कैटेगरीज की तरह लेकिन आपको सभी कैटिगरी को मैनुअली जोड़ना होगा (कम से कम मुझे जो करना है, लेकिन मैं QGIS के पुराने वर्जन का इस्तेमाल कर रहा हूं)।

रैस्टर -> गुण -> शैली पर राइट क्लिक करें। वहाँ के singleband pseudocolorरूप में चुनें Render typeऔर अपने स्वयं के मूल्यों और इसी रंग जोड़ने के लिए थोड़ा लाल प्लस पर क्लिक करें। की तर्ज पर कुछ: यहाँ छवि विवरण दर्ज करें

ध्यान दें कि आप मानों को स्वचालित रूप से प्राप्त करने के लिए वर्गीकृत का भी उपयोग कर सकते हैं, लेकिन यदि आपके पास असतत मान हैं, तो आप उन्हें मैन्युअल रूप से जोड़ने से बेहतर हो सकते हैं, यह निर्भर करता है कि आपका डेटा कैसे वितरित किया गया है।

यदि आपका डेटा एक पैटर्न का अनुसरण करता है, यदि यह 0,1,2 .... 10 है, तो आप Modeबराबर अंतराल पर सेट कर सकते हैं, सीमा को परिभाषित कर सकते हैं Min:0, Max:10और Classes:11, क्लिक करें Classifyऔर आपको सभी मान स्वतः मिल जाएंगे। तब आप उन्हें बदल सकते हैं जैसा कि आप फिट देखते हैं। यहाँ छवि विवरण दर्ज करें मुझे पता है कि यह सही नहीं है, लेकिन यह सबसे अच्छा है जो मैंने अब तक पाया है। एक प्लगइन हो सकता है जो इस समस्या से निपटता है।


मैं अपने असतत रास्टर के सभी संभावित मूल्यों को स्वचालित रूप से पुनः प्राप्त करने की संभावना के लिए उम्मीद कर रहा था, लेकिन जाहिर है कि यह (अभी तक) मौजूद नहीं है। धन्यवाद!
स्टीफन हेनरिओड

जहाँ तक मैं जानता हूँ कि यह अभी तक संभव नहीं है, लेकिन ऐसा करने वाला एक प्लगइन हो सकता है।
हसन मुस्तफा

@ Stéph, स्वचालित रूप से मानों की संपूर्ण श्रेणी प्राप्त करने के लिए: 'लोड मिन / अधिकतम मान' के अंतर्गत आप 'मिनट / अधिकतम' का चयन कर सकते हैं और फिर 'लोड' पर क्लिक कर सकते हैं, फिर उस सीमा को कवर करने के लिए कक्षाओं की संख्या निर्धारित करें (हसन के नोट के अनुसार) ) और 'वर्गीकृत' पर क्लिक करें। यदि आपके पास श्रेणी में लापता मान हैं, तो आपको उन्हें मैन्युअल रूप से हटाने की आवश्यकता होगी।
सिमबामुंग

2
धन्यवाद, यह वास्तव में मेरे द्वारा उपयोग किया जाने वाला वर्कअराउंड है। लेकिन मुझे यह बहुत सहज नहीं लगता, ज्यादातर जब मैं नए उपयोगकर्ताओं को Qgis सिखाता हूं। इसके अलावा, अगर मेरे पास "6" का मूल्य है, जिसे मैं अपने रेखापुंज पर प्रदर्शित नहीं करना चाहता, तो मुझे एक समस्या है: "6" वाले सभी पिक्सेल "5" और "7" के बीच प्रक्षेपित रंग पर दांव लगा देंगे। मैं निश्चित रूप से यह कह सकता हूं कि "6" को नोडेटा माना जाना चाहिए या मैं "6" के बिना एक नया रेखापुंज बनाने के लिए रेखापुंज कैलकुलेटर का उपयोग कर सकता हूं लेकिन, फिर से, वे सभी वर्कअराउंड हैं। आदर्श रूप में, मैं एक बटन "सभी एकल मूल्यों को पुनः प्राप्त करना चाहूंगा"। अगर भविष्य के संस्करणों के लिए योजना बनाई गई है, तो मैं इसकी जांच करूंगा ...
स्टीफन हेनरिड

1
मैंने संबंधित मुद्दे पर एक टिकट बनाया है: hub.qgis.org/issues/14449
कर्ट

5

यहां एक त्वरित और गंदी प्रसंस्करण स्क्रिप्ट है जो वास्तव में वही करती है जो आप पूछ रहे हैं (रंग विकल्पों के लिए माफी!)। इसे अपनी प्रोसेसिंग स्क्रिप्ट्स डायरेक्टरी डायरेक्टरी (जैसे। C: \ Users \ .qgis2 \ processing \ script) में रखें और यह स्क्रिप्स> रैस्टर के तहत प्रोसेसिंग टूलबॉक्स में दिखाई देगा।

Unique_values_count.py स्क्रिप्ट जिस पर यह आधारित है, के लिए Yury Ryabov को क्रेडिट।

संपादित करें: मैं इसे प्रोसेसिंग स्क्रिप्ट रिपॉजिटरी में लाने के लिए सिर्फ एक पुल अनुरोध प्रस्तुत कर रहा हूं।

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

यह निर्दोष, शानदार काम करता है! चीक अनुरोध, लेकिन लेबल को अपडेट करने का कोई भी मौका ताकि यह टीओसी में मूल्यों को दर्शाता है? किसी कारण के लिए यह उन्हें नहीं दिखा रहा है।
एड रोलासन

हो गया - बस स्क्रिप्ट को संपादित किया
एंडी हरफुट

आपका बहुत बहुत धन्यवाद! Btw मैं इस तरह के रेंडर को 3.0 में शामिल करने के लिए कुछ फीचर विवरण को एक साथ रख रहा हूं: docs.google.com/document/d/… कोई भी, जाँच / टिप्पणी / संशोधन के लिए स्वतंत्र महसूस करता है। यह किसी भी वर्कअराउंड / स्क्रिप्टिंग का उपयोग करने के साथ आसानी से असतत चूहों को स्टाइल करने में सक्षम होने के लिए बहुत अच्छा होगा, ...
स्टीफन हेनरीओड

4

आप यह कोशिश कर सकते हैं:

1) परत गुणों में एक सरल शैली बनाएं, फिर इसे सहेजें बटन का उपयोग करके निर्यात फ़ाइल में सहेजें। ये फॉर्म में हैं:

मूल्य, आर, जी, बी, अल्फा, लेबल

2) प्रसंस्करण मॉड्यूल में घास (6 या 7) टूलबॉक्स में r.category का उपयोग करें। यह रेखापुंज मूल्यों की एक सूची प्रदान करना चाहिए। इन मूल्यों को कॉपी करें। आप निरंतर डेटा के लिए r.quantile का उपयोग कर सकते हैं।

3) आपके द्वारा पहले सहेजी गई निर्यात फ़ाइल खोलें (जैसे कि विंडोज़ पर नोटपैड ++, लिनक्स पर पसंद का भार)। मूल्यों और सुधार को सूट करने के लिए चिपकाएँ।

@Stephane

3a) असतत मानों के लिए, आप अल्फ़ा को 0 पर सेट कर सकते हैं, या हटा सकते हैं या टिप्पणी कर सकते हैं (लाइन के प्रारंभ में # का उपयोग करके) कोई भी डेटा जिसे आप श्रेणी फ़ाइल में प्रदर्शित नहीं करना चाहते हैं।

3 बी) निरंतर मूल्यों के लिए, प्रारंभ मूल्य के लिए एक पंक्ति और अंतिम मूल्य के लिए एक और बनाएं। दोनों को 0 में अल्फा सेट करें।

4) उदाहरण के लिए, मान लें कि आपने तीन फाइलें बनाई हैं:

श्रेणियां। txt - r.category का उत्पादन, कॉपी और पेस्ट, शीर्ष पर दो रिक्त लाइनें जोड़ें। कुल लंबाई 1 कॉलम। अद्वितीय मानों की संख्या की जाँच करें, और QGIS में समान संख्या में प्रविष्टियों के साथ एक शैली बनाएं।

colours.txt - एक QGIS जनरेटेड कलर मैप एक्सपोर्ट फाइल को आपके द्वारा पसंद किए गए रंगों के साथ। कुल लंबाई 6 कॉलम।

label.txt - आप जो लेबल चाहते हैं उसके साथ फाइल करें, शीर्ष पर दो रिक्त लाइनें जोड़ें। कुल लंबाई 1 कॉलम।

फ़ाइलों को मर्ज करने और सीएसवी के रूप में सहेजने के लिए एक स्प्रेडशीट का उपयोग करें। इसे QGIS में खोलें।

वैकल्पिक रूप से, कमांड लाइन (बैश या एमएसआई) पर:

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/

रास्टर डेटा के लिए उन्नत रंग पैलेट


बहुत अच्छी विधि! लेकिन फिर भी, अगर मेरे रेखापुंज में कुछ श्रेणियां हैं जिन्हें मैं प्रदर्शित नहीं करना चाहता, तो मैं फंस गया ...
स्टीफन हेनरिओड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.