using ESRI.ArcGIS.DataSourcesRaster; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; using KGIS.Plugin.LayerProperty.Enum; using KGIS.Plugin.LayerProperty.Interface; using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Serialization; namespace KGIS.Plugin.LayerProperty.Model { [Serializable] internal class RasterProperty : IRasterProperty { private IRasterDataset m_RasterDataset; public enumRasterDataType RasterType; private string m_Raster = string.Empty; private string m_DataType = string.Empty; private string m_Folder = string.Empty; private string m_Server = string.Empty; private string m_User = string.Empty; private string m_Instance = string.Empty; private string m_Database = string.Empty; private string m_Version = string.Empty; private string m_Columns = string.Empty; private string m_Rows = string.Empty; private int m_Number_of_Bands = -1; private double m_Cellsize_X = -1.0; private double m_Cellsize_Y = -1.0; private double m_Uncompressed_Size; private string m_Format = string.Empty; private string m_Source_Type = string.Empty; private string m_Pixel_Type = string.Empty; private string m_Pixel_Depth = string.Empty; private string m_NoData_Value = string.Empty; private string m_Colormap = string.Empty; private string m_Pyramids = string.Empty; private string m_Compression = string.Empty; private double m_Top; private double m_Left; private double m_Right; private double m_Bottom; private string m_SpatialReference = string.Empty; private string m_Linear_Unit = string.Empty; private string m_Angular_Unit = string.Empty; private string m_Datum = string.Empty; private string m_False_Easting = string.Empty; private string m_False_Northing = string.Empty; private string m_Central_Meridian = string.Empty; private string m_Scale_Factor = string.Empty; private string m_Latitude_Of_Origin = string.Empty; private string m_Build_Parameters = string.Empty; private double m_Min; private double m_Max; private double m_Mean; private double m_Std_dev; private double m_Classes; [Browsable(true), Category("数据源"), DisplayName("栅格"), ReadOnly(true), XmlElement("栅格名")] public virtual string Raster { get { return this.m_Raster; } set { this.m_Raster = value; } } [Browsable(true), Category("数据源"), DisplayName("数据类型"), ReadOnly(true), XmlElement("数据类型")] public virtual string DataType { get { return this.m_DataType; } set { this.m_DataType = value; } } [Browsable(true), Category("栅格信息"), DisplayName("列数"), ReadOnly(true), XmlElement("列数")] public string Columns { get { return this.m_Columns; } set { this.m_Columns = value; } } [Browsable(true), Category("栅格信息"), DisplayName("行数"), ReadOnly(true), XmlElement("行数")] public string Rows { get { return this.m_Rows; } set { this.m_Rows = value; } } [Browsable(true), Category("栅格信息"), DisplayName("波段数"), ReadOnly(true), XmlElement("波段数")] public int Number_of_Bands { get { return this.m_Number_of_Bands; } set { this.m_Number_of_Bands = value; } } [Browsable(true), Category("栅格信息"), DisplayName("X方向分辨率"), ReadOnly(true), XmlElement("X方向分辨率")] public double Cellsize_X { get { return this.m_Cellsize_X; } set { this.m_Cellsize_X = value; } } [Browsable(true), Category("栅格信息"), DisplayName("Y方向分辨率"), ReadOnly(true), XmlElement("Y方向分辨率")] public double Cellsize_Y { get { return this.m_Cellsize_Y; } set { this.m_Cellsize_Y = value; } } [Browsable(true), Category("栅格信息"), DisplayName("无压缩大小"), ReadOnly(true), XmlElement("无压缩大小")] public double Uncompressed_Size { get { return this.m_Uncompressed_Size; } set { this.m_Uncompressed_Size = value; } } [Browsable(true), Category("栅格信息"), DisplayName("格式"), ReadOnly(true), XmlElement("格式")] public string Format { get { return this.m_Format; } set { this.m_Format = value; } } [Browsable(true), Category("栅格信息"), DisplayName("源类型"), ReadOnly(true), XmlElement("源类型")] public string Source_Type { get { return this.m_Source_Type; } set { this.m_Source_Type = value; } } [Browsable(true), Category("栅格信息"), DisplayName("像素类型"), ReadOnly(true), XmlElement("像素类型")] public string Pixel_Type { get { return this.m_Pixel_Type; } set { this.m_Pixel_Type = value; } } [Browsable(true), Category("栅格信息"), DisplayName("像素深度"), ReadOnly(true), XmlElement("像素深度")] public string Pixel_Depth { get { return this.m_Pixel_Depth; } set { this.m_Pixel_Depth = value; } } [Browsable(true), Category("栅格信息"), DisplayName("空值"), ReadOnly(true), XmlElement("空值")] public string NoData_Value { get { return this.m_NoData_Value; } set { this.m_NoData_Value = value; } } [Browsable(true), Category("栅格信息"), DisplayName("颜色表"), ReadOnly(true), XmlElement("颜色表")] public string Colormap { get { return this.m_Colormap; } set { this.m_Colormap = value; } } [Browsable(true), Category("栅格信息"), DisplayName("金字塔"), ReadOnly(true), XmlElement("金字塔")] public string Pyramids { get { return this.m_Pyramids; } set { this.m_Pyramids = value; } } [Browsable(true), Category("栅格信息"), DisplayName("压缩"), ReadOnly(true), XmlElement("压缩")] public string Compression { get { return this.m_Compression; } set { this.m_Compression = value; } } [Browsable(true), Category("影像范围"), DisplayName("上"), ReadOnly(true), XmlElement("上")] public double Top { get { return this.m_Top; } set { this.m_Top = value; } } [Browsable(true), Category("影像范围"), DisplayName("左"), ReadOnly(true), XmlElement("左")] public double Left { get { return this.m_Left; } set { this.m_Left = value; } } [Browsable(true), Category("影像范围"), DisplayName("右"), ReadOnly(true), XmlElement("右")] public double Right { get { return this.m_Right; } set { this.m_Right = value; } } [Browsable(true), Category("影像范围"), DisplayName("下"), ReadOnly(true), XmlElement("下")] public double Bottom { get { return this.m_Bottom; } set { this.m_Bottom = value; } } [Browsable(true), Category("空间参考"), DisplayName("空间参考"), ReadOnly(true), XmlElement("空间参考")] public string SpatialReference { get { return this.m_SpatialReference; } set { this.m_SpatialReference = value; } } [Browsable(true), Category("空间参考"), DisplayName("线性单位"), ReadOnly(true), XmlElement("线性单位")] public string Linear_Unit { get { return this.m_Linear_Unit; } set { this.m_Linear_Unit = value; } } [Browsable(true), Category("空间参考"), DisplayName("角度单位"), ReadOnly(true), XmlElement("角度单位")] public string Angular_Unit { get { return this.m_Angular_Unit; } set { this.m_Angular_Unit = value; } } [Browsable(true), Category("空间参考"), DisplayName("基准面"), ReadOnly(true), XmlElement("基准面")] public string Datum { get { return this.m_Datum; } set { this.m_Datum = value; } } [Browsable(true), Category("空间参考"), DisplayName("东偏"), ReadOnly(true), XmlElement("东偏")] public string False_Easting { get { return this.m_False_Easting; } set { this.m_False_Easting = value; } } [Browsable(true), Category("空间参考"), DisplayName("北偏"), ReadOnly(true), XmlElement("北偏")] public string False_Northing { get { return this.m_False_Northing; } set { this.m_False_Northing = value; } } [Browsable(true), Category("空间参考"), DisplayName("中央经线"), ReadOnly(true), XmlElement("中央经线")] public string Central_Meridian { get { return this.m_Central_Meridian; } set { this.m_Central_Meridian = value; } } [Browsable(true), Category("空间参考"), DisplayName("比例系数"), ReadOnly(true), XmlElement("比例系数")] public string Scale_Factor { get { return this.m_Scale_Factor; } set { this.m_Scale_Factor = value; } } [Browsable(true), Category("空间参考"), DisplayName("起始纬度"), ReadOnly(true), XmlElement("起始纬度")] public string Latitude_Of_Origin { get { return this.m_Latitude_Of_Origin; } set { this.m_Latitude_Of_Origin = value; } } [Browsable(true), Category("统计信息"), DisplayName("构建参数"), ReadOnly(true), XmlElement("构建参数")] public string Build_Parameters { get { return this.m_Build_Parameters; } set { this.m_Build_Parameters = value; } } [Browsable(true), Category("统计信息"), DisplayName("最小值"), ReadOnly(true), XmlElement("最小值")] public double Min { get { return this.m_Min; } set { this.m_Min = value; } } [Browsable(true), Category("统计信息"), DisplayName("最大值"), ReadOnly(true), XmlElement("最大值")] public double Max { get { return this.m_Max; } set { this.m_Max = value; } } [Browsable(true), Category("统计信息"), DisplayName("平均值"), ReadOnly(true), XmlElement("平均值")] public double Mean { get { return this.m_Mean; } set { this.m_Mean = value; } } [Browsable(true), Category("统计信息"), DisplayName("标准偏差"), ReadOnly(true), XmlElement("标准偏差")] public double Std_dev { get { return this.m_Std_dev; } set { this.m_Std_dev = value; } } [Browsable(true), Category("统计信息"), DisplayName("类"), ReadOnly(true), XmlElement("类")] public double Classes { get { return this.m_Classes; } set { this.m_Classes = value; } } public void Init(IRasterDataset pRasterDataset) { this.m_RasterDataset = pRasterDataset; this.RasterType = this.GetRasterProperty(); } public virtual void ExportToXML() { try { //RasterProperty rasterProperty = new RasterProperty(); //rasterProperty.Init(this.m_RasterDataset); //XmlSerializer xmlSerializer = new XmlSerializer(typeof(RasterProperty)); //SaveFileDialog saveFileDialog = new SaveFileDialog(); //saveFileDialog.Filter = "XML文件(*.xml)|*.xml"; //saveFileDialog.CheckPathExists = true; //if (this.m_Raster.IndexOf(".") > 0) //{ // saveFileDialog.FileName = this.m_Raster.Substring(this.m_Raster.IndexOf(".") + 1) + ".xml"; //} //else //{ // saveFileDialog.FileName = this.m_Raster + ".xml"; //} //if (saveFileDialog.ShowDialog() == DialogResult.OK && saveFileDialog.FileName.Length != 0) //{ // StreamWriter streamWriter = new StreamWriter(saveFileDialog.FileName); // xmlSerializer.Serialize(streamWriter, rasterProperty); // streamWriter.Close(); //} } catch (Exception) { } } private enumRasterDataType GetRasterProperty() { this.RasterType = enumRasterDataType.RDTUnknown; enumRasterDataType rasterType; try { IRaster raster = this.m_RasterDataset.CreateDefaultRaster(); IRasterBandCollection rasterBandCollection = (IRasterBandCollection)raster; IRasterBand rasterBand = null; rasterBand = rasterBandCollection.Item(0); IDataset dataset = (IDataset)this.m_RasterDataset; IWorkspace arg_3C_0 = dataset.Workspace; this.m_Raster = dataset.Name; IRasterProps rasterProps = (IRasterProps)raster; this.m_Columns = rasterProps.Width.ToString(); this.m_Rows = rasterProps.Height.ToString(); this.m_Number_of_Bands = rasterBandCollection.Count; this.m_Cellsize_X = rasterProps.MeanCellSize().X; this.m_Cellsize_Y = rasterProps.MeanCellSize().Y; this.m_Format = this.m_RasterDataset.Format; this.m_Source_Type = "连续"; this.m_Pixel_Type = this.GetPixelType(rasterProps.PixelType); this.m_Pixel_Depth = this.GetPixelDepth(rasterProps.PixelType); this.m_NoData_Value = this.GetNoDataValue(rasterProps); this.m_Colormap = this.GetColormapInfo(rasterBandCollection); this.m_Pyramids = this.GetPyramidsInfo(); this.m_Compression = this.m_RasterDataset.CompressionType; IEnvelope extent = rasterProps.Extent; if (extent != null) { this.m_Top = extent.YMax; this.m_Left = extent.XMin; this.m_Bottom = extent.YMin; this.m_Right = extent.XMax; } ISpatialReference spatialReference = rasterProps.SpatialReference; if (spatialReference != null) { this.m_SpatialReference = spatialReference.Name; if (spatialReference is IProjectedCoordinateSystem) { IProjectedCoordinateSystem projectedCoordinateSystem = (IProjectedCoordinateSystem)spatialReference; this.m_Linear_Unit = projectedCoordinateSystem.CoordinateUnit.Name; this.m_Angular_Unit = string.Empty; this.m_Datum = string.Empty; this.m_False_Easting = projectedCoordinateSystem.FalseEasting.ToString(); this.m_False_Northing = projectedCoordinateSystem.FalseNorthing.ToString(); this.m_Central_Meridian = projectedCoordinateSystem.get_CentralMeridian(true).ToString(); this.m_Scale_Factor = projectedCoordinateSystem.ScaleFactor.ToString(); try { this.m_Latitude_Of_Origin = projectedCoordinateSystem.LongitudeOfOrigin.ToString(); goto IL_2B7; } catch (Exception) { goto IL_2B7; } } if (spatialReference is IGeographicCoordinateSystem) { IGeographicCoordinateSystem geographicCoordinateSystem = (IGeographicCoordinateSystem)spatialReference; this.m_Linear_Unit = string.Empty; this.m_Angular_Unit = geographicCoordinateSystem.CoordinateUnit.Name; this.m_Datum = geographicCoordinateSystem.Datum.Name; this.m_False_Easting = string.Empty; this.m_False_Northing = string.Empty; this.m_Central_Meridian = string.Empty; this.m_Scale_Factor = string.Empty; this.m_Latitude_Of_Origin = string.Empty; } } IL_2B7: bool flag; rasterBand.HasStatistics(out flag); if (flag) { IRasterStatistics statistics = rasterBand.Statistics; this.m_Build_Parameters = this.GetBuildParameters(statistics); this.m_Min = statistics.Minimum; this.m_Max = statistics.Maximum; this.m_Mean = statistics.Mean; this.m_Std_dev = statistics.StandardDeviation; this.m_Classes = 0.0; } rasterType = this.RasterType; } catch (Exception) { rasterType = this.RasterType; } return rasterType; } private string GetBuildParameters(IRasterStatistics statistics) { string text = ""; try { text = "忽略列: " + statistics.SkipFactorY.ToString(); text = text + " 忽略行: " + statistics.SkipFactorX.ToString(); text += " 忽略值: "; if (statistics.IgnoredValues != null) { text += statistics.IgnoredValues.ToString(); } } catch (Exception) { } return text; } private string GetNoDataValue(IRasterProps pRasterProps) { string result; try { string text = ""; result = text; } catch (Exception) { result = ""; } return result; } private string GetPyramidsInfo() { string result; try { IRasterPyramid rasterPyramid = (IRasterPyramid)this.m_RasterDataset; if (rasterPyramid.Present) { IRasterPyramid2 rasterPyramid2 = (IRasterPyramid2)rasterPyramid; result = string.Concat(new object[] { "金字塔等级:", rasterPyramid2.PyramidLevel, " 重采样方法:", rasterPyramid2.PyramidResamplingMethod.ToString() }); } else { result = "缺失"; } } catch { result = "已构建"; } return result; } private string GetColormapInfo(IRasterBandCollection pRasterCol) { string result; try { for (int i = 0; i < pRasterCol.Count; i++) { IRasterBand rasterBand = pRasterCol.Item(i); bool flag; rasterBand.HasColormap(out flag); if (flag) { IRasterColormap colormap = rasterBand.Colormap; object colors = colormap.Colors; Color color = (Color)colors; result = string.Concat(new object[] { "R:", color.R, " G:", color.G, " B:", color.B }); return result; } } result = "缺失"; } catch (Exception) { result = "缺失"; } return result; } private string GetPixelType(rstPixelType type) { switch (type) { case rstPixelType.PT_UNKNOWN: return "未知"; case rstPixelType.PT_U1: return "1 bit"; case rstPixelType.PT_U2: return "2 bit"; case rstPixelType.PT_U4: return "4 bit"; case rstPixelType.PT_UCHAR: return "unsigned 8 bit"; case rstPixelType.PT_CHAR: return "signed 8 bit"; case rstPixelType.PT_USHORT: return "unsigned 16 bit"; case rstPixelType.PT_SHORT: return "signed 16 bit"; case rstPixelType.PT_ULONG: return "unsigned 32 bit"; case rstPixelType.PT_LONG: return "signed 32 bit"; case rstPixelType.PT_FLOAT: return "float"; case rstPixelType.PT_DOUBLE: return "double"; case rstPixelType.PT_COMPLEX: return "complex"; case rstPixelType.PT_DCOMPLEX: return "double precision complex"; default: return type.ToString(); } } private string GetPixelDepth(rstPixelType type) { switch (type) { case rstPixelType.PT_UNKNOWN: return "未知"; case rstPixelType.PT_U1: return "1 bit"; case rstPixelType.PT_U2: return "2 bit"; case rstPixelType.PT_U4: return "4 bit"; case rstPixelType.PT_UCHAR: return "8 bit"; case rstPixelType.PT_CHAR: return "8 bit"; case rstPixelType.PT_USHORT: return "16 bit"; case rstPixelType.PT_SHORT: return "16 bit"; case rstPixelType.PT_ULONG: return "32 bit"; case rstPixelType.PT_LONG: return "32 bit"; case rstPixelType.PT_FLOAT: return "32 bit"; case rstPixelType.PT_DOUBLE: return "32 bit"; default: return ""; } } private void InitProperty(enumRasterDataType pType) { switch (pType) { case enumRasterDataType.RDTFileSystem: case enumRasterDataType.RDTLocalDatabase: case enumRasterDataType.RDTRemoteDatabase: case enumRasterDataType.RDTUnknown: return; } } } }