矢量转栅格工具中,如果CellSize设置不对,会导致XX的失败,所以可以提前通过坐标系判断是经纬度的还是以米为单位的数据。
/// <summary>
/// 根据图层的信息判断要栅格的cellSize
/// </summary>
/// <param name="featureLayer"></param>
/// <param name="cellSizeOfMeter"></param>
/// <returns></returns>
public double GetRasterfyCellSize(IFeatureLayer featureLayer, double cellSizeOfMeter = 30)
{
GeographicBoundingBox geoBox = CommonUtils.GetFeatureLayerBoundingBox(featureLayer);
var m_isDegreeLayer = (geoBox.East - geoBox.West) < 10;
if (m_isDegreeLayer)
{
return cellSizeOfMeter / MathAlgorithm.MeterPerDegree();
}
else
{
return cellSizeOfMeter;
}
}
/// <summary>
/// 使用原生接口进行栅格化
/// -最好通过GetRasterfyCellSize来进行处理
/// </summary>
/// <param name="featureLayer">要素图层</param>
/// <param name="valueField">栅格化字段名称</param>
/// <param name="outputRasterFolderPath">输出tif文件全路径</param>
/// <param name="cellSize">可选参数|与坐标系有关。像元分辨率,默认30</param>
/// <returns></returns>
public IRasterLayer Rasterify(IFeatureLayer featureLayer, string valueField, double cellSize = 30, string gdbStorePath = null)
{
IConversionOp conversionOp = new RasterConversionOpClass();
IFeatureClassDescriptor descriptor = new FeatureClassDescriptorClass();
descriptor.Create(featureLayer.FeatureClass, null, valueField);
IGeoDataset geoDataset = descriptor as IGeoDataset;
string outputRasterFolderPath = AG.COM.SDM.Utility.CommonConstString.STR_TempPath + "\\" + "Rasterify\\";
if (Directory.Exists(outputRasterFolderPath) == false)
{
Directory.CreateDirectory(outputRasterFolderPath);
}
IRasterAnalysisEnvironment rasterAnalysisEnvironment = conversionOp as IRasterAnalysisEnvironment;
rasterAnalysisEnvironment.SetCellSize(esriRasterEnvSettingEnum.esriRasterEnvValue, cellSize);
rasterAnalysisEnvironment.SetExtent(esriRasterEnvSettingEnum.esriRasterEnvValue, geoDataset.Extent, null);
string fileName = featureLayer.Name + "栅格";
IWorkspace workspace = null;
GDBHelper gdbHelper = null;
if (string.IsNullOrEmpty(gdbStorePath))
{
IWorkspaceFactory factoryClass = new RasterWorkspaceFactoryClass();
workspace = factoryClass.OpenFromFile(outputRasterFolderPath, 0);
int index = 0;
while (true)
{
if (File.Exists(System.IO.Path.Combine(outputRasterFolderPath, fileName + ".tif")))
{
fileName = featureLayer.Name + "栅格" + (index++);
}
else
{
break;
}
}
}
else
{
gdbHelper = CommonUtils.GetGDBHelper(gdbStorePath);
gdbHelper.Open();
gdbHelper.DeleteRasterLayer(fileName);
workspace = gdbHelper.SourceWorkspace;
}
IRasterDataset resultDataset = conversionOp.ToRasterDataset(geoDataset, "TIFF", workspace, fileName);
IRasterLayer resultLayer = new RasterLayerClass();
resultLayer.CreateFromDataset(resultDataset);
if (gdbHelper != null)
gdbHelper.Close();
return resultLayer;
}
如果非GP工具调用直接死掉(不报异常,请删除C:\Users\PC25\AppData\Local\Temp)下面的所有文件。