Python 从numpy阵列创建光栅,从csv文件中获取值

Python 从numpy阵列创建光栅,从csv文件中获取值,python,numpy,raster,gdal,Python,Numpy,Raster,Gdal,我有一个朋友。我想用csv表格中的相应值替换光栅中的值 光栅的类别值为0到n,csv为光栅的每个类别n都有一个计算值(例如点密度)。 我想根据csv中的相应值创建一个新光栅 我正在使用GDAL和numpy。我尝试了熊猫,但遇到了从csv到光栅熊猫数据框提取值的问题。我将在相应csv表的光栅列表上执行此操作 下面是我的数据示例(一个光栅) 我有从光栅创建阵列和从阵列写回光栅的代码。我从不同的stackexchange站点发现了它。 我不知道如何设置循环的帧,以从新光栅中的csv获取值。 我下面的“

我有一个朋友。我想用csv表格中的相应值替换光栅中的值

光栅的类别值为0到n,csv为光栅的每个类别n都有一个计算值(例如点密度)。 我想根据csv中的相应值创建一个新光栅

我正在使用GDAL和numpy。我尝试了熊猫,但遇到了从csv到光栅熊猫数据框提取值的问题。我将在相应csv表的光栅列表上执行此操作

下面是我的数据示例(一个光栅)

我有从光栅创建阵列和从阵列写回光栅的代码。我从不同的stackexchange站点发现了它。 我不知道如何设置循环的帧,以从新光栅中的csv获取值。 我下面的“for循环”代码不完整。 谁能帮忙吗

import numpy, sys
from osgeo import gdal
from osgeo.gdalconst import *

inRst = gdal.Open(r"c:/Raster1.tif")
band = inRst.GetRasterBand(1)
rows = inRst.RasterYSize
cols = inRst.RasterXSize
rstr_arry = band.ReadAsArray(0,0,cols,rows)

# create the output image
driver = inRst.GetDriver()
#print driver
outRst = driver.Create(r"c:/NewRstr.tif", cols, rows, 1, GDT_Int32)
outBand = outRst.GetRasterBand(1)
outData = numpy.zeros((rows,cols), numpy.int32)

for i in range(0, rows):
    for j in range(0, cols):
        if rstr_arry[i,j] =  :
            outData[i,j] = 
        elif rstr_arry[i,j] = :
            outData[i,j] = 
        else:
            outData[i,j] = 


# write the data
outRst= outBand.WriteArray(outData, 0, 0)
# flush data to disk, set the NoData value and calculate stats
outBand.FlushCache()
outBand.SetNoDataValue(-99)
# georeference the image and set the projection
outDs.SetGeoTransform(inDs.GetGeoTransform())
outDs.SetProjection(inDs.GetProjection())

如果我没有误解您想要实现的目标,您首先必须读取csv文件并创建
值到
密度
值的映射。可以这样做:

{0: 6, 1: 9, 2: 4, 3: 9, 4: 7, 5: 2}
导入csv
映射={}
打开('test.csv')作为csv\u文件:
csv\u reader=csv.DictReader(csv\u文件)
对于csv_读取器中的行:
映射[int(行['Class'])]=int(行['Density'])
您将获得如下所示的
dict

{0: 6, 1: 9, 2: 4, 3: 9, 4: 7, 5: 2}
然后可以使用创建需要替换的遮罩矩阵,并替换元素。在执行此操作之前,您需要展平光栅阵列,并在写回结果之前恢复其形状。 (替换numpy数组中元素的替代方法可以在以下问题的答案中找到:)

然后,您几乎可以按计划编写数据:

outBand.WriteArray(rstr_arry, 0, 0)
outBand.SetNoDataValue(-99)

outDs.SetGeoTransform(inRst.GetGeoTransform())
outDs.SetProjection(inRst.GetProjection())

outBand.FlushCache()

在示例数据上测试它:

rstr_arry = np.asarray([
    [5, 2, 2, 3],
    [0, 3, 1, 4],
    [2, 0, 1, 3]])

mapping = {0: 6, 1: 9, 2: 4, 3: 9, 4: 7, 5: 2}

s = rstr_arry.shape
rstr_arry = rstr_arry.reshape(-1)
replace = numpy.array([list(mapping.keys()), list(mapping.values())])
mask = numpy.in1d(rstr_arry, replace[0, :])
rstr_arry[mask] = replace[1, numpy.searchsorted(replace[0, :], rstr_arry[mask])]
rstr_arry = rstr_arry.reshape(s)

print(rstr_arry)
# [[2 4 4 9]
#  [6 9 9 7]
#  [4 6 9 9]]
rstr_arry = np.asarray([
    [5, 2, 2, 3],
    [0, 3, 1, 4],
    [2, 0, 1, 3]])

mapping = {0: 6, 1: 9, 2: 4, 3: 9, 4: 7, 5: 2}

s = rstr_arry.shape
rstr_arry = rstr_arry.reshape(-1)
replace = numpy.array([list(mapping.keys()), list(mapping.values())])
mask = numpy.in1d(rstr_arry, replace[0, :])
rstr_arry[mask] = replace[1, numpy.searchsorted(replace[0, :], rstr_arry[mask])]
rstr_arry = rstr_arry.reshape(s)

print(rstr_arry)
# [[2 4 4 9]
#  [6 9 9 7]
#  [4 6 9 9]]