写在前面
最近狂敲了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
给我点在看的人
越来越好看