Python實現(xiàn)分段讀取和保存遙感數(shù)據(jù)
1 分段讀取數(shù)據(jù)
如圖所示,有三個這樣的數(shù)據(jù),且該數(shù)據(jù)為5600行6800列,我們可以分成10個批次分段讀取該TIF數(shù)據(jù),10個批次以此為0,560,1120,1680,2240,2800,3360,3920,4480,5040,5600。
代碼實現(xiàn):
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()#轉(zhuǎn)為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作物分類內(nèi)容\風(fēng)云數(shù)據(jù)\MERSI-II植被指數(shù)旬產(chǎn)品(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 實現(xiàn)分批讀取數(shù)據(jù)以及進行計算
拿到開始的行和結(jié)束的行數(shù),進行分批讀取數(shù)據(jù)并進行計算,(這里求和求的是整數(shù),如有需要的話可以自己更改)代碼如下:
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()#轉(zhuǎn)為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數(shù)據(jù)的個數(shù) :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): """ 分段讀取數(shù)據(jù),讀取的數(shù)據(jù)進行計算 :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作物分類內(nèi)容\風(fēng)云數(shù)據(jù)\MERSI-II植被指數(shù)旬產(chǎn)品(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 實現(xiàn)分批保存成TIF文件(所有完整代碼)
在2中已經(jīng)得到了每一批的list結(jié)果,我們拿到list結(jié)果之后,可以進行保存成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()#轉(zhuǎn)為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)#保存的數(shù)據(jù)類型 dataset.SetGeoTransform(ds.GetGeoTransform()) dataset.SetProjection(ds.GetProjection()) dataset.GetRasterBand(1).WriteArray(data) def get_nan_sum(ndvi_list): """ 得到NAN數(shù)據(jù)的個數(shù) :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): """ 分段讀取數(shù)據(jù),讀取的數(shù)據(jù)進行計算 :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): """ 保存分段的數(shù)據(jù) :param sum_list: :param row0: :param row1: :param col1: :param data1: :param data2: :param data3: :return: """ file = r"D:\AAWORK\work\研究方向\研究方向01作物分類內(nèi)容\風(fēng)云數(shù)據(jù)\MERSI-II植被指數(shù)旬產(chǎn)品(250M)\kongbai_zhu_250m.tif"#這是一個空白數(shù)據(jù),每個像元的值為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作物分類內(nèi)容\風(fēng)云數(shù)據(jù)\MERSI-II植被指數(shù)旬產(chǎn)品(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()#轉(zhuǎn)為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)#保存的數(shù)據(jù)類型 dataset.SetGeoTransform(ds.GetGeoTransform()) dataset.SetProjection(ds.GetProjection()) dataset.GetRasterBand(1).WriteArray(data) if __name__ == '__main__': file_path = r"D:\AAWORK\work\分段數(shù)據(jù)" 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作物分類內(nèi)容\風(fēng)云數(shù)據(jù)\MERSI-II植被指數(shù)旬產(chǎn)品(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作物分類內(nèi)容\風(fēng)云數(shù)據(jù)\MERSI-II植被指數(shù)旬產(chǎn)品(250M)\kongbai_zhu_250m.tif",file_out)
5 生成一個空白TIF(每個像元值為0的TIF)
思路比較簡單,就是遍歷每個像元,然后把每個像元的值設(shè)置為0,設(shè)置為其它可以,然后再進行保存。
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()#轉(zhuǎn)為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)#保存的數(shù)據(jù)類型 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實現(xiàn)分段讀取和保存遙感數(shù)據(jù)的詳細(xì)內(nèi)容,更多關(guān)于Python遙感數(shù)據(jù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
tensorflow實現(xiàn)從.ckpt文件中讀取任意變量
這篇文章主要介紹了tensorflow實現(xiàn)從.ckpt文件中讀取任意變量,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05Python定時查詢starrocks數(shù)據(jù)庫并將結(jié)果保存在excel
這篇文章主要為大家詳細(xì)介紹了Python如何實現(xiàn)定時查詢starrocks數(shù)據(jù)庫并將結(jié)果保存在excel,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下2025-03-03淺談Pytorch中的自動求導(dǎo)函數(shù)backward()所需參數(shù)的含義
今天小編就為大家分享一篇淺談Pytorch中的自動求導(dǎo)函數(shù)backward()所需參數(shù)的含義,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02深度學(xué)習(xí)的MNIST手寫數(shù)字?jǐn)?shù)據(jù)集識別方式(準(zhǔn)確率99%,附代碼)
這篇文章主要介紹了深度學(xué)習(xí)的MNIST手寫數(shù)字?jǐn)?shù)據(jù)集識別方式(準(zhǔn)確率99%,附代碼),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06基于logstash實現(xiàn)日志文件同步elasticsearch
這篇文章主要介紹了基于logstash實現(xiàn)日志文件同步elasticsearch,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08