如何使用Python,GDAL,ArcPy将.grib文件转换为具有正确投影的GeoTIFF

时间:2019-01-08 20:15:34

标签: python transform gdal geotiff grib

我正在尝试将.grib文件转换为要在GIS(特别是ArcGIS)中使用的GeoTIFF,但是在使图像正确投影方面遇到困难。我已经能够使用Python中的GDAL创建一个GeoTIFF,它可以显示数据,但是当导入ArcGIS时却没有显示在正确的位置。结果图像如下。

What the data looks like when I put it into ArcGIS

我正在使用的数据可以从https://gimms.gsfc.nasa.gov/SMOS/SMAP/L05/

下载。

我正在尝试将数据投影到WGS84 Web Mercator(辅助球),EPSG:3857

注意:我已经尝试通过创建应该能够使用.grib数据的栅格马赛克通过ArcMap引入数据,但是我没有任何运气。

更新:我也尝试过使用“项目栅格”工具,但是ArcGIS不喜欢来自.grib文件的默认投影并给出错误。

我正在使用的代码:

import gdal

src_filename = r"C:\att\project\arcshare\public\disaster_response\nrt_products\smap\20150402_20150404_anom1.grib"
dst_filename = r"C:\att\project\arcshare\public\disaster_response\nrt_products\smap\smap_py_test1.tif"

#Open existing dataset
src_ds = gdal.Open(src_filename)

#Open output format driver, see gdal_translate --formats for list
format = "GTiff"
driver = gdal.GetDriverByName( format )

#Output to new format
dst_file = driver.CreateCopy( dst_filename, src_ds, 0 )

#Properly close the datasets to flush to disk
dst_ds = None
src_ds = None

我不太熟悉Python中的GDAL或GDAL,因此将不胜感激任何帮助或提示。

2 个答案:

答案 0 :(得分:0)

类似的事情应该将您的本机坐标转换为所需的投影。尚未测试。 (可以按纬度而不是纬度)。

from cfgrib import xarray_store
from pyproj import Proj, transform

grib_data = xarray_store.open_dataset('your_grib_file.grib')
lat = grib_data.latitudes.value
lon = grib_data.longitudes.value
lon_transformed, lat_transformed = transform (Proj(init='init_projection'), 
 Proj(init='target_projection', lon, lat)

答案 1 :(得分:0)

尝试使用gdal.Translate(在Python中)或gdal_translate(从命令行)。以下是我过去如何使用每种方法的两个示例:

选项1:Python方法

from osgeo import gdal

# Open existing dataset
src_ds = gdal.Open(src_filename)

# Ensure number of bands in GeoTiff will be same as in GRIB file. 
bands = [] # Set up array for gdal.Translate(). 
if src_ds is not None:
    bandNum = src_ds.RasterCount # Get band count
for i in range(bandNum+1): # Update array based on band count
    if (i==0): #gdal starts band counts at 1, not 0 like the Python for loop does.
        pass
    else:
        bands.append(i)

# Open output format driver
out_form= "GTiff"

# Output to new format using gdal.Translate. See https://gdal.org/python/ for osgeo.gdal.Translate options.
dst_ds = gdal.Translate(dst_filename, src_ds, format=out_form, bandList=bands)

# Properly close the datasets to flush to disk
dst_ds = None
src_ds = None

选项2:命令行gdal_translate(从Python调用)方法

import os

# Open output format driver, see gdal_translate --formats for list
out_form = "GTiff"

# Pull out specific band of interest
band=3

# Convert from GRIB to GeoTIFF using system gdal_translate
src_ds = src_filename
dst_ds = dst_filename
os.system("gdal_translate -b %s -of %s %s %s" %(str(band), out_form, src_ds, dst_ds))

过去我在使用选项2创建多波段GeoTiff时遇到了麻烦,因此我建议尽可能使用选项1。