欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python實現分段讀取和保存遙感數據

 更新時間:2023年08月17日 09:56:27   作者:等待著冬天的風  
當遇到批量讀取大量遙感數據進行運算的時候,如果不進行分段讀取操作的話,電腦內存可能面臨著不夠使用的情況,所以我們要進行分段讀取數據然后進行運算,運算結束之后把這段數據保存成tif文件,本文介紹了Python實現分段讀取和保存遙感數據,需要的朋友可以參考下

1 分段讀取數據

在這里插入圖片描述

如圖所示,有三個這樣的數據,且該數據為5600行6800列,我們可以分成10個批次分段讀取該TIF數據,10個批次以此為0,560,1120,1680,2240,2800,3360,3920,4480,5040,5600。

代碼實現:

import os
import numpy as np
from osgeo import gdal, gdalnumeric
def read_tif(filepath):
    dataset = gdal.Open(filepath)
    col = dataset.RasterXSize#圖像長度
    row = dataset.RasterYSize#圖像寬度
    geotrans = dataset.GetGeoTransform()#讀取仿射變換
    proj = dataset.GetProjection()#讀取投影
    data = dataset.ReadAsArray()#轉為numpy格式
    data = data.astype(np.float32)
    # a = data[0][0]
    # data[data == a] = np.nan
    data[data <= -3] = np.nan
    return [col, row, geotrans, proj, data]
def read_tif02(file):
    data = gdalnumeric.LoadFile(file)
    data = data.astype(np.float32)
    # a = data[0][0]
    # data[data == a] = np.nan
    data[data <= -3] = np.nan
    return data
def get_all_file_name(ndvi_file):
    list1=[]
    if os.path.isdir(ndvi_file):
        fileList = os.listdir(ndvi_file)
        for f in fileList:
            file_name= ndvi_file+"\\"+f
            list1.append(file_name)
        return list1
    else:
        return []
if __name__ == '__main__':
    file_ndvi = r"D:\AAWORK\work\研究方向\研究方向01作物分類內容\風云數據\MERSI-II植被指數旬產品(250M)\NDVI主合成"
    file_out = r"D:\AAWORK\work\2021NDVISUM.tif"
    ndvi_file_list = get_all_file_name(file_ndvi)
    col00, row00, geotrans00, proj00, data_00_ndvi = read_tif(ndvi_file_list[0])
    data_01_ndvi = read_tif02(ndvi_file_list[1])
    data_02_ndvi = read_tif02(ndvi_file_list[2])
    list_row = [0,560,1120,1680,2240,2800,3360,3920,4480,5040,5600]
    for index,i in enumerate(list_row):
        if index <= len(list_row)-2:
            print(list_row[index],list_row[index+1])
            #分段進行操作
            # sum_list = get_section(list_row[index],list_row[index+1],col00,data_00_ndvi,data_01_ndvi,data_02_ndvi)
            # 分段進行保存
            # save_section(sum_list, list_row[index], list_row[index+1], col00,data_00_ndvi,data_01_ndvi,data_02_ndvi)

在這里插入圖片描述

2 實現分批讀取數據以及進行計算

拿到開始的行和結束的行數,進行分批讀取數據并進行計算,(這里求和求的是整數,如有需要的話可以自己更改)代碼如下:

import os
import tensorflow as tf
import numpy as np
import pandas as pd
from osgeo import gdal, gdalnumeric
def get_sum_list(data_list):
    list1 = []
    for data in data_list:
        sum = 0
        for d in data:
            if not np.isnan(d):
                sum = sum+d
        list1.append(int(sum))
    return list1
def read_tif(filepath):
    dataset = gdal.Open(filepath)
    col = dataset.RasterXSize#圖像長度
    row = dataset.RasterYSize#圖像寬度
    geotrans = dataset.GetGeoTransform()#讀取仿射變換
    proj = dataset.GetProjection()#讀取投影
    data = dataset.ReadAsArray()#轉為numpy格式
    data = data.astype(np.float32)
    # a = data[0][0]
    # data[data == a] = np.nan
    data[data <= -3] = np.nan
    return [col, row, geotrans, proj, data]
def read_tif02(file):
    data = gdalnumeric.LoadFile(file)
    data = data.astype(np.float32)
    # a = data[0][0]
    # data[data == a] = np.nan
    data[data <= -3] = np.nan
    return data
def get_all_file_name(ndvi_file):
    list1=[]
    if os.path.isdir(ndvi_file):
        fileList = os.listdir(ndvi_file)
        for f in fileList:
            file_name= ndvi_file+"\\"+f
            list1.append(file_name)
        return list1
    else:
        return []
def get_nan_sum(ndvi_list):
    """
    得到NAN數據的個數
    :param ndvi_list:
    :return:
    """
    count = 0
    for ndvi in ndvi_list:
        if np.isnan(ndvi):
            count = count+1
    return count
def get_section(row0, row1, col1,data1,data2,data3):
    """
    分段讀取數據,讀取的數據進行計算
    :param row0:
    :param row1:
    :param col1:
    :param data1:
    :param data2:
    :param data3:
    :return:
    """
    list1 = []
    for i in range(row0, row1):  # 行
        for j in range(0, col1):  # 列
            ndvi_list = []
            ndvi_list.append(data1[i][j])
            ndvi_list.append(data2[i][j])
            ndvi_list.append(data3[i][j])
            if get_nan_sum(ndvi_list)>1:
                pass
            else:
                list1.append(ndvi_list)
            ndvi_list = None
    sum_list = get_sum_list(list1)
    list1 = None
    return sum_list
if __name__ == '__main__':
    file_ndvi = r"D:\AAWORK\work\研究方向\研究方向01作物分類內容\風云數據\MERSI-II植被指數旬產品(250M)\NDVI主合成"
    file_out = r"D:\AAWORK\work\2021NDVISUM.tif"
    ndvi_file_list = get_all_file_name(file_ndvi)
    col00, row00, geotrans00, proj00, data_00_ndvi = read_tif(ndvi_file_list[0])
    data_01_ndvi = read_tif02(ndvi_file_list[1])
    data_02_ndvi = read_tif02(ndvi_file_list[2])
    list_row = [0,560,1120,1680,2240,2800,3360,3920,4480,5040,5600]
    for index,i in enumerate(list_row):
        if index <= len(list_row)-2:
            print(list_row[index],list_row[index+1])
            #分段進行操作
            sum_list = get_section(list_row[index],list_row[index+1],col00,data_00_ndvi,data_01_ndvi,data_02_ndvi)
            print(np.array(sum_list))
            # 分段進行保存
            # save_section(sum_list, list_row[index], list_row[index+1], col00,data_00_ndvi,data_01_ndvi,data_02_ndvi)

在這里插入圖片描述

3 實現分批保存成TIF文件(所有完整代碼)

在2中已經得到了每一批的list結果,我們拿到list結果之后,可以進行保存成tif文件。代碼如下:

import os
import numpy as np
from osgeo import gdal, gdalnumeric
def get_sum_list(data_list):
    list1 = []
    for data in data_list:
        sum = 0
        for d in data:
            if not np.isnan(d):
                sum = sum+d
        list1.append(int(sum))
    return list1
def read_tif(filepath):
    dataset = gdal.Open(filepath)
    col = dataset.RasterXSize#圖像長度
    row = dataset.RasterYSize#圖像寬度
    geotrans = dataset.GetGeoTransform()#讀取仿射變換
    proj = dataset.GetProjection()#讀取投影
    data = dataset.ReadAsArray()#轉為numpy格式
    data = data.astype(np.float32)
    # a = data[0][0]
    # data[data == a] = np.nan
    data[data <= -3] = np.nan
    return [col, row, geotrans, proj, data]
def read_tif02(file):
    data = gdalnumeric.LoadFile(file)
    data = data.astype(np.float32)
    # a = data[0][0]
    # data[data == a] = np.nan
    data[data <= -3] = np.nan
    return data
def get_all_file_name(ndvi_file):
    list1=[]
    if os.path.isdir(ndvi_file):
        fileList = os.listdir(ndvi_file)
        for f in fileList:
            file_name= ndvi_file+"\\"+f
            list1.append(file_name)
        return list1
    else:
        return []
def save_tif(data, file, output):
    """
    保存成tif
    :param data:
    :param file:
    :param output:
    :return:
    """
    ds = gdal.Open(file)
    shape = data.shape
    driver = gdal.GetDriverByName("GTiff")
    dataset = driver.Create(output, shape[1], shape[0], 1, gdal.GDT_Float32)#保存的數據類型
    dataset.SetGeoTransform(ds.GetGeoTransform())
    dataset.SetProjection(ds.GetProjection())
    dataset.GetRasterBand(1).WriteArray(data)
def get_nan_sum(ndvi_list):
    """
    得到NAN數據的個數
    :param ndvi_list:
    :return:
    """
    count = 0
    for ndvi in ndvi_list:
        if np.isnan(ndvi):
            count = count+1
    return count
def get_section(row0, row1, col1,data1,data2,data3):
    """
    分段讀取數據,讀取的數據進行計算
    :param row0:
    :param row1:
    :param col1:
    :param data1:
    :param data2:
    :param data3:
    :return:
    """
    list1 = []
    for i in range(row0, row1):  # 行
        for j in range(0, col1):  # 列
            ndvi_list = []
            ndvi_list.append(data1[i][j])
            ndvi_list.append(data2[i][j])
            ndvi_list.append(data3[i][j])
            if get_nan_sum(ndvi_list)>1:
                pass
            else:
                list1.append(ndvi_list)
            ndvi_list = None
    sum_list = get_sum_list(list1)
    list1 = None
    return sum_list
def save_section(sum_list, row0, row1, col1,data1,data2,data3):
    """
    保存分段的數據
    :param sum_list:
    :param row0:
    :param row1:
    :param col1:
    :param data1:
    :param data2:
    :param data3:
    :return:
    """
    file = r"D:\AAWORK\work\研究方向\研究方向01作物分類內容\風云數據\MERSI-II植被指數旬產品(250M)\kongbai_zhu_250m.tif"#這是一個空白數據,每個像元的值為0
    data = read_tif02(file)
    m = 0
    for i in range(row0, row1):  # 行
        for j in range(0, col1):  # 列
            ndvi_list = []
            ndvi_list.append(data1[i][j])
            ndvi_list.append(data2[i][j])
            ndvi_list.append(data3[i][j])
            if get_nan_sum(ndvi_list)>1:
                pass
            else:
                data[i][j] = sum_list[m]
                m = m + 1
    save_tif(data,file,file_out.replace(".tif","_"+str(row0)+"_"+str(row1)+".tif"))
    data = None
if __name__ == '__main__':
    file_ndvi = r"D:\AAWORK\work\研究方向\研究方向01作物分類內容\風云數據\MERSI-II植被指數旬產品(250M)\NDVI主合成"
    file_out = r"D:\AAWORK\work\2021NDVISUM.tif"
    ndvi_file_list = get_all_file_name(file_ndvi)
    col00, row00, geotrans00, proj00, data_00_ndvi = read_tif(ndvi_file_list[0])
    data_01_ndvi = read_tif02(ndvi_file_list[1])
    data_02_ndvi = read_tif02(ndvi_file_list[2])
    list_row = [0,560,1120,1680,2240,2800,3360,3920,4480,5040,5600]
    for index,i in enumerate(list_row):
        if index <= len(list_row)-2:
            print(list_row[index],list_row[index+1])
            #分段進行操作
            sum_list = get_section(list_row[index],list_row[index+1],col00,data_00_ndvi,data_01_ndvi,data_02_ndvi)
            print(np.array(sum_list))
            # 分段進行保存
            save_section(sum_list, list_row[index], list_row[index+1], col00,data_00_ndvi,data_01_ndvi,data_02_ndvi)

在這里插入圖片描述

在這里插入圖片描述

4 分段TIF整合到一個TIF

我們要把上述10個TIF文件整合到一個TIF文件里,方法很多,我這里提供一個方法,供大家使用,代碼如下:

import os
from osgeo import gdalnumeric, gdal
import numpy as np
def get_all_file_name(file):
    list1=[]
    if os.path.isdir(file):
        fileList = os.listdir(file)
        for f in fileList:
            file_name= file+"\\"+f
            list1.append(file_name)
        return list1
    else:
        return []
def read_tif(filepath):
    dataset = gdal.Open(filepath)
    col = dataset.RasterXSize#圖像長度
    row = dataset.RasterYSize#圖像寬度
    geotrans = dataset.GetGeoTransform()#讀取仿射變換
    proj = dataset.GetProjection()#讀取投影
    data = dataset.ReadAsArray()#轉為numpy格式
    data = data.astype(np.float32)
    # a = data[0][0]
    # data[data == a] = np.nan
    data[data <= -3] = np.nan
    return [col, row, geotrans, proj, data]
def read_tif02(file):
    data = gdalnumeric.LoadFile(file)
    data = data.astype(np.float32)
    # a = data[0][0]
    # data[data == a] = np.nan
    data[data <= -3] = np.nan
    return data
def save_tif(data, file, output):
    ds = gdal.Open(file)
    shape = data.shape
    driver = gdal.GetDriverByName("GTiff")
    dataset = driver.Create(output, shape[1], shape[0], 1, gdal.GDT_Int16)#保存的數據類型
    dataset.SetGeoTransform(ds.GetGeoTransform())
    dataset.SetProjection(ds.GetProjection())
    dataset.GetRasterBand(1).WriteArray(data)
if __name__ == '__main__':
    file_path = r"D:\AAWORK\work\分段數據"
    file_out = r"D:\AAWORK\work\2021NDVISUM.tif"
    file_list = get_all_file_name(file_path)
    data_all = read_tif02(r"D:\AAWORK\work\研究方向\研究方向01作物分類內容\風云數據\MERSI-II植被指數旬產品(250M)\kongbai_zhu_250m.tif")
    for file in file_list:
        data = read_tif02(file)
        data_all = data_all+data
    save_tif(data_all,r"D:\AAWORK\work\研究方向\研究方向01作物分類內容\風云數據\MERSI-II植被指數旬產品(250M)\kongbai_zhu_250m.tif",file_out)

在這里插入圖片描述

5 生成一個空白TIF(每個像元值為0的TIF)

思路比較簡單,就是遍歷每個像元,然后把每個像元的值設置為0,設置為其它可以,然后再進行保存。

from osgeo import gdal
import numpy as np
def read_tif(filepath):
    dataset = gdal.Open(filepath)
    col = dataset.RasterXSize#圖像長度
    row = dataset.RasterYSize#圖像寬度
    geotrans = dataset.GetGeoTransform()#讀取仿射變換
    proj = dataset.GetProjection()#讀取投影
    data = dataset.ReadAsArray()#轉為numpy格式
    data = data.astype(np.float32)
    # a = data[0][0]
    # data[data == a] = np.nan
    # data[data <= -3] = np.nan
    return [col, row, geotrans, proj, data]
def save_tif(data, file, output):
    ds = gdal.Open(file)
    shape = data.shape
    driver = gdal.GetDriverByName("GTiff")
    dataset = driver.Create(output, shape[1], shape[0], 1, gdal.GDT_Int16)#保存的數據類型
    dataset.SetGeoTransform(ds.GetGeoTransform())
    dataset.SetProjection(ds.GetProjection())
    dataset.GetRasterBand(1).WriteArray(data)
if __name__ == '__main__':
    file_path = r"D:\AAWORK\work\2021NDVISUM.tif"
    file_out = r"D:\AAWORK\work\kongbai.tif"
    col, row, geotrans, proj, data = read_tif(file_path)
    for i in range(0,row):
        for j in range(0,col):
            data[i][j] = 0
    save_tif(data,file_path,file_out)

以上就是Python實現分段讀取和保存遙感數據的詳細內容,更多關于Python遙感數據的資料請關注腳本之家其它相關文章!

相關文章

  • tensorflow實現從.ckpt文件中讀取任意變量

    tensorflow實現從.ckpt文件中讀取任意變量

    這篇文章主要介紹了tensorflow實現從.ckpt文件中讀取任意變量,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • Python定時查詢starrocks數據庫并將結果保存在excel

    Python定時查詢starrocks數據庫并將結果保存在excel

    這篇文章主要為大家詳細介紹了Python如何實現定時查詢starrocks數據庫并將結果保存在excel,文中的示例代碼講解詳細,感興趣的小伙伴可以參考一下
    2025-03-03
  • Python 防止死鎖的方法

    Python 防止死鎖的方法

    這篇文章主要介紹了Python 防止死鎖的方法,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • python函數的萬能參數傳參詳解

    python函數的萬能參數傳參詳解

    這篇文章主要介紹了python函數的萬能參數傳參詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • 淺談Pytorch中的自動求導函數backward()所需參數的含義

    淺談Pytorch中的自動求導函數backward()所需參數的含義

    今天小編就為大家分享一篇淺談Pytorch中的自動求導函數backward()所需參數的含義,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • python函數之任意數量的實參方式

    python函數之任意數量的實參方式

    這篇文章主要介紹了python函數之任意數量的實參方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 深度學習的MNIST手寫數字數據集識別方式(準確率99%,附代碼)

    深度學習的MNIST手寫數字數據集識別方式(準確率99%,附代碼)

    這篇文章主要介紹了深度學習的MNIST手寫數字數據集識別方式(準確率99%,附代碼),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Python實現批量替換Excel中字符

    Python實現批量替換Excel中字符

    這篇文章主要為大家詳細介紹了如何使用Python實現批量替換Excel中字符,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-11-11
  • PyTorch中常用的激活函數的方法示例

    PyTorch中常用的激活函數的方法示例

    這篇文章主要介紹了PyTorch中常用的激活函數的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • 基于logstash實現日志文件同步elasticsearch

    基于logstash實現日志文件同步elasticsearch

    這篇文章主要介紹了基于logstash實現日志文件同步elasticsearch,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08

最新評論