c#調用gdalwarp

  1. 通過命令行gdalwarp.exe
  2. 通過gdal的c#binding
  3. 通過c#調用gdal的python綁定
    第一種直接使用Process類,寫好py文件即可
    第3種也可以new Process,或者用pythonnet之類的庫也可(ps 我沒試過)
var inRasterDs = Gdal.Open(_inRasterFile, Access.GA_ReadOnly);
string evWkt = inRasterDs.GetProjectionRef();
var cellSize = RasterUtil.GetCellSize(inRasterDs);
//柵格6參數
double[] argout = new double[6];
inRasterDs.GetGeoTransform(argout);

//calc extent
var xmin = argout[0];
var ymax = argout[3];
var xmax = argout[0] + argout[1] * inRasterDs.RasterXSize + inRasterDs.RasterYSize * argout[2];
var ymin = argout[3] + argout[4] * inRasterDs.RasterXSize + inRasterDs.RasterYSize * argout[5];
inRasterDs.Dispose();
//重投影並指定像元大小和四至,重採樣方式爲nearest,並指定格式爲ENVI .hdr Labelled Raster
var options = Gdal.ParseCommandLine($"-t_srs {evWkt} -tr {cellSize.cellSizeX} {cellSize.cellSizeY} " +
   $"-te {xmin} {ymin} {xmax} {ymax}  -r near -of ENVI ");
//調用gdalwarp
using (Dataset inputDataset = Gdal.Open(inraster, Access.GA_ReadOnly))
{
    IntPtr[] ptr = { Dataset.getCPtr(inputDataset).Handle };
    GCHandle gcHandle = GCHandle.Alloc(ptr, GCHandleType.Pinned);
    Dataset resultDs = null;
    try
    {
        var dss = new SWIGTYPE_p_p_GDALDatasetShadow(gcHandle.AddrOfPinnedObject(), false, null);
        resultDs = Gdal.wrapper_GDALWarpDestName(
            outputRasterPath, 1, dss,
            new GDALWarpAppOptions(options),
            this.reprojectionProgressUC, null);

    }
    catch (Exception)
    {
         _logger.Error(Gdal.GetLastErrorMsg());
        _logger.Error(e);
        throw;
    }
    finally
    {
        gcHandle.Free();
        if (resultDs != null)
        {
            resultDs.Dispose();
        }
    }
}



/// <summary>
/// 默認進度信息
/// </summary>
public int reprojectionProgressUC(double complete, IntPtr Message, IntPtr Data)
{
    string msg = Marshal.PtrToStringAnsi(Message);
    string datastr = Marshal.PtrToStringAnsi(Data);
    Console.WriteLine(complete + " " + msg + " " + datastr);
    //_logger.Info(complete + " " + msg + " " + datastr);
    ProgressChanged?.Invoke(this, Tuple.Create(complete, msg));
    //1 繼續執行 0 停止執行
    if (_tokenSource.IsCancellationRequested)
    {
        Console.WriteLine($"{_inRasterFile} resample canceled");
       // _logger.Info($"{_inRasterFile} resample canceled");
        return 0;
    }
    else
    {
        return 1;
    }
}

C#在.NET上運行GDAL / gdalwarp … 2
Using gdalwarp with c# bindings?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章