Python遥感开发之批量拼接
- [1 遥感图像无交错的批量拼接](#1 遥感图像无交错的批量拼接)
- [2 遥感图像有交错的批量拼接](#2 遥感图像有交错的批量拼接)
前言:主要借助python实现遥感影像的批量拼接,遥感影像的批量拼接主要分为两种情况,一种是遥感图像无交错,另一种情况是遥感图像相互有交错。具体实现请参考以下代码,如有问题请及时反馈。
1 遥感图像无交错的批量拼接
此方法是各个遥感文件是没有相互交错的拼接,如下图所示。个人可以使用Arcgis进行查看。
实现思路:通过每个遥感数据的经纬度进行拼接下一个遥感数据文件。
python
import os
from osgeo import gdal
def get_data_list(file_path, out = ""):
list1 = [] # 文件的完整路径
if os.path.isdir(file_path):
fileList = os.listdir(file_path)
if out != "":
for f in fileList:
out_data = out + "\\" + f
out_data = out_data.replace(".HDF", "_ndvi.tif")
list1.append(out_data)
else:
for f in fileList:
pre_data = file_path + '\\' + f # 文件的完整路径
list1.append(pre_data)
return list1
def get_same_list(image, infile_list):
infile_list02 = []
for data in infile_list:
if image in data:
# print("----", data)
infile_list02.append(data)
return infile_list02
def get_same_image_list(infile_list):
image_list= []
for file in infile_list:
filename = file[-31:-23]
if filename not in image_list:
image_list.append(filename)
return list(set(image_list))
def pinjie(infile_list,outfile):
ds = gdal.Open(infile_list[0])
cols = ds.RasterXSize
rows = ds.RasterYSize
ingeo = ds.GetGeoTransform()
proj = ds.GetProjection()
minx = ingeo[0]
maxy = ingeo[3]
maxx = ingeo[0] + ingeo[1] * cols
miny = ingeo[3] + ingeo[5] * rows
ds = None
for file in infile_list[1:]:
ds = gdal.Open(file)
cols = ds.RasterXSize
rows = ds.RasterYSize
geo = ds.GetGeoTransform()
minx_ = geo[0]
maxy_ = geo[3]
maxx_ = geo[0] + geo[1] * cols
miny_ = geo[3] + geo[5] * rows
minx = min(minx, minx_)
maxy = max(maxy, maxy_)
maxx = max(maxx, maxx_)
miny = min(miny, miny_)
geo = None
ds = None
newcols = int((maxx - minx) / abs(ingeo[1]))
newrows = int((maxy - miny) / abs(ingeo[5]))
driver = gdal.GetDriverByName("GTiff")
outds = driver.Create(outfile, newcols, newrows, 1, gdal.GDT_Int16)
outgeo = (minx, ingeo[1], 0, maxy, 0, ingeo[5])
outds.SetGeoTransform(outgeo)
outds.SetProjection(proj)
outband = outds.GetRasterBand(1)
for file in infile_list:
ds = gdal.Open(file)
data = ds.ReadAsArray()
geo = ds.GetGeoTransform()
x = int(abs((geo[0] - minx) / ingeo[1]))
y = int(abs((geo[3] - maxy) / ingeo[5]))
outband.WriteArray(data, x, y)
ds = None
outband.FlushCache()
pass
if __name__ == '__main__':
infile = r"C:\Users\Administrator\Desktop\01提取ndvi"
outfile = r"C:\Users\Administrator\Desktop\02拼接"
infile_list = get_data_list(infile)
image_name_list = get_same_image_list(infile_list)
print(image_name_list)
for name in image_name_list:
print(name)
infile_list02 = get_same_list(name, infile_list)
pinjie(infile_list02,outfile+"\\"+name+".tif")
2 遥感图像有交错的批量拼接
此方法是各个遥感文件是有相互交错的拼接,如下图所示,具体可以使用Arcgis进行查看。
实现思路:借助gdal中WarpOptions的方法实现,有点类似于镶嵌
python
import numpy as np
from osgeo import gdal, gdalconst
import os
def RasterMosaic(firstinputfilePath, inputfileList, outputfilePath):
inputrasfile1 = gdal.Open(firstinputfilePath, gdal.GA_ReadOnly) # 第一幅影像
inputProj1 = inputrasfile1.GetProjection()
options = gdal.WarpOptions(srcSRS=inputProj1, dstSRS=inputProj1, format='GTiff')
gdal.Warp(outputfilePath, inputfileList, options=options)
def get_data_list(file_path, out=""):
list1 = [] # 文件的完整路径
if os.path.isdir(file_path):
fileList = os.listdir(file_path)
if out != "":
for f in fileList:
out_data = out + "\\" + f
out_data = out_data.replace(".HDF", "_ndvi.tif")
list1.append(out_data)
else:
for f in fileList:
pre_data = file_path + '\\' + f # 文件的完整路径
list1.append(pre_data)
return list1
def get_same_image_list(infile_list):
image_list = []
for file in infile_list:
filename = file[-20:-12]
if filename not in image_list:
image_list.append(filename)
return list(set(image_list))
def get_infile(image,infile_list):
for data in infile_list:
if image in data:
return data
def get_same_list(image, infile_list):
infile_list02 = []
for data in infile_list:
if image in data:
infile_list02.append(data)
return infile_list02
if __name__ == '__main__':
inputfile_path = r"D:\风云数据\MERSI-II陆表反射比1KM段产品\b1\01原始"
outfile = r"D:\风云数据\MERSI-II陆表反射比1KM段产品\b1\02拼接"
infile_list = get_data_list(inputfile_path)
image_list = get_same_image_list(infile_list)
print(image_list)
for image in image_list:
firstinputfilePath = get_infile(image,infile_list)
infile_list02 = get_same_list(image, infile_list)
print(image)
print(firstinputfilePath)
print(infile_list02)
RasterMosaic(firstinputfilePath, infile_list02, outfile+"\\"+image+"_b1.tif")
print("-------")