Geometry2Raster.py 1.8 KB
# coding=utf-8
#author:        4N
#createtime:    2021/9/29
#email:         nheweijun@sina.com

from osgeo.ogr import Layer,Geometry
from osgeo import gdal,ogr


class Geometry2Raster:


    def __init__(self):
        pass

    @classmethod
    def convert(cls,geometry:Geometry,bbox, xy_res):
        '''
        根据Geometry和bbox将空间对象栅格化
        :param geometry: 空间对象
        :param bbox: 栅格化范围
        :param xy_res: 分辨率
        :return:
        '''

        #计算像素大小
        x_min,y_min,x_max, y_max = bbox
        pixel_size = (x_max - x_min) / xy_res
        #创建内存栅格对象
        target_ds = gdal.GetDriverByName('MEM').Create('', xy_res, xy_res, gdal.GDT_Byte)
        target_ds.SetGeoTransform((x_min, pixel_size, 0, y_max, 0, -pixel_size))
        band = target_ds.GetRasterBand(1)
        #创建内存图层对象,因为gdal只提供栅格化图层的方法
        layer_ds = ogr.GetDriverByName('Memory').CreateDataSource('')
        mem_layer= layer_ds.CreateLayer("mem", geom_type=ogr.wkbUnknown)
        feature_defn = mem_layer.GetLayerDefn()
        feature = ogr.Feature(feature_defn)
        feature.SetGeometry(geometry)
        mem_layer.CreateFeature(feature)
        #栅格化
        gdal.RasterizeLayer(target_ds, [1], mem_layer, burn_values=[1])
        data = band.ReadAsArray()
        del target_ds
        del layer_ds
        return data

if __name__ == '__main__':

    # Create ring
    ring = ogr.Geometry(ogr.wkbLinearRing)
    ring.AddPoint(111.62, 29)
    ring.AddPoint(111.62, 29.03)
    ring.AddPoint(111.727, 29.03)
    ring.AddPoint(111.727, 29)
    ring.AddPoint(111.62, 29)

    # Create polygon
    poly = ogr.Geometry(ogr.wkbPolygon)
    poly.AddGeometry(ring)

    poly.ExportToWkt()