您的位置:首页 > 其它

SDE连接,创建数据集,数据导入以及数据导出

2016-05-29 14:42 615 查看

1.界面



2.数据库的连接

IWorkspace workspace;
IFeatureWorkspace featureWorkspace;
IRasterWorkspaceEx rasterWorkspaceEx;
IFeatureDataset featureDataset;
IRasterDataset rasterDataset;
IPropertySet propertySet;
private void btnConnectDB_Click(object sender, EventArgs e)
{
propertySet = new PropertySetClass();
propertySet.SetProperty("server", "Toby-PC");
propertySet.SetProperty("instance", "5151/tcp");
propertySet.SetProperty("database", "sde");
propertySet.SetProperty("user", "sde");
propertySet.SetProperty("password", "Toby521904");
propertySet.SetProperty("version", "SDE.DEFAULT");
IWorkspaceFactory workspaceFactory =new SdeWorkspaceFactory();
workspace = workspaceFactory.Open(propertySet, 0);
MessageBox.Show("连接成功");

}

3.创建数据集

private void btnCreateDataSet_Click(object sender, EventArgs e)
{
if (this.txtRasterDS.Text != "" || this.txtFeatureDS.Text != "")
{
featureWorkspace = workspace as IFeatureWorkspace;
rasterWorkspaceEx = workspace as IRasterWorkspaceEx;
IEnumDatasetName enumDatasetName;
bool isExit = false;
IDatasetName datasetName;
string dsName = "";
if (this.txtFeatureDS.Text != "")
{
//定义空间参考
ISpatialReferenceFactory spatialReferenceFactory = new SpatialReferenceEnvironmentClass();
ISpatialReference spatialReference = spatialReferenceFactory.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_Beijing1954);
spatialReference.SetDomain(-1000, -1000, 1000, 1000);
enumDatasetName = workspace.get_DatasetNames(esriDatasetType.esriDTFeatureDataset);
datasetName = enumDatasetName.Next();
isExit = false;
dsName = "sde.SDE." + this.txtFeatureDS.Text;
while (datasetName != null)
{
if (datasetName.Name == dsName)
{
isExit = true;
MessageBox.Show("矢量数据集已经存在!");
this.txtFeatureDS.Focus();
return;
}
datasetName = enumDatasetName.Next();
}
if (isExit == false)
{
featureDataset = featureWorkspace.CreateFeatureDataset(this.txtFeatureDS.Text, spatialReference);
}
MessageBox.Show("矢量数据集创建成功");
}
if (this.txtRasterDS.Text != "")
{
//创建影像数据集;
isExit = false;
enumDatasetName = workspace.get_DatasetNames(esriDatasetType.esriDTRasterDataset);
datasetName = enumDatasetName.Next();
dsName = "SDE." + this.txtRasterDS.Text;
while (datasetName != null)
{
if (datasetName.Name == dsName)
{
isExit = true;
MessageBox.Show("矢量数据集已经存在!");
break;
}
datasetName = enumDatasetName.Next();
}
if (isExit == false)
{
IRasterStorageDef rasterStorageDef = new RasterStorageDefClass();
rasterStorageDef.CompressionType = esriRasterCompressionType.esriRasterCompressionUncompressed;
rasterStorageDef.PyramidLevel = 1;
rasterStorageDef.PyramidResampleType = rstResamplingTypes.RSP_BilinearInterpolation;
rasterStorageDef.TileHeight = 128;
rasterStorageDef.TileWidth = 128;
IRasterDef rasterDef = new RasterDefClass();
ISpatialReference rasterDSpatialReference = new UnknownCoordinateSystemClass();
rasterDef.SpatialReference = rasterDSpatialReference;
IGeometryDef geometryDef = new GeometryDefClass();
IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef;
geometryDefEdit.AvgNumPoints_2 = 5;
geometryDefEdit.GridCount_2 = 1;
geometryDefEdit.set_GridSize(0, 1000);
geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon;
ISpatialReference spatialReference2 = new UnknownCoordinateSystemClass();
geometryDefEdit.SpatialReference_2 = spatialReference2;
rasterDataset = rasterWorkspaceEx.CreateRasterDataset(this.txtRasterDS.Text, 1, rstPixelType.PT_LONG, rasterStorageDef, "DEFAULTS", rasterDef, geometryDef);
MessageBox.Show("栅格数据集创建成功");
}
}
}
}<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>

4.矢量数据直接导入sde

private void importFToSDE_Click(object sender, EventArgs e)
{
try
{
IDataset pDataSet = workspace as IDataset;
this.openFileDialog1.Filter = "shp file(*.shp)|*.shp";
this.openFileDialog1.Title = "打开矢量数据";
this.openFileDialog1.Multiselect = false;
string fileName = "";
if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
{
fileName = this.openFileDialog1.FileName;
FileInfo fileInfo = new FileInfo(fileName);
string filePath = fileInfo.DirectoryName;
string file = fileInfo.Name;
FeatureClassToFeatureClass(pDataSet, filePath, file, "dddd", true);
}
MessageBox.Show("导入成功");
}
catch (Exception ee)
{
MessageBox.Show(ee.ToString());
}
}

public void FeatureClassToFeatureClass(IDataset pDataSet, string strFeatFileDir, string strFeatFileName, string strOutName, bool isWorkspace)
{
try
{
IWorkspaceFactory pWSF = new ShapefileWorkspaceFactoryClass();
IFeatureWorkspace pFeatureWK = (IFeatureWorkspace)pWSF.OpenFromFile(strFeatFileDir, 0);
IFeatureClass pInFeatureClass = pFeatureWK.OpenFeatureClass(strFeatFileName);
if (pInFeatureClass == null || pDataSet == null)
{
MessageBox.Show("创建失败");
return;
}
IFeatureClassName pInFeatureclassName;
IDataset pIndataset = (IDataset)pInFeatureClass;
pInFeatureclassName = (IFeatureClassName)pIndataset.FullName;
//如果名称已存在
IWorkspace2 pWS2 = null;
if (isWorkspace)
pWS2 = pDataSet as IWorkspace2;
else
pWS2 = pDataSet.Workspace as IWorkspace2;
if (pWS2.get_NameExists(esriDatasetType.esriDTFeatureClass, strOutName))
{
DialogResult result;
result = System.Windows.Forms.MessageBox.Show(null, "矢量文件名  " + strOutName + "  在数据库中已存在!" + "/r是否覆盖?", "相同文件名", MessageBoxButtons.YesNo, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
//覆盖原矢量要素
if (result == DialogResult.Yes)
{
IFeatureWorkspace pFWS = (IFeatureWorkspace)pWS2;
IDataset pDataset = pFWS.OpenFeatureClass(strOutName) as IDataset;
pDataset.Delete();
pDataset = null;
}
}
IFields pInFields, pOutFields;
IFieldChecker pFieldChecker = new FieldCheckerClass();
IEnumFieldError pError;
pInFields = pInFeatureClass.Fields;
pFieldChecker.Validate(pInFields, out pError, out pOutFields);
IField geoField = null;
for (int i = 0; i < pOutFields.FieldCount; i++)
{
IField pField = pOutFields.get_Field(i);
if (pField.Type == esriFieldType.esriFieldTypeOID)
{
IFieldEdit pFieldEdit = (IFieldEdit)pField;
pFieldEdit.Name_2 = pField.AliasName;
}
if (pField.Type == esriFieldType.esriFieldTypeGeometry)
{
geoField = pField;
break;
}
}
IGeometryDef geometryDef = geoField.GeometryDef;
IFeatureDataConverter one2another = new FeatureDataConverterClass();
IFeatureClassName pOutFeatureClassName = new FeatureClassNameClass();
IDatasetName pOutDatasetName = (IDatasetName)pOutFeatureClassName;
if (isWorkspace)
pOutDatasetName.WorkspaceName = (IWorkspaceName)pDataSet.FullName;
else
pOutDatasetName.WorkspaceName = (IWorkspaceName)((IDataset)pDataSet.Workspace).FullName;
pOutDatasetName.Name = strOutName;
if (isWorkspace)
{
one2another.ConvertFeatureClass(pInFeatureclassName, null, null, pOutFeatureClassName, geometryDef, pOutFields, "", 1000, 0);
}
else
{
IFeatureDataset pFeatDS = (IFeatureDataset)pDataSet;
IFeatureDatasetName pOutFeatDSName = pFeatDS.FullName as IFeatureDatasetName;
one2another.ConvertFeatureClass(pInFeatureclassName, null, pOutFeatDSName, pOutFeatureClassName, geometryDef, pOutFields, "", 1000, 0);
pOutFeatDSName = null;
pFeatDS = null;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
}

5.矢量数据导入sde数据集

       
private void importF_Click(object sender, EventArgs e)
{
featureWorkspace = workspace as IFeatureWorkspace;
this.openFileDialog1.Filter = "shp file(*.shp)|*.shp";
this.openFileDialog1.Title = "打开矢量数据";
this.openFileDialog1.Multiselect = false;
string fileName = "";
if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
{
fileName = this.openFileDialog1.FileName;
FileInfo fileInfo = new FileInfo(fileName);
string filePath = fileInfo.DirectoryName;
string file = fileInfo.Name;
IWorkspaceFactory shpwpf = new ShapefileWorkspaceFactory();
IWorkspace shpwp = shpwpf.OpenFromFile(filePath, 0);
IFeatureWorkspace shpfwp = shpwp as IFeatureWorkspace;
IFeatureClass shpfc = shpfwp.OpenFeatureClass(file);
//导入SDE数据库
IFeatureClass sdeFeatureClass = null;
IFeatureClassDescription featureClassDescription = new FeatureClassDescriptionClass();
IObjectClassDescription objectClassDescription = featureClassDescription as IObjectClassDescription;
IFields fields = shpfc.Fields;
IFieldChecker fieldChecker = new FieldCheckerClass();
IEnumFieldError enumFieldError = null;
IFields vFields = null;
fieldChecker.ValidateWorkspace = featureWorkspace as IWorkspace;
fieldChecker.Validate(fields,out enumFieldError,out vFields);
featureDataset = featureWorkspace.OpenFeatureDataset(this.txtFeatureDS.Text);
try
{
sdeFeatureClass = featureWorkspace.OpenFeatureClass(shpfc.AliasName);
}
catch
{

}
if (sdeFeatureClass == null)
{
sdeFeatureClass = featureDataset.CreateFeatureClass(shpfc.AliasName, vFields,
objectClassDescription.InstanceCLSID, objectClassDescription.ClassExtensionCLSID,
shpfc.FeatureType, shpfc.ShapeFieldName, "");
IFeatureCursor featureCursor = shpfc.Search(null, true);
IFeature feature = featureCursor.NextFeature();
IFeatureCursor sdeFeatureCursor = sdeFeatureClass.Insert(true);
IFeatureBuffer sdeFeatureBuffer;
while (feature != null)
{
sdeFeatureBuffer = sdeFeatureClass.CreateFeatureBuffer();
IField shpField = new FieldClass();
IFields shpFields = feature.Fields;
for (int i = 0; i < shpFields.FieldCount; i++)
{
shpField = shpFields.get_Field(i);
int index = sdeFeatureBuffer.Fields.FindField(shpField.Name);
if (index != -1)
{
sdeFeatureBuffer.set_Value(index, feature.get_Value(i));
}
}
sdeFeatureCursor.InsertFeature(sdeFeatureBuffer);
sdeFeatureCursor.Flush();
feature = featureCursor.NextFeature();
}
}
}
MessageBox.Show("导入成功");
}

6.导入栅格数据

 
private void importR_Click(object sender, EventArgs e)
{
this.openFileDialog1.Filter = "Imag file (*.img)|*.img";
this.openFileDialog1.Title = "打开影像数据";
this.openFileDialog1.Multiselect = false;
string fileName = "";
if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
{
fileName = this.openFileDialog1.FileName;
string filepath;
string file;
string file1;
int lastIndex;
lastIndex = fileName.LastIndexOf(@"");
filepath = fileName.Substring(0, lastIndex);
file = fileName.Substring(lastIndex + 1);
//导入SDE数据库
rasterWorkspaceEx = workspace as IRasterWorkspaceEx;
IWorkspaceFactory tifwpf = new RasterWorkspaceFactoryClass();
IWorkspace tifwp = tifwpf.OpenFromFile(filepath, 0);
IRasterWorkspace tifrwp = tifwp as IRasterWorkspace;
IRasterDataset rasterDataset = tifrwp.OpenRasterDataset(file);
lastIndex = file.LastIndexOf(@".");
file1 = file.Substring(0, lastIndex);
imortRasterData(filepath, file, file1);
MessageBox.Show("导入成功");
}
}


private void imortRasterData(string strRasterFileDir, string strRasterFileName, string strOutName)
{
try
{
//判断是否有重名现象
IWorkspace2 pWS2 = workspace as IWorkspace2;
//如果名称已存在
if (pWS2.get_NameExists(esriDatasetType.esriDTRasterDataset, strOutName))
{
DialogResult result;
result = MessageBox.Show(this, "栅格文件名  " + strOutName + "  在数据库中已存在!" + "\r是否覆盖?", "相同文件名", MessageBoxButtons.YesNo, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
//覆盖原矢量要素
if (result == DialogResult.Yes)
{
IRasterWorkspaceEx pRWs = workspace as IRasterWorkspaceEx;
IDataset pDataset = pRWs.OpenRasterDataset(strOutName) as IDataset;
pDataset.Delete();
pDataset = null;
}
else if (result == DialogResult.No)
{
return;
}
}
IWorkspaceFactory pRasterWsFac = new RasterWorkspaceFactoryClass();
IWorkspace pWs = pRasterWsFac.OpenFromFile(strRasterFileDir, 0);
IRasterDataset pRasterDs = null;
IRasterWorkspace pRasterWs;
if (!(pWs is IRasterWorkspace))
{
return;
}
pRasterWs = pWs as IRasterWorkspace;
pRasterDs = pRasterWs.OpenRasterDataset(strRasterFileName);
ISaveAs2 saveAs2 = (ISaveAs2)pRasterDs;
IRasterStorageDef rasterStorageDef = new RasterStorageDefClass();
IRasterStorageDef2 rasterStorageDef2 = (IRasterStorageDef2)rasterStorageDef;
rasterStorageDef2.CompressionType =esriRasterCompressionType.esriRasterCompressionUncompressed;
rasterStorageDef2.CompressionQuality = 100;
rasterStorageDef2.Tiled = true;
rasterStorageDef2.TileHeight = 128;
rasterStorageDef2.TileWidth = 128;
saveAs2.SaveAsRasterDataset(strOutName, workspace, "gdb", rasterStorageDef2);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
return;
}
}
 

7.从SDE中读取数据

private void ReadFromSDE_Click(object sender, EventArgs e)
{
this.cbbDataSet.Items.Clear();
this.FeatureLayer.Items.Clear();
this.RasterLayer.Items.Clear();
IEnumDatasetName enumDatasetName;
IDatasetName datasetName;
//获取矢量数据集
enumDatasetName = workspace.get_DatasetNames(esriDatasetType.esriDTFeatureDataset);
datasetName = enumDatasetName.Next();
while (datasetName != null)
{
this.cbbDataSet.Items.Add(datasetName.Name);
datasetName = enumDatasetName.Next();
}
//获取图层名
enumDatasetName=workspace.get_DatasetNames(esriDatasetType.esriDTFeatureClass);
datasetName = enumDatasetName.Next();
while (datasetName != null)
{
this.FeatureLayer.Items.Add(datasetName.Name);
datasetName = enumDatasetName.Next();
}
//获取栅格图层名
enumDatasetName = workspace.get_DatasetNames(esriDatasetType.esriDTRasterDataset);
datasetName = enumDatasetName.Next();
while (datasetName != null)
{
this.RasterLayer.Items.Add(datasetName.Name);
datasetName = enumDatasetName.Next();
}
MessageBox.Show("读取成功");
}

8.遍历数据集中的文件

private void cbbDataSet_TextChanged(object sender, EventArgs e)
{
this.FeatureLayer.Items.Clear();
IDataset dataset;
IEnumDataset enumDataset;
enumDataset = workspace.get_Datasets(esriDatasetType.esriDTFeatureDataset);
dataset = enumDataset.Next();
IDataset pDataset = null;
while (dataset != null)
{
if (dataset.Name == this.cbbDataSet.Text)
{
pDataset = dataset as IDataset;
break;
}
dataset = enumDataset.Next();
}
IFeatureDataset featDs = pDataset as IFeatureDataset;
IFeatureClassContainer fcContainer = featDs as IFeatureClassContainer;
for (int i = 0; i < fcContainer.ClassCount; i++)
{
this.FeatureLayer.Items.Add(fcContainer.get_Class(i).AliasName);
}
}

9.数据的加载

private void btnOk_Click(object sender, EventArgs e)
{
//直接从sde中读取数据.
if (this.FeatureLayer.Text != "" && this.cbbDataSet.Text == "")
{
IEnumDataset enumDataset;
IDataset dataset;
IFeatureLayer pFeatureLayer=new FeatureLayerClass();
//获取图层名
enumDataset = workspace.get_Datasets(esriDatasetType.esriDTFeatureClass);
dataset = enumDataset.Next();
while (dataset != null)
{
if (dataset.Name.ToLower() == this.FeatureLayer.Text.ToLower())
{
pFeatureLayer.FeatureClass = dataset as IFeatureClass;
break;
}
dataset = enumDataset.Next();
}
this.axMapControl1.AddLayer(pFeatureLayer as ILayer);
this.axMapControl1.Extent = this.axMapControl1.FullExtent;
}
// 从sde数据集中读取数据
if (this.FeatureLayer.Text != "" && this.cbbDataSet.Text != "")
{
IDataset dataset;
IEnumDataset enumDataset;
enumDataset = workspace.get_Datasets(esriDatasetType.esriDTFeatureDataset);
dataset = enumDataset.Next();
IDataset pDataset = null;
while (dataset != null)
{
if (dataset.Name == this.cbbDataSet.Text)
{
pDataset = dataset as IDataset;
break;
}
dataset = enumDataset.Next();
}
IFeatureDataset featDs = pDataset as IFeatureDataset;
IFeatureLayer pFeatureLayer = new FeatureLayerClass();
IFeatureClassContainer fcContainer = featDs as IFeatureClassContainer;
for (int i = 0; i < fcContainer.ClassCount; i++)
{
if (fcContainer.get_Class(i).AliasName.ToLower() == this.FeatureLayer.Text.ToLower())
{
pFeatureLayer.FeatureClass = fcContainer.get_Class(i) as IFeatureClass;
break;
}
//this.FeatureLayer.Items.Add(fcContainer.get_Class(i).AliasName);
}
this.axMapControl1.AddLayer(pFeatureLayer as ILayer);
this.axMapControl1.Extent = this.axMapControl1.FullExtent;
}
//加载栅格数据
if (this.RasterLayer.Text != "")
{
IDataset dataset;
IEnumDataset enumDataset;
enumDataset = workspace.get_Datasets(esriDatasetType.esriDTRasterDataset);
dataset = enumDataset.Next();
IDataset pDataset = null;
while (dataset != null)
{
if (dataset.Name.ToLower() == this.RasterLayer.Text.ToLower())
{
pDataset = dataset as IDataset;
break;
}
dataset = enumDataset.Next();
}
IRasterDataset pRasterDataset = dataset as IRasterDataset;
IRasterLayer pRasLyr=new RasterLayerClass();
pRasLyr.CreateFromDataset(pRasterDataset);
this.axMapControl1.AddLayer(pRasLyr as ILayer);
this.axMapControl1.Extent = this.axMapControl1.FullExtent;
}
MessageBox.Show("加载成功");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: