Python | Gdal | 投影转换 | tiff转换nc

文摘   2024-09-26 19:49   广东  

写在前面

最近狂敲了5天代码,差点废了。好消息是遇到了新的数据,伴随产生新的问题,可以顺便记录下来发个教材。这里需要处理Geotiff图像数据,图像中每个像素的大小为1千米×1千米。

说实话,很久以前用arcgis处理过这种数据,很方便,但是太久远了。装的arcgis都打不开了。而且长期处于nc格式的舒适区,还是挺头疼新的数据格式。

为了更方便的处理,这里还是考虑将其处理为nc格式。

遇到的问题

原本我是直接通过python中的gdal库进行转换的,以下是一个简单的转换脚本,通过获取文件下的所有tiff文件,批量转换为nc输出:

def transnc_pop():
    
    input_file = r"K:/BaiduNetdiskDownload/population/pop_output/"
    
    for year in range(1990,2016):
        # print(year)
        
        fn = input_file + 'pop'+'%04.0f'%year+'/'
        
        files = glob.glob(fn+"*.tif")
        files.sort()
        for file in files:
            print(year,file)
            tiff_name = os.path.basename(file).split('.')[0
            
            nc_name   = tiff_name + '.nc'
            
            output_file = os.path.join("K:/BaiduNetdiskDownload/pop1990-2015",
                                        nc_name)
            
            gdal.Translate(output_file,file,format='netCDF')
        

但是,在后期绘图时发现存在问题,如下所示,数据与ccrs.PlateCarree()投影匹配不上,导致绘制空间分布图时出现错位

后来分析感觉应该是投影不一致的问题导致的,原始tif文件中没有常见的经纬度lon-lat信息而x-y以m的单位显示,其文件中显示的投影方式为ccrs.AlbersEqualArea()

解决方法

后续在谷歌搜索中,找到了可能原因,绘图使用的投影坐标ccrs.PlateCarree()应该对应于WGS 84

我这里在Linux系统下使用gdalwrap命令,直接进行转换:

gdalwarp infile.tif outfile.nc -t_srs "+proj=longlat +ellps=WGS84"

或者可以在windows环境下使用,具体没有测试

import os  
os.sys('gdalwarp infile.tif outfile.nc -t_srs "+proj=longlat +ellps=WGS84"')

gdal

如果你是在Linux系统下,只要保证成功安装上了gdal库,在命令行,输入gdal,然后点击tab键,即可发现先输出gdal相关的命令

绘制空间分布图

处理后的数据可以正常的绘制空间分布图,简单绘制一下如下所示;

数据与代码

相关数据与代码放到了GitHub上:

  • https://github.com/Blissful-Jasper/jianpu_record

总结

总的来说,最终还是解决了问题。但是,发现了自身对于不同投影数据以及其他格式数据处理不熟练的不足。后续还是多找找不同格式的数据练习一下。

https://gis.stackexchange.com/questions/6669/converting-projected-geotiff-to-wgs84-with-gdal-and-python


给我点在看的人

越来越好看



气python风雨
主要发一些涉及大气科学的Python文章与个人学习备忘录
 最新文章