如何使用python从值矩阵正确写入光栅图像(tif)

如何使用python从值矩阵正确写入光栅图像(tif),python,gis,rasterio,Python,Gis,Rasterio,我开始从事地理信息系统的工作,我需要你的一些建议。我需要将tif(光栅)转换为3D矩阵,例如,熊猫中的上一个矩阵: M = [[1, 1] [2, 4] [3, 1]] 在探索了python包之后,我发现我可以用。我使用以下代码: new_dataset = rasterio.open('test5.tif', 'w', driver='GTiff', height = arr.shape[0], width = arr.shape[1], count=1, dt

我开始从事地理信息系统的工作,我需要你的一些建议。我需要将tif(光栅)转换为3D矩阵,例如,熊猫中的上一个矩阵:

M = [[1, 1]
     [2, 4]
     [3, 1]]
在探索了python包之后,我发现我可以用。我使用以下代码:

new_dataset = rasterio.open('test5.tif', 'w', driver='GTiff', height = arr.shape[0], width = arr.shape[1], count=1, 
    dtype=str(arr.dtype),
    crs='+proj=utm +zone=19 +ellps=GRS80 +datum=NAD83 +units=m +no_defs',
    transform=transform)
)
new_dataset.write(arr, 1)
new_dataset.close()
接下来呢。因此,对于这个微小的输入,它似乎工作正常,产生以下tif:

当我尝试使用真实矩阵加载形式的las/LIDAR时,其尺寸为:(32019,5)和头部:

              x             y        z  Classification  ReturnNumber
0  506535.92650  4.762852e+06  4.98525               1             2
1  506534.48700  4.762853e+06  0.00000               2             1
2  506542.35150  4.762849e+06  0.04950               1             1
3  506544.38850  4.762848e+06  0.00000               2             1
4  506543.54475  4.762848e+06  0.00000               2             1

我得到这个:

但是,对于同一个图像,whitebox工具会生成此图像

使用此代码:

import os
import whitebox

wbt = whitebox.WhiteboxTools()
wbt.work_dir = os.path.dirname(os.path.abspath(__file__)) + "/data/"

wbt.lidar_idw_interpolation(
    i="input.las",
    output="output.tif",
    parameter="elevation",
    returns="all",
    resolution=1.0,
    weight=1.0,
    radius=2.5
)
whitebox工具的输出是正确的,比较两幅图像,第一幅像是对whitebox输出的负面影响。我的代码中有一些错误

关于如何根据其他密度矩阵更改像素(2D)的颜色,有什么建议吗


提前谢谢

显然有
(x,y)
点您没有数据,这些点在您的图片上保持黑色。另一方面,Whitebox对这些缺失的点进行某种插值


您可能希望找到这些点,并对现有相邻点中缺少的
z
值进行插值。对于你的数据可能有一些特殊的插值方法,但如果我是你,我会反复应用高斯滤波器几次,将有效数据复制到过滤后的数据上,以保持已知的良好像素不受任何更改的影响——这将用合理的近似值填充黑点。

请给我们看一下从las/LIDAR加载的
真实矩阵
,好吗?嗨@lenik,我更新了我的问题,其中包括矩阵的第一列。谢谢你是如何从形状矩阵(32019,5)中得到一个相对正方形的图像的?给定矩阵中的5列,你希望在你的图像中看到哪些列?我使用laspy软件包加载激光雷达图像。我希望获得一个2D图像(x轴和y轴)。为了创建矩阵,我应用脚本:对于I,数据中的行。ItErrorws():arr[int(row[“x”])-int(min_x)][int(row[“y”])-int(min_y)]=int(row[“z”])