using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.DataSourcesRaster;
using ESRI.ArcGIS.Geometry;
namespace Subsidence_Forecast_System.Class
{
class WriteToSDE
{
#region 全局变量,构造函数
//protected SDEConnectParas paras;
private FileWorkSpace pFileWorkSpace;
public WriteToSDE(SDEConnectParas para)
{
//paras = para;
pFileWorkSpace = new FileWorkSpace();
}
#endregion
#region 初始化SDE连接参数
private SDEConnectPara InitPara()
{
//paras.ReadFromFile();
string Server = "ORCLSDE_192.168.71.162";
string Instance = "5151";
string User = "sde";
string Pass = "sde";
string Database = "ORCLSDE";
string Version = "SDE_DEFAULT";
//paras.GetSDEParameters(out Server, out Instance, out User, out Pass, out Database, out Version);
//从paras中获取SDE连接参数
SDEConnectPara para = new SDEConnectPara();
para.Server = Server;
para.Instance = Instance;
para.User = User;
para.Password = Pass;
para.Database = Database;
para.Version = Version;
return para;
}
#endregion
#region 连接到工作空间
public ConnectRasterWorkSpaceDef ConnToSdeRasterDef()
{
SDEConnectPara para = InitPara();
ConnectRasterWorkSpaceDef ConnRasterDef = new ConnectRasterWorkSpaceDef(para);
return ConnRasterDef;
}
public ConnectFeatureWorkSpaceDef ConnToSdeFeatureDef()
{
SDEConnectPara para = InitPara();
ConnectFeatureWorkSpaceDef ConnFeatureDef = new ConnectFeatureWorkSpaceDef(para);
return ConnFeatureDef;
}
#endregion
#region 读取空间矢量和栅格数据
public IRasterDataset GetRasterDataset(ConnectRasterWorkSpaceDef ConnDef, string RasterName)
{
ConnectRasterWorkSpaceGet pWorkSpaceGet = new ConnectRasterWorkSpaceGet(ConnDef);
IRasterWorkspaceEx pWorkSpace = pWorkSpaceGet.GetSDEWorkspace();
if (pWorkSpace == null) return null;
try
{
return pWorkSpace.OpenRasterDataset(RasterName);
}
catch
{
return null;
}
}
public IFeatureClass GetFeatureClass(ConnectFeatureWorkSpaceDef ConnDef, string FeatureName)
{
ConnectFeatureWorkSpaceGet pWorkSpaceGet = new ConnectFeatureWorkSpaceGet(ConnDef);
IFeatureWorkspace pWorkSpace = pWorkSpaceGet.GetSDEWorkspace();
if (pWorkSpace == null) return null;
try
{
return pWorkSpace.OpenFeatureClass(FeatureName);
}
catch
{
return null;
}
}
#endregion
#region sde处理栅格
public bool WriteRasterToSDE(Guid MapGuid, ConnectRasterWorkSpaceDef ConnDef, string filePath)
{
ConnectRasterWorkSpaceGet pWorkSpaceGet = new ConnectRasterWorkSpaceGet(ConnDef);
IRasterWorkspaceEx pWorkSpace = pWorkSpaceGet.GetSDEWorkspace();
//pWorkSpace.SaveAsRasterDataset("fasdf",pDataSet.CreateDefaultRaster(),null,"",null,null);
string LayerStoreName = CopyRasterToSSDE(filePath, pWorkSpace);
//#region 写入数据库图层信息
//WriteToDB wtd = new WriteToDB();
//FilePath file = new FilePath(filePath);
//wtd.WriteLayerInfo(file.GetFileName(), MapGuid, 1, LayerStoreName);
//#endregion
return true;
}
public string CopyRasterToSSDE(string filePath, IRasterWorkspaceEx pWorkSpace)
{
FilePath file = new FilePath(filePath);
IRasterWorkspace2 pRW = pFileWorkSpace.OpenRasterWorkspace(file.GetDir());
IRasterDataset pRds = pRW.OpenRasterDataset(file.GetFileName());
IRasterProps pRasterProps = (IRasterProps)pRds.CreateDefaultRaster();
IRasterStorageDef pRasterStorageDef = new RasterStorageDefClass();
IRasterDef pRasterDef = new RasterDefClass();
pRasterDef.SpatialReference = pRasterProps.SpatialReference;
IGeometryDef pGeoDef = new GeometryDefClass();
IGeometryDefEdit pGeoDefEdit = pGeoDef as IGeometryDefEdit;
pGeoDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon;
pGeoDefEdit.AvgNumPoints_2 = 4;
pGeoDefEdit.GridCount_2 = 1;
pGeoDefEdit.set_GridSize(0, 1000);
pGeoDefEdit.SpatialReference_2 = pRasterProps.SpatialReference;
DateTime dt = DateTime.Now;
string timestr = "sde" + "_" + dt.Year.ToString() + dt.Month.ToString() + dt.Day.ToString() + "_" + dt.Hour + dt.Minute + dt.Second;
IRasterDataset pRasterDataset = pWorkSpace.SaveAsRasterDataset(timestr, pRds.CreateDefaultRaster(), pRasterStorageDef, "", pRasterDef, pGeoDef);
return timestr;
}
public bool CreateRasterToSSDE(IRasterDataset pRDs, IRasterWorkspaceEx pWorkSpace)
{
IRasterProps pRasterProps = (IRasterProps)pRDs.CreateDefaultRaster();
IRasterStorageDef pRasterStorageDef = new RasterStorageDefClass();
pRasterStorageDef.CompressionType = esriRasterCompressionType.esriRasterCompressionJPEG2000;
pRasterStorageDef.CompressionQuality = 50;
pRasterStorageDef.PyramidLevel = 2;
pRasterStorageDef.PyramidResampleType = rstResamplingTypes.RSP_BilinearInterpolation;
pRasterStorageDef.TileHeight = 128;
pRasterStorageDef.TileWidth = 128;
IRasterDef pRasterDef = new RasterDefClass();
pRasterDef.Description = "rasterdataset";
pRasterDef.SpatialReference = pRasterProps.SpatialReference;
IGeometryDef pGeoDef = new GeometryDefClass();
IGeometryDefEdit pGeoDefEdit = pGeoDef as IGeometryDefEdit;
pGeoDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon;
pGeoDefEdit.AvgNumPoints_2 = 4;
pGeoDefEdit.GridCount_2 = 1;
pGeoDefEdit.set_GridSize(0, 1000);
pGeoDefEdit.SpatialReference_2 = pRasterProps.SpatialReference;
//使用CreateRasterDataset创建一个新层可以
IRasterDataset pRasterDataset = pWorkSpace.CreateRasterDataset("zzy", 3, rstPixelType.PT_UCHAR, pRasterStorageDef, "", pRasterDef, pGeoDef);
pRasterDataset = pRDs;
return true;
}
#endregion
#region sde处理feature
public bool AddFeatureToSDE(Guid MapGuid, ConnectFeatureWorkSpaceDef ConnDef, IFeatureClass pFC, string LayerName)
{
ConnectFeatureWorkSpaceGet pWorkSpaceGet = new ConnectFeatureWorkSpaceGet(ConnDef);
IFeatureWorkspace pWorkSpace = pWorkSpaceGet.GetSDEWorkspace();
//pWorkSpace.SaveAsRasterDataset("fasdf",pDataSet.CreateDefaultRaster(),null,"",null,null);
string LayerStoreName = CopyFeatureToSSDE(pFC, pWorkSpace, LayerName);
//#region 写入数据库图层信息
//WriteToDB wtd = new WriteToDB();
//wtd.WriteLayerInfo(LayerName, MapGuid, 0, LayerStoreName);
//#endregion
return true;
}
public bool AddFeatureToSDE(ConnectFeatureWorkSpaceDef ConnDef, string filePath)
{
try
{
FilePath file = new FilePath(filePath);
IFeatureWorkspace pFW = pFileWorkSpace.OpenFeatureWorkspace(file.GetDir());
IFeatureClass pFC = pFW.OpenFeatureClass(file.GetFileName());
ConnectFeatureWorkSpaceGet pWorkSpaceGet = new ConnectFeatureWorkSpaceGet(ConnDef);
IFeatureWorkspace pWorkSpace = pWorkSpaceGet.GetSDEWorkspace();
CopyFeatureToSSDE(pFC, pWorkSpace, file.GetFileName());
}
catch
{
return false;
}
return true;
}
public string CopyFeatureToSSDE(IFeatureClass pFC, IFeatureWorkspace pWorkSpace, string LayerName)
{
IDataset pDataset = pFC as IDataset;
//IFeatureDataset pFD = pWorkSpace.OpenFeatureDataset("test.DBO.ContourDataSet");
DateTime dt = DateTime.Now;
string timestr = "contour" + dt.Year.ToString() + dt.Month.ToString() + dt.Day.ToString() + "_" + dt.Hour + dt.Minute + dt.Second;
IFeatureDataConverter_ConvertFeatureClass(pDataset.Workspace as IWorkspace, pWorkSpace as IWorkspace, LayerName, timestr);
return timestr;
}
public void IFeatureDataConverter_ConvertFeatureClass(IWorkspace sourceWorkspace, IWorkspace targetWorkspace, string nameOfSourceFeatureClass, string nameOfTargetFeatureClass)
{
//create source workspace name
IDataset sourceWorkspaceDataset = (IDataset)sourceWorkspace;
IWorkspaceName sourceWorkspaceName = (IWorkspaceName)sourceWorkspaceDataset.FullName;
//create source dataset name
IFeatureClassName sourceFeatureClassName = new FeatureClassNameClass();
IDatasetName sourceDatasetName = (IDatasetName)sourceFeatureClassName;
sourceDatasetName.WorkspaceName = sourceWorkspaceName;
sourceDatasetName.Name = nameOfSourceFeatureClass;
//create target workspace name
IDataset targetWorkspaceDataset = (IDataset)targetWorkspace;
IWorkspaceName targetWorkspaceName = (IWorkspaceName)targetWorkspaceDataset.FullName;
//create target dataset name
IFeatureClassName targetFeatureClassName = new FeatureClassNameClass();
IDatasetName targetDatasetName = (IDatasetName)targetFeatureClassName;
targetDatasetName.WorkspaceName = targetWorkspaceName;
targetDatasetName.Name = nameOfTargetFeatureClass;
//Open input Featureclass to get field definitions.
ESRI.ArcGIS.esriSystem.IName sourceName = (ESRI.ArcGIS.esriSystem.IName)sourceFeatureClassName;
IFeatureClass sourceFeatureClass = (IFeatureClass)sourceName.Open();
//Validate the field names because you are converting between different workspace types.
IFieldChecker fieldChecker = new FieldCheckerClass();
IFields targetFeatureClassFields;
IFields sourceFeatureClassFields = sourceFeatureClass.Fields;
IEnumFieldError enumFieldError;
// Most importantly set the input and validate workspaces!
fieldChecker.InputWorkspace = sourceWorkspace;
fieldChecker.ValidateWorkspace = targetWorkspace;
fieldChecker.Validate(sourceFeatureClassFields, out enumFieldError, out targetFeatureClassFields);
// Loop through the output fields to find the geomerty field
IField geometryField;
for (int i = 0; i < targetFeatureClassFields.FieldCount; i++)
{
if (targetFeatureClassFields.get_Field(i).Type == esriFieldType.esriFieldTypeGeometry)
{
geometryField = targetFeatureClassFields.get_Field(i);
// Get the geometry field's geometry defenition
IGeometryDef geometryDef = geometryField.GeometryDef;
//Give the geometry definition a spatial index grid count and grid size
IGeometryDefEdit targetFCGeoDefEdit = (IGeometryDefEdit)geometryDef;
targetFCGeoDefEdit.GridCount_2 = 1;
targetFCGeoDefEdit.set_GridSize(0, 0);
//Allow ArcGIS to determine a valid grid size for the data loaded
targetFCGeoDefEdit.SpatialReference_2 = geometryField.GeometryDef.SpatialReference;
// we want to convert all of the features
IQueryFilter queryFilter = new QueryFilterClass();
queryFilter.WhereClause = "";
// Load the feature class
IFeatureDataConverter fctofc = new FeatureDataConverterClass();
IEnumInvalidObject enumErrors = fctofc.ConvertFeatureClass(sourceFeatureClassName, queryFilter, null, targetFeatureClassName, geometryDef, targetFeatureClassFields, "", 1000, 0);
break;
}
}
}
#endregion
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.DataSourcesRaster;
using System.Windows.Forms;
namespace Subsidence_Forecast_System.Class
{
class FileWorkSpace
{
///
/// 打开一个Feature工作空间
///
/// 工作空间路径
///
public IFeatureWorkspace OpenFeatureWorkspace(string PathName)
{
try
{
IWorkspaceFactory workspaceFact = new ShapefileWorkspaceFactoryClass();
IWorkspace pwork = workspaceFact.OpenFromFile(PathName, 0);
IFeatureWorkspace pFeatWork = (IFeatureWorkspace)pwork;
return pFeatWork;
}
catch (Exception ex)
{
return null;
}
}
///
/// 打开一个Raster工作空间
///
/// 工作空间路径
///
public IRasterWorkspace2 OpenRasterWorkspace(string PathName)
{
try
{
IWorkspaceFactory workspaceFact = new RasterWorkspaceFactoryClass();
IWorkspace pWork = workspaceFact.OpenFromFile(PathName, 0);
IRasterWorkspace2 pRasterWork = (IRasterWorkspace2)pWork;
return pRasterWork;
}
catch (Exception ex)
{
return null;
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.DataSourcesGDB;
using ESRI.ArcGIS.esriSystem;
using System.IO;
namespace Subsidence_Forecast_System.Class
{
///
/// 连接类型
///
public enum ConnectWorkSpaceType
{
FeatureClassWorkSpace = 0,
RasterWorkSpace = 1
};
public class ConnectWorkSpaceDef
{
protected ConnectWorkSpaceType CurrentWorkSpaceType = ConnectWorkSpaceType.FeatureClassWorkSpace;
public ConnectWorkSpaceDef() { }
public ConnectWorkSpaceType GetWorkSpaceType()
{
return CurrentWorkSpaceType;
}
}
public class SDEConnectPara //SDE的连接参数
{
public string Server;
public string Instance;
public string User;
public string Password;
public string Database;
public string Version;
public SDEConnectPara()
{
Version = "SDE.DEFAULT";
}
}
#region 定义连接参数
public class ConnectFeatureWorkSpaceDef : ConnectWorkSpaceDef
{
public readonly SDEConnectPara ConnectPara;
public ConnectFeatureWorkSpaceDef(SDEConnectPara Connparas)
{
CurrentWorkSpaceType = ConnectWorkSpaceType.FeatureClassWorkSpace;
ConnectPara = Connparas;
}
}
public class ConnectRasterWorkSpaceDef : ConnectWorkSpaceDef
{
public readonly SDEConnectPara ConnectPara;
public ConnectRasterWorkSpaceDef(SDEConnectPara Connparas)
{
CurrentWorkSpaceType = ConnectWorkSpaceType.RasterWorkSpace;
ConnectPara = Connparas;
}
}
#endregion
#region 获取工作空间
///
/// 连接到SDE feature数据工作空间
///
public class ConnectFeatureWorkSpaceGet
{
private ConnectFeatureWorkSpaceDef pDef;
public ConnectFeatureWorkSpaceGet(ConnectFeatureWorkSpaceDef ConnDef)
{
pDef = ConnDef;
}
public IFeatureWorkspace GetSDEWorkspace()
//依据pDef得到SDE的工作空间
{
IWorkspaceFactory pWorkspaceFactory = new SdeWorkspaceFactoryClass();
IFeatureWorkspace pWorkspace;
SDEConnectPara para = pDef.ConnectPara;
IPropertySet pPropSet = new PropertySetClass();
pPropSet.SetProperty("SERVER", para.Server);
pPropSet.SetProperty("INSTANCE", para.Instance);
pPropSet.SetProperty("USER", para.User);
pPropSet.SetProperty("PASSWORD", para.Password);
pPropSet.SetProperty("VERSION", para.Version);//可选,缺省为SDE.DEFAULT版本
pPropSet.SetProperty("Database", para.Database);
try
{
pWorkspace = pWorkspaceFactory.Open(pPropSet, 0) as IFeatureWorkspace;
}
catch (Exception ex)
{
return null;
}
return pWorkspace;
}
}
///
/// 连接到SDE栅格数据工作空间
///
public class ConnectRasterWorkSpaceGet
{
private ConnectRasterWorkSpaceDef pDef;
public ConnectRasterWorkSpaceGet(ConnectRasterWorkSpaceDef ConnDef)
{
pDef = ConnDef;
}
public IRasterWorkspaceEx GetSDEWorkspace()
//依据pDef得到SDE的工作空间
{
IWorkspaceFactory pWorkspaceFactory = new SdeWorkspaceFactoryClass();
IRasterWorkspaceEx pWorkspace;
SDEConnectPara para = pDef.ConnectPara;
IPropertySet pPropSet = new PropertySetClass();
pPropSet.SetProperty("SERVER", para.Server);
pPropSet.SetProperty("INSTANCE", para.Instance);
pPropSet.SetProperty("USER", para.User);
pPropSet.SetProperty("PASSWORD", para.Password);
pPropSet.SetProperty("VERSION", para.Version);//可选,缺省为SDE.DEFAULT版本
pPropSet.SetProperty("Database", para.Database);
try
{
pWorkspace = pWorkspaceFactory.Open(pPropSet, 0) as IRasterWorkspaceEx;
}
catch (Exception ex)
{
return null;
}
return pWorkspace;
}
}
#endregion
#region 连接参数设置
public class SDEConnectParas
{
#region SDE连接参数
string Server = "gisserver";
string Instance = "5152/tcp";
string User = "sde";
string Pass = "sde";
string Database = "sde";
string Version = "SDE.DEFAULT";
#endregion
public void GetSDEParameters(out string server, out string instance, out string user, out string password, out string database, out string version)
{
server = Server;
instance = Instance;
user = User;
password = Pass;
database = Database;
version = Version;
}//得到SDE连接参数
//public bool ReadFromFile()
从连接参数txt文件读取属性库和SDE的连接关键参数,以及站点关键表和关键SDE要素
//{
// string lpszPathName = FilePath.GetApplicationDir();
// lpszPathName = lpszPathName + "//sdeconn.txt";
// StreamReader reader = null;
// try
// {
// reader = new StreamReader(lpszPathName);
// string line = reader.ReadLine();
// line = reader.ReadLine();
// string[] SubStrings = line.Split(':');
// Server = SubStrings[1];
// line = reader.ReadLine();
// SubStrings = line.Split(':');
// Instance = SubStrings[1];
// line = reader.ReadLine();
// SubStrings = line.Split(':');
// User = SubStrings[1];
// line = reader.ReadLine();
// SubStrings = line.Split(':');
// Pass = SubStrings[1];
// line = reader.ReadLine();
// SubStrings = line.Split(':');
// Database = SubStrings[1];
// line = reader.ReadLine();
// SubStrings = line.Split(':');
// Version = SubStrings[1];
// }
// catch (IOException e)
// {
// Console.WriteLine(e.Message);
// return false;
// }
// catch
// {
// return false;
// }
// finally
// {
// if (reader != null) reader.Close();
// }
// return true;
//}
//public void WhiteToLogFile()
写入连接参数txt文件-----属性库和SDE的连接关键参数,以及站点关键表和关键SDE要素
//{
// string lpszPathName = FilePath.GetCurrentDir();
// lpszPathName = lpszPathName + "//sdeconn.txt";
// StreamWriter writer = File.CreateText(lpszPathName);
// writer.Write("SDE配置参数");
// writer.Write(writer.NewLine);
// writer.Write("1、服务器:" + Server);
// writer.Write(writer.NewLine);
// writer.Write("2、SDE端口:" + Instance);
// writer.Write(writer.NewLine);
// writer.Write("3、用户:" + User);
// writer.Write(writer.NewLine);
// writer.Write("4、密码:" + Pass);
// writer.Write(writer.NewLine);
// writer.Write("5、数据库:" + Database);
// writer.Write(writer.NewLine);
// writer.Write("6、版本:" + Version);
// writer.Write(writer.NewLine);
// writer.Write(@"///");
// writer.Write(writer.NewLine);
// writer.Close();
//}
}
#endregion
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace Subsidence_Forecast_System.Class
{
class FilePath
{
string lpszPathName;
///
/// 构造函数
///
///
public FilePath(string PathName)
{
lpszPathName = PathName;
}
///
/// 设置文件全路径
///
///
public void SetFilePath(string PathName)
{
lpszPathName = PathName;
}
///
/// 获取路径
///
///
public string GetDir()
{
string Dir=Directory.GetParent(lpszPathName).ToString();
//if (Dir.Substring(Dir.Length - 1, 1) == ")//") Dir = Dir.Remove(Dir.Length - 1, 1);
return Dir;
}
///
/// 获取文件名称
///
///
public string GetFileName()
{
string fullpath = lpszPathName;
string filename = Path.GetFileNameWithoutExtension(fullpath);
return filename;
//fullpath.Trim();
//int ipos = fullpath.LastIndexOf("//");
//if (ipos >!= 1)
//{
// string fn = fullpath.Substring(ipos+1, fullpath.Length - ipos - 1);
//}
}
}
}