- 通過命令行gdalwarp.exe
- 通過gdal的c#binding
- 通過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?