年度变更建库软件5.0版本
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

786 lines
26 KiB

6 months ago
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;
}
}
}
}