QGIS使用栅格图层

使用栅格图层

图层详细信息

栅格图层一般包含一个或多个波段,即单波段栅格图层或多波段栅格图层。一般来说彩色图形包含红、蓝、绿三个波段。单波段图层一般用来表示连续变量(如高程)或离散变量(如土地利用)。在有些情况下,栅格图层包含一个调色板,栅格值对应的颜色会存储在调色板中,下面代码获取栅格图层的基本信息,例如长度、宽度、范围波段数、元数据等等。

rlayer.width(), rlayer.height()
(812, 301)
rlayer.extent()

rlayer.extent().toString()
u'12.095833,48.552777 : 18.863888,51.056944'
rlayer.rasterType()
2  # 0 = GrayOrUndefined (single band), 1 = Palette (single band), 2 = Multiband
rlayer.bandCount()
3
rlayer.metadata()
u'

Driver:

...' rlayer.hasPyramids() False

渲染器

当栅格图层加载后,QGIS会根据栅格类型使用一个默认的渲染器。渲染器可以在图层的属性中修改,也可以使用程序修改.下面代码查询当前使用的渲染器:

rlayer.renderer()



>>> rlayer.renderer().type()

u'singlebandpseudocolor'

使用QgsRasterLayer对象的setRenderer()方法可以给图层设置渲染器,可选的渲染器包括:
* QgsMultiBandColorRenderer * QgsPalettedRasterRenderer * QgsSingleBandColorDataRenderer * QgsSingleBandGrayRenderer * QgsSingleBandPseudoColorRenderer 这些渲染器全部继承于QgsRasterRenderer。

单波段栅格图层既可以以灰度图的方式显示,也可以通过色带映射的方式以彩色方式显示。多波段栅格图层,一般把波段映射成RGB颜色值进行显示。当然多波段栅格图层也可以使用灰度或者色带的方式显示其中的一个波段。

下面的小节会展开介绍如何查询和修改栅格图层的显示风格。
单波段栅格图层

下面的例子使用一个从绿色到黄色的色带(对应栅格值0-255)来渲染单波段栅格图层,首先创建一个QgsRasterShader对象,并配置他的shader函数:

fcn = QgsColorRampShader()

fcn.setColorRampType(QgsColorRampShader.INTERPOLATED)
lst = [ QgsColorRampShader.ColorRampItem(0, QColor(0,255,0)), \
QgsColorRampShader.ColorRampItem(255, QColor(255,255,0)) ]
fcn.setColorRampItemList(lst)
shader = QgsRasterShader()
shader.setRasterShaderFunction(fcn)

shader函数完成像素值和颜色值的映射,映射方式有三种:
* 线性:使用线性插值的方式获得像素的颜色值
* 离散:像素值大于或等于某一个阈值对应的颜色值,类似与ArcGIS中的分类渲染
* 精确:不进行插值,只有设置的色带中有对应的值才显示,类似于ArcGIS中的唯一值渲染
第二步,给栅格图层设置渲染器:

renderer = QgsSingleBandPseudoColorRenderer(layer.dataProvider(), 1, shader)
layer.setRenderer(renderer)

代码中的数字1为波段号。
多波段栅格图层

默认情况下,QGIS的多波段栅格图层使用RGB模式来生成彩色图像,有些情况下,如果用户想重置这个设置,可以使用下面的代码,代码重设了波段对应RGB的顺序,把波段1设为G,把波段2设为R:
rlayer.renderer().setGreenBand(1)
rlayer.renderer().setRedBand(2)

刷新图层

当用户修改了图层的符号设置并且需要立即显示的话,需要立即刷新图层,代码如下:
if hasattr(layer, “setCacheImage”):
layer.setCacheImage(None)
layer.triggerRepaint()

前两行代码确保图层的缓存图片被删除。该方法在QGIS1.4以后有效,为了兼容QGIS的所有版本,请在使用前检查该函数是否存在。
triggerRepaint()方法用来强制地图刷新。
需要注意的是,对于WMS服务,只使用这个方法无效,还需要重新加载数据,刷新才会起作用,代码如下:
layer.dataProvider().reloadData()
layer.triggerRepaint()

在有些情况下,用户修改完图层的符号设置后,需要更新Layer List显示的图例,通过下面代码可以实现:
iface.legendInterface().refreshLayerSymbology(layer)

查询值

查询栅格图层中特定位置的值,使用identify()方法即可,代码如下:
ident = rlayer.dataProvider().identify(QgsPoint(15.30, 40.98), \
QgsRaster.IdentifyFormatValue)
if ident.isValid():
print ident.results()

result方法的返回结果是一个字段对象,包含每个波段对应的值:
{1: 17, 2: 220}

你可能感兴趣的:(QGIS,GIS)