2017-02-14 3 views
0

Я пытаюсь расширить библиотеку odo функциональностью для преобразования набора данных GDAL (растра с пространственной информацией) в файл NetCDF.Получение данных из odo.resource (source) в odo.resource (target)

Чтение в наборе данных gdal идет нормально. Но на этапе создания netcdf мне нужны некоторые метаданные набора данных gdal (метаданные, которые еще не известны при вызове odo.odo (source, target)). Как я мог это достичь?

короткий вариант моего кода до сих пор:

import odo 
from odo import resource, append 
import gdal 
import netCDF4 as nc4 
import numpy as np 

@resource.register('.+\.tif') 
def resource_gdal(uri, **kwargs): 
    ds = gdal.Open(uri) 

    # metadata I need to transfer to netcdf 
    b = ds.GetGeoTransform() #bbox, interval 

    return ds 


@resource.register('.+\.nc') 
def resource_netcdf(uri, dshape=None, **kwargs): 
    ds = nc4.Dataset(uri,'w') 

    # create lat lon dimensions and variables 
    ds.createDimension(lat, dshape[0].val) 
    ds.createDimension(lon, dshape[1].val) 
    lat = ds.createVariable('lat','f4', ('lat',)) 
    lon = ds.createVariable('lon','f4', ('lon',)) 

    # create a range from the **gdal metadata** 
    lat_array = np.arange(dshape[0].val)*b[1]+b[0] 
    lon_array = np.arange(dshape[1].val)*b[5]+b[3] 

    # assign the range to the netcdf variable 
    lat[:] = lat_array 
    lon[:] = lon_array 

    # create the variable which will hold the gdal data 
    data = ds.createVariable('data', 'f4', ('lat', 'lon',)) 

    return data 


@append.register(nc4.Variable, gdal.Dataset) 
def append_gdal_to_nc4(tgt, src, **kwargs): 
    arr = src.ReadAsArray() 
    tgt[:] = arr 

    return tgt 

Спасибо!

ответ

0

У меня нет большого опыта работы с odo, но из-за просмотра исходного кода и документов он выглядит так: resource_netcdf() не должен быть вовлечен в перевод gdal-данных в netcdf. Перевод должен выполняться функцией gdal_to_netcdf(), украшенной convert.register. В этом случае объект gdal.Dataset, возвращенный resource_gdal, будет иметь всю достаточную информацию (геопривязка, размер пикселя), чтобы сделать netcdf.

Смежные вопросы