SDE连接,创建数据集,数据导入以及数据导出
by giser · 2019-04-24
目录
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(“加载成功”); -
}
转载自:https://blog.csdn.net/baidu_23263735/article/details/78259938