编辑
这是执行此操作的正确方法,还有documentation:

import random
from osgeo import gdal, ogr

RASTERIZE_COLOR_FIELD = "__color__"

def rasterize(pixel_size=25):
    # Open the data source
    orig_data_source = ogr.Open("test.shp")
    # Make a copy of the layer's data source because we'll need to
    # modify its attributes table
    source_ds = ogr.GetDriverByName("Memory").CopyDataSource(
            orig_data_source, "")
    source_layer = source_ds.GetLayer(0)
    source_srs = source_layer.GetSpatialRef()
    x_min, x_max, y_min, y_max = source_layer.GetExtent()
    # Create a field in the source layer to hold the features colors
    field_def = ogr.FieldDefn(RASTERIZE_COLOR_FIELD, ogr.OFTReal)
    source_layer.CreateField(field_def)
    source_layer_def = source_layer.GetLayerDefn()
    field_index = source_layer_def.GetFieldIndex(RASTERIZE_COLOR_FIELD)
    # Generate random values for the color field (it's here that the value
    # of the attribute should be used, but you get the idea)
    for feature in source_layer:
        feature.SetField(field_index, random.randint(0, 255))
        source_layer.SetFeature(feature)
    # Create the destination data source
    x_res = int((x_max - x_min) / pixel_size)
    y_res = int((y_max - y_min) / pixel_size)
    target_ds = gdal.GetDriverByName('GTiff').Create('test.tif', x_res,
            y_res, 3, gdal.GDT_Byte)
    target_ds.SetGeoTransform((
            x_min, pixel_size, 0,
            y_max, 0, -pixel_size,
        ))
    if source_srs:
        # Make the target raster have the same projection as the source
        target_ds.SetProjection(source_srs.ExportToWkt())
    else:
        # Source has no projection (needs GDAL >= 1.7.0 to work)
        target_ds.SetProjection('LOCAL_CS["arbitrary"]')
    # Rasterize
    err = gdal.RasterizeLayer(target_ds, (3, 2, 1), source_layer,
            burn_values=(0, 0, 0),
            options=["ATTRIBUTE=%s" % RASTERIZE_COLOR_FIELD])
    if err != 0:
        raise Exception("error rasterizing layer: %s" % err)
原始问题
我正在寻找有关如何使用osgeo.gdal.RasterizeLayer()的信息(文档字符串非常简洁,在C或C++ API文档中找不到它。我只为java bindings找到了一个文档)。
我修改了unit test并在由多边形制成的.shp上进行了尝试:
import os
import sys
from osgeo import gdal, gdalconst, ogr, osr

def rasterize():
    # Create a raster to rasterize into.
    target_ds = gdal.GetDriverByName('GTiff').Create('test.tif', 1280, 1024, 3,
            gdal.GDT_Byte)
    # Create a layer to rasterize from.
    cutline_ds = ogr.Open("data.shp")
    # Run the algorithm.
    err = gdal.RasterizeLayer(target_ds, [3,2,1], cutline_ds.GetLayer(0),
            burn_values=[200,220,240])
    if err != 0:
        print("error:", err)

if __name__ == '__main__':
    rasterize()
它运行正常,但我得到的只是一个黑色.tif。burn_values参数是什么?可以使用RasterizeLayer()栅格化具有基于属性值不同颜色的要素的图层吗?
如果不能,我应该怎么用? AGG是否适合渲染地理数据(我想要抗锯齿和非常健壮的渲染器,能够正确地绘制非常大和非常小的特征,可能来自“脏数据”(退化的多边形等),有时需要指定大坐标)?
在这里,多边形通过属性的值来区分(颜色无关紧要,我只想为属性的每个值取一个不同的颜色)。

最佳答案

编辑:我想我会使用qGIS python绑定(bind):http://www.qgis.org/wiki/Python_Bindings

这是我能想到的最简单的方法。我记得以前用手滚动东西,但是很丑。即使您必须进行单独的Windows安装(使python与之配合使用)然后设置XML-RPC服务器以在单独的python进程中运行qGIS,qGIS也会更容易。

我可以使GDAL正确栅格化,这也很棒。

我有一段时间没有使用gdal了,但这是我的猜测:

如果您不使用Z值,则burn_values用于伪彩色。如果使用[255,0,0],则多边形内的所有内容均为burn=[1,2,3],burn_values=[255,0,0](红色)。我不确定点会发生什么-它们可能不会绘制。

如果要使用Z值,请使用gdal.RasterizeLayer(ds,bands,layer,burn_values, options = ["BURN_VALUE_FROM=Z"])

我只是从您正在查看的测试中提取此信息:http://svn.osgeo.org/gdal/trunk/autotest/alg/rasterize.py

另一种方法-拉出多边形对象,并使用定型绘制它们,这可能没有吸引力。或研究geodjango(我认为它使用openlayers使用JavaScript绘制到浏览器中)。

另外,您需要栅格化吗?如果您确实需要精度,则PDF导出可能会更好。

实际上,我认为我发现使用Matplotlib(在提取和投影特征之后)比栅格化更容易,而且我可以获得更多的控制权。

编辑:

下面是一个较低级别的方法:

http://svn.osgeo.org/gdal/trunk/gdal/swig/python/samples/gdal2grd.py\

最后,您可以遍历多边形(将其转换为局部投影之后),然后直接绘制它们。但是,最好不要使用复杂的多边形,否则会有些悲痛。如果您有复杂的多边形...如果想滚动自己的绘图仪,最好使用http://trac.gispython.org/lab中的shape和r-tree。

Geodjango可能是一个问的好地方..他们会比我知道更多的东西。他们有邮件列表吗?周围也有很多python映射专家,但是似乎没有人担心。我猜他们只是将其绘制在qGIS或GRASS之类的文件中。

认真地说,我希望知道自己在做什么的人可以答复。

关于python - 栅格化GDAL层,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2220749/

10-16 22:45