使用类别名称将grc文件转换为shp文件

时间:2015-08-22 23:19:09

标签: python postgis raster gdal shapefile

我面临着一组只有一个带的.grc文件的问题。但是,这个文件包含几个最终属于图像不同部分的类别(我猜)。

当我从中生成形状文件(或直接使用PostGIS几何体)时,所有这些类别都合并为一个文件,该文件具有分隔的区域,但DN 1,DN 2,DN 3 ..作为它们的名称。我想在形状文件中保留类别名称。

此命令当前生成形状文件:

gdal_polygonize.py coverage.grc -f "ESRI Shapefile" output.shp

我的假设是否正确?我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

我设法通过在Python中创建自定义脚本来解决这个问题:

catnames = rasterband.GetCategoryNames()
memdriver = ogr.GetDriverByName( 'Memory' )
dst_ds = memdriver.CreateDataSource( "out" )

# create a layer with a DN field that will contain the index of 
# each category automatically
dst_layer = dst_ds.CreateLayer("out", srs = None )
fd = ogr.FieldDefn( 'DN', ogr.OFTInteger )
dst_layer.CreateField(fd)

gdal.Polygonize( rasterband, None, dst_layer, 0)

# extract features map
featmap = {}
for feature in dst_layer:
    # use the field defined above, create a mapping between
    # index -> feature name
    featname = feature.GetField("DN")
    if featname not in featmap.keys():
        featmap[featname] = [feature]
    else:
        featmap[featname].append(feature)

从此时起,dst_layer包含可以使用以下内容轻松保存为形状的矢量形状:

driver = ogr.GetDriverByName("ESRI Shapefile")
shapeData = driver.CreateDataSource(args.output_folder) #so there we will store our data

for featidx, features in featmap.iteritems():
    featname = catnames[featidx]
    layer = shapeData.CreateLayer(featname, spatialReference, ogr.wkbPolygon)
for feature in features:
    layer.CreateFeature(feature)

shapeData.Destroy() #lets close the shapefile

这将为每个功能名称(类别)创建一个.shp文件。当然,这可以调整为创建一个单独的文件,但这超出了我的问题范围。