Преобразование вектора (.shp) в растр (.tiff) с использованием библиотеки Python GDAL - PullRequest
1 голос
/ 20 января 2020

Я пытаюсь преобразовать векторный шейп-файл в растровый TIFF-файл. Я адаптировал исходный код из Python Поваренной книги геопространственного анализа Майкла Динера. Код работает для шейп-файлов линий и многоугольников, но показывает только черный экран для шейп-файлов точек.

def main(shapefile):

#making the shapefile as an object.
input_shp = ogr.Open(shapefile)

#getting layer information of shapefile.
shp_layer = input_shp.GetLayer()

#pixel_size determines the size of the new raster.
#pixel_size is proportional to size of shapefile.
pixel_size = 0.1

#get extent values to set size of output raster.
x_min, x_max, y_min, y_max = shp_layer.GetExtent()

#calculate size/resolution of the raster.
x_res = int((x_max - x_min) / pixel_size)
y_res = int((y_max - y_min) / pixel_size)

#get GeoTiff driver by 
image_type = 'GTiff'
driver = gdal.GetDriverByName(image_type)

#passing the filename, x and y direction resolution, no. of bands, new raster.
new_raster = driver.Create(output_raster, x_res, y_res, 1, gdal.GDT_Byte)

#transforms between pixel raster space to projection coordinate space.
new_raster.SetGeoTransform((x_min, pixel_size, 0, y_min, 0, pixel_size))

#get required raster band.
band = new_raster.GetRasterBand(1)

#assign no data value to empty cells.
no_data_value = -9999
band.SetNoDataValue(no_data_value)
band.FlushCache()

#main conversion method
gdal.RasterizeLayer(new_raster, [1], shp_layer, burn_values=[255])

#adding a spatial reference
new_rasterSRS = osr.SpatialReference()
new_rasterSRS.ImportFromEPSG(2975)
new_raster.SetProjection(new_rasterSRS.ExportToWkt())
return gdal.Open(output_raster)

Итак, моя проблема:

Что мне изменить в коде, чтобы он работал для точечных шейп-файлов тоже? и как мне получить мой окончательный выходной растровый файл того же цвета, что и входной векторный файл?

В коде работают следующие вещи: 1. получение ввода и возвращение вывода должным образом. 2. получить правильный размер / разрешение и создать растр необходимого разрешения. 3. правильные формы на выходе для полигональных и линейных шейп-файлов.

1 Ответ

0 голосов
/ 24 января 2020

Если вы хотите сохранить имеющийся у вас код, вы можете добавить параметр ALL_TOUCHED и установить его на TRUE.

Измените строку растрирования на:

gdal.RasterizeLayer(new_raster, [1], shp_layer, 
                    burn_values=[255], 
                    options=['ALL_TOUCHED=FALSE'])

Однако вы можете также рассмотреть возможность использования привязок к утилитам командной строки, так как это сэкономит вам много кода. Например:

input_shp = ogr.Open(shape_file)
shp_layer = input_shp.GetLayer()

pixel_size = 0.1
xmin, xmax, ymin, ymax = shp_layer.GetExtent()

ds = gdal.Rasterize(output_raster, shape_file, xRes=pixel_size, yRes=pixel_size, 
                    burnValues=255, outputBounds=[xmin, ymin, xmax, ymax], 
                    outputType=gdal.GDT_Byte)
ds = None
...