C#+Arcengine實現GP工具中Data Management Tool》raster》raster processing中的clip功能(向量資料對柵格資料的裁剪)
Arcgisdesktop中Data Management Tool中有一個clip的功能,即可以實現根據向量資料的範圍對柵格資料的裁剪的功能,在這裡它有一個可選項use input features for Clipping Geometry,即是否按照所輸入shp資料的圖形範圍對柵格資料進行裁剪,根據其是否勾選,clip有兩種實現方法,具體如下:
1,、勾選,即按照向量資料的範圍對柵格資料進行裁剪(裁剪後輸出範圍和輸入的shp相同):
/// <summary>
/// 按shp範圍裁剪Raster資料/// </summary>
/// <param name="inShp">輸入shp資料</param>
/// <param name="inRaster">輸入Raster資料</param>
private string ClipDem(string inShp, string inRaster)
{
try
{
//呼叫GP工具
Geoprocessor clipGeoprocessor = new Geoprocessor();
//這個工作空間大家電腦上都有,可以都寫這個,不必更換路徑(只要你裝了arcgis)
clipGeoprocessor.OverwriteOutput = true;
string clipRasterName = "clipRaster.tif";
//路徑+raster名稱(newFolder是你想儲存裁剪影像的路徑)
string clipRaster = newFolder + "\\" + clipRasterName;
if (File.Exists(clipRaster))
{
File.Delete(clipRaster);
}
Clip newClipRaster = new Clip()
{
in_raster = inRaster, // 輸入柵格資料(路徑+名稱)
out_raster = clipRaster, //要輸出的裁剪柵格資料的路徑+名稱
clipping_geometry = "ClippingGeometry", //注意,此處就是arcgis中use input features for Clipping Geometry勾選的狀態,不勾選為none
rectangle = "#", //此處為輸出矩形的範圍,注意,這裡若給出範圍,則裁剪影象按給出的範圍輸出,不管你上面的勾是否勾選
in_template_dataset = inShp // 輸入的向量資料的路徑+名稱(應該必須為polygon,未驗證)
};
IGeoProcessorResult result = (IGeoProcessorResult)clipGeoprocessor.Execute(newClipRaster, null);
//判斷是否裁剪成功
{
return null;
}
return clipRaster;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return null;
}
}
2、不勾選,即按照向量資料的外包矩形的範圍對柵格資料進行裁剪(裁剪後輸出的範圍是輸入shp影象的外包矩形的範圍):
/// <summary>
/// 按shp外包矩形範圍裁剪Raster資料
/// </summary>
/// <param name="inShp">輸入shp資料</param>
/// <param name="inRaster">輸入Raster資料</param>
private string ClipDem(string inShp, string inRaster)
{
try
{
//呼叫GP工具
Geoprocessor clipGeoprocessor = new Geoprocessor();
clipGeoprocessor.OverwriteOutput = true;
//建立工作空間
IWorkspaceFactory workspaceFactory = new ShapefileWorkspaceFactoryClass();
IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspaceFactory.OpenFromFile(shapefilePath, 0);
////得到使用者所選shp檔案中的featureClass
IFeatureClass featureClass = featureWorkspace.OpenFeatureClass(System.IO.Path.GetFileNameWithoutExtension(inShpName));
//得到feature,進而得到shp外包矩形的範圍
IFeatureCursor featureCursor = featureClass.Search(null, false);
IFeature feature = featureCursor.NextFeature();
while (feature != null)
{
//此處即為shp外包矩形的範圍
rectangle = string.Format("{0} {1} {2} {3}", feature.ShapeCopy.Envelope.XMin, feature.ShapeCopy.Envelope.YMin, feature.ShapeCopy.Envelope.XMax, feature.ShapeCopy.Envelope.YMax);
feature = featureCursor.NextFeature();
}
string clipRasterName = "clipRaster.tif";//要輸出的裁剪raster名稱
string outputrasterpath = staruoPath + "\\" + clipRasterName; //路徑+raster名稱
//判斷此檔案是否存在,若存在,刪除
if (File.Exists(outputrasterpath))
{
File.Delete(outputrasterpath);
}
//初始化clip工具
Clip clipRaster = new Clip()
{
in_raster = inRaster,//同上
out_raster = outputrasterpath,//同上
clipping_geometry = "none",//此處即為不勾選的情況
rectangle =rectangle //輸出範圍為外包矩形
};
IGeoProcessorResult result = (IGeoProcessorResult)clipGeoprocessor.Execute(clipRaster, null);
if (File.Exists(outputrasterpath))
{
MessageBox.Show("裁剪成功!");
}
}
}
catch (Exception ex)
{
MessageBox.Show("失敗!");
Console.WriteLine(ex.Message);
}
}
注意,輸入shp檔案的路徑+名稱和要輸入柵格資料的路徑+名稱,一定要寫正確,不然GP工具呼叫的時候容易報出“對com組建的呼叫返回了錯誤的HRESULT_FAIL”這個錯誤,如確定輸入路徑正確,還是報錯,可以參考http://llsshh1985.blog.163.com/blog/static/14006860320145174550560/(arcgisengine中呼叫GP報錯的問題)
2015-12-22,最近又用到這個功能,發現有的影像用以上的程式碼並沒有按照多邊形的輪廓裁剪影像,輸出結果還是多邊形的外包矩形,經研究發現,當影像中有大量Nodata值時,clip gp裁剪需新增 nodata_value = "-9999"程式碼,原因猜測是存在大量Nodata的畫素值,需對其進行賦值才能根據多邊形的輪廓裁剪出相應的影像。
相關文章
- C#+Arcengine實現GP工具中的extract by mask(提取掩膜),可以實現提取shp範圍的柵格資料,可用來獲得shp範圍的高程C#
- C#+arcengine獲得柵格資料的屬性表C#
- GeoServer釋出PostGIS資料庫中的柵格資料Server資料庫
- java 實現excel中的資料匯入到資料庫的功能JavaExcel資料庫
- 超大影像柵格轉向量快速實現
- 巧用 Data Instance 實現 XForms 中的資料處理ORM
- 如何實現雲資料治理中的資料安全?
- 用Python計算柵格資料的真實面積Python
- 一、【資料結構】向量(vector)的實現資料結構
- ENVI無縫鑲嵌、拼接柵格資料的方法
- 資料編織 (Data Fabric) vs 資料網格 (Data Mesh)
- 基於R語言的raster包讀取遙感影像R語言AST
- 資料庫安全審計在資料安全中的功能資料庫
- Python 柵格資料處理教程(一)Python
- Python 柵格資料處理教程(二)Python
- Redis中單機資料庫的實現Redis資料庫
- 談談資料編織(Data Fabric)和資料網格(Data Mesh)的關係
- 使用Percona Data Recovery Tool for InnoDB恢復資料
- goim 中的 data flow 資料流轉及思考Go
- Oracle資料庫中對BLOB資料的操作問題Oracle資料庫
- python從大小上裁切影片,批次對指定資料夾中的影片進行裁剪Python
- 由percona-data-recovery-tool恢復ibd資料的工具的一些測試
- 如何實現VM框架中的資料繫結框架
- 在Oracle中實現資料庫的複製Oracle資料庫
- django中的資料庫連線池實現Django資料庫
- 資料庫向量化入門與實現資料庫
- 資料網格與Data Fabric的區別 - thenewstack
- 利用 clip-path 實現動態區域裁剪
- PostgreSQLraster(柵格資料)st_value優化舉例SQLAST優化
- Ext實現資料拖拽功能
- MSSQL資料庫映象在Oracle中的實現方法SQL資料庫Oracle
- 在Oracle中實現資料庫的複製(轉)Oracle資料庫
- 『政善治』Postman工具 — 12、Postman中實現資料驅動Postman
- php中實現資料儲存在excelPHPExcel
- 將NC柵格表示時間維度的資料提取出來的方法
- 向量資料庫落地實踐資料庫
- 全面剖析Oracle資料庫中的分割槽功能Oracle資料庫
- 【移動資料】data pump(中) EXPDP 應用