Python:以优雅的方式进行改进,并保存一个函数,以避免出现几个if…else语句

Python:以优雅的方式进行改进,并保存一个函数,以避免出现几个if…else语句,python,performance,optimization,if-statement,Python,Performance,Optimization,If Statement,我编写了以下函数。此函数读取*.las点格式,并通过GDAL创建光栅栅格图像。使用dtype我可以选择以下光栅栅格的格式。我使用了几个if…else语句,但我希望我的代码中有一些建议,以节省代码行,并使我的函数更加优雅 if dtype == "GDT_Unknown": # Unknown or unspecified type target_ds = gdal.GetDriverByName('GTiff').Create(outFile, nx,ny, 1, gda

我编写了以下函数。此函数读取*.las点格式,并通过GDAL创建光栅栅格图像。使用dtype我可以选择以下光栅栅格的格式。我使用了几个if…else语句,但我希望我的代码中有一些建议,以节省代码行,并使我的函数更加优雅

    if dtype == "GDT_Unknown": # Unknown or unspecified type
        target_ds = gdal.GetDriverByName('GTiff').Create(outFile, nx,ny, 1, gdal.GDT_Unknown)
    elif dtype == "GDT_Byte": # Eight bit unsigned integer
        target_ds = gdal.GetDriverByName('GTiff').Create(outFile, nx,ny, 1, gdal.GDT_Byte)
    elif dtype == "GDT_UInt16": # Sixteen bit unsigned integer
        target_ds = gdal.GetDriverByName('GTiff').Create(outFile, nx,ny, 1, gdal.GDT_UInt16)
    elif dtype == "GDT_Int16": # Sixteen bit signed integer
        target_ds = gdal.GetDriverByName('GTiff').Create(outFile, nx,ny, 1, gdal.GDT_Int16)
    elif dtype == "GDT_UInt32": # Thirty two bit unsigned integer
        target_ds = gdal.GetDriverByName('GTiff').Create(outFile, nx,ny, 1, gdal.GDT_UInt32)
    elif dtype == "GDT_Int32": # Thirty two bit signed integer
        target_ds = gdal.GetDriverByName('GTiff').Create(outFile, nx,ny, 1, gdal.GDT_Int32)
    elif dtype == "GDT_Float32": # Thirty two bit floating point
        target_ds = gdal.GetDriverByName('GTiff').Create(outFile, nx,ny, 1, gdal.GDT_Float32)
    elif dtype == "GDT_Float64": # Sixty four bit floating point
        target_ds = gdal.GetDriverByName('GTiff').Create(outFile, nx,ny, 1, gdal.GDT_Float64)
    elif dtype == "GDT_CInt16": # Complex Int16
        target_ds = gdal.GetDriverByName('GTiff').Create(outFile, nx,ny, 1, gdal.GDT_CInt16)
    elif dtype == "GDT_CInt32": # Complex Int32
        target_ds = gdal.GetDriverByName('GTiff').Create(outFile, nx,ny, 1, gdal.GDT_CInt32)
    elif dtype == "GDT_CFloat32": # Complex Float32
        target_ds = gdal.GetDriverByName('GTiff').Create(outFile, nx,ny, 1, gdal.GDT_CFloat32)
    elif dtype == "GDT_CFloat64": # Complex Float64
        target_ds = gdal.GetDriverByName('GTiff').Create(outFile, nx,ny, 1, gdal.GDT_CFloat64)
提前谢谢

def LAS2MAXGrid(inFile,outFile,gridSize=1,dtype="GDT_Float32",nodata=-9999.00,BBOX=None,EPSG=None):
    if BBOX == None:
        X = []
        Y = []
        for p in lasfile.File(inFile,None,'r'):
            X.append(p.x)
            Y.append(p.y)
        xmax, xmin = max(X),min(X)
        ymax, ymin = max(Y), min(Y)
        del X,Y
    else:
        xmax,xmin,ymax,ymin = BBOX[0],BBOX[1],BBOX[2],BBOX[3]
    # number of row and columns
    nx = int(math.ceil(abs(xmax - xmin)/gridSize))
    ny = int(math.ceil(abs(ymax - ymin)/gridSize))
    # Create an array to hold the values
    data = np.zeros((ny, nx))
    # read all points line-by-line
    for p in lasfile.File(inFile,None,'r'):
        # Compute the x and y offsets for where this point would be in the raster
        dx = int((p.x - xmin)/gridSize)
        dy = int((ymax - p.y)/gridSize)
        if data[dy,dx] >= p.z:
            data[dy,dx] = data[dy,dx]
        elif data[dy,dx] < p.z:
            # Add the z value for that pixel
            data[dy,dx] = p.z
    # Replacing values equal than a limit in a numpy array
    np.putmask(data, data == 0.00,nodata)
     # Create gtif
    if dtype == "GDT_Unknown": # Unknown or unspecified type
        target_ds = gdal.GetDriverByName('GTiff').Create(outFile, nx,ny, 1, gdal.GDT_Unknown)
    elif dtype == "GDT_Byte": # Eight bit unsigned integer
        target_ds = gdal.GetDriverByName('GTiff').Create(outFile, nx,ny, 1, gdal.GDT_Byte)
    elif dtype == "GDT_UInt16": # Sixteen bit unsigned integer
        target_ds = gdal.GetDriverByName('GTiff').Create(outFile, nx,ny, 1, gdal.GDT_UInt16)
    elif dtype == "GDT_Int16": # Sixteen bit signed integer
        target_ds = gdal.GetDriverByName('GTiff').Create(outFile, nx,ny, 1, gdal.GDT_Int16)
    elif dtype == "GDT_UInt32": # Thirty two bit unsigned integer
        target_ds = gdal.GetDriverByName('GTiff').Create(outFile, nx,ny, 1, gdal.GDT_UInt32)
    elif dtype == "GDT_Int32": # Thirty two bit signed integer
        target_ds = gdal.GetDriverByName('GTiff').Create(outFile, nx,ny, 1, gdal.GDT_Int32)
    elif dtype == "GDT_Float32": # Thirty two bit floating point
        target_ds = gdal.GetDriverByName('GTiff').Create(outFile, nx,ny, 1, gdal.GDT_Float32)
    elif dtype == "GDT_Float64": # Sixty four bit floating point
        target_ds = gdal.GetDriverByName('GTiff').Create(outFile, nx,ny, 1, gdal.GDT_Float64)
    elif dtype == "GDT_CInt16": # Complex Int16
        target_ds = gdal.GetDriverByName('GTiff').Create(outFile, nx,ny, 1, gdal.GDT_CInt16)
    elif dtype == "GDT_CInt32": # Complex Int32
        target_ds = gdal.GetDriverByName('GTiff').Create(outFile, nx,ny, 1, gdal.GDT_CInt32)
    elif dtype == "GDT_CFloat32": # Complex Float32
        target_ds = gdal.GetDriverByName('GTiff').Create(outFile, nx,ny, 1, gdal.GDT_CFloat32)
    elif dtype == "GDT_CFloat64": # Complex Float64
        target_ds = gdal.GetDriverByName('GTiff').Create(outFile, nx,ny, 1, gdal.GDT_CFloat64)
    # top left x, w-e pixel resolution, rotation, top left y, rotation, n-s pixel resolution
    target_ds.SetGeoTransform((xmin, gridSize, 0,ymax, 0, -gridSize))
    # set the reference info
    if EPSG is None:
        # Source has no projection (needs GDAL >= 1.7.0 to work)
        target_ds.SetProjection('LOCAL_CS["arbitrary"]')
    else:
        proj = osr.SpatialReference()
        proj.ImportFromEPSG(EPSG)
        # Make the target raster have the same projection as the source
        target_ds.SetProjection(proj.ExportToWkt())
    # write the band
    target_ds.GetRasterBand(1).WriteArray(data)
    target_ds.GetRasterBand(1).SetNoDataValue(nodata)
    target_ds = None
def LAS2MAXGrid(infle,outFile,gridSize=1,dtype=“GDT_Float32”,nodata=-9999.00,BBOX=None,EPSG=None):
如果BBOX==无:
X=[]
Y=[]
对于lasfile.File(infle,None,'r')中的p:
附加(p.X)
Y.追加(p.Y)
xmax,xmin=max(X),min(X)
ymax,ymin=最大值(Y),最小值(Y)
德尔X,Y
其他:
xmax,xmin,ymax,ymin=BBOX[0],BBOX[1],BBOX[2],BBOX[3]
#行数和列数
nx=int(math.ceil(abs(xmax-xmin)/gridSize))
ny=int(数学单元(abs(ymax-ymin)/gridSize))
#创建一个数组来保存这些值
数据=np.零((ny,nx))
#逐行阅读所有要点
对于lasfile.File(infle,None,'r')中的p:
#计算该点在光栅中的位置的x和y偏移
dx=int((p.x-xmin)/gridSize)
dy=int((ymax-p.y)/gridSize)
如果数据[dy,dx]>=p.z:
数据[dy,dx]=数据[dy,dx]
elif数据[dy,dx]=1.7.0才能工作)
target_ds.SetProjection('LOCAL_CS[“任意”]”)
其他:
proj=osr.SpatialReference()
项目进口项目(EPSG)
#使目标光栅与源光栅具有相同的投影
目标设置投影(proj.ExportToWkt())
#写乐队
target_ds.GetRasterBand(1.WriteArray(数据)
target_ds.GetRasterBand(1).setNodeataValue(nodata)
目标\u ds=无

您可以尝试以下方法:

dtypes = {
    "GDT_Unknown": gdal.GDT_Unknown,
    "GDT_Byte": gdal.GDT_Byte, 
    # etc
}

target_ds = gdal.GetDriverByName('GTiff').Create(outFile, nx,ny, 1, dtypes[dtype])

由于您的
dtype
变量名与您尝试使用的
gdal
变量名相匹配,因此类似的方法应该可以正常工作

target_ds = gdal.GetDriverByName('GTiff').Create(outFile, nx,ny, 1, gdal.__getattribute__(dtype))

这个班轮怎么样

target_ds = gdal.GetDriverByName('GTiff').Create(outFile, nx,ny, 1, getattr(gdal, dtype))
您还可以将其包装在try/catch语句中,以防不需要“dtype”值

try:
    target_ds = gdal.GetDriverByName('GTiff').Create(outFile, nx,ny, 1, getattr(gdal, dtype))
except:
    target_ds = None

编辑:对不起,唯美主义者,当我开始回答你的帖子时,我不是有意抄袭你的答案的(

也许您可以创建一个dict,将所有数据类型作为键,并使用它们相应的目标值,然后…
target\u ds=dictDtype[dtype]
getattr
无论如何都更干净。