最近在写数据管理,这几天写了shp数据入库,查阅了一些资料总结了一下,shp数据如有以下一些方式。首先从最简单的开始写起
1 入库shp数据与sde的要素数据集空间参考相同,这种情况下不用考虑空间参考的变换,直接将数据入库即可
/// <summary>
/// shape数据转换到空间要素数据集
/// </summary>
/// <param name="dataset">SDE要素数据集,如果数据不往要素数据集中入,此处传入SDE工作空间</param>
/// <param name="featurename">shp要素名称</param>
/// <param name="featuredir">shp文件路径。是吧文件路径作为工作空间来使用</param>
/// <param name="sdefeaturename">sde中文件名称</param>
/// <returns></returns>
private bool FeatureClassToSDE(IDataset dataset, string featurename, string featuredir, string sdefeaturename)
{
try
{
IWorkspaceFactory shpWSF = new ShapefileWorkspaceFactoryClass();///shapeFile工作工厂
IWorkspaceFactoryLockControl ipWsFactoryLock = (IWorkspaceFactoryLockControl)shpWSF;
if (ipWsFactoryLock.SchemaLockingEnabled)
{
ipWsFactoryLock.DisableSchemaLocking();
}
IFeatureWorkspace FeatureWK = (IFeatureWorkspace)shpWSF.OpenFromFile(featuredir, 0);//shapefile工作空间
IFeatureClass FeatureShp = FeatureWK.OpenFeatureClass(featurename);//矢量数据
if (dataset == null || FeatureShp == null) return false;
IDataset shpDataset = FeatureShp as IDataset;
IFeatureClassName FeatureName = shpDataset.FullName as IFeatureClassName;
#region 检测文件是否存在
IWorkspace2 sdeWorkSpace = dataset.Workspace as IWorkspace2;
if (sdeWorkSpace.get_NameExists(esriDatasetType.esriDTFeatureClass, sdefeaturename))
{
DialogResult result = MessageBox.Show(null, "矢量文件名 " + sdefeaturename + " 在数据库中已存在!" + "/r是否覆盖?", "相同文件名", MessageBoxButtons.YesNo, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
//覆盖原矢量要素
if (result == DialogResult.Yes)
{
IFeatureWorkspace pFWS = (IFeatureWorkspace)sdeWorkSpace;
IDataset tempDataset = pFWS.OpenFeatureClass(sdefeaturename) as IDataset;
tempDataset.Delete();
tempDataset = null;
}
else if (result == DialogResult.No)
{
return false;
}
}
#endregion
IFieldChecker pFieldChecker = new FieldCheckerClass();
IFields pInFields = FeatureShp.Fields;//属性结构
IFields pOutFields;
IEnumFieldError pError;
pFieldChecker.InputWorkspace = FeatureWK as IWorkspace;
pFieldChecker.ValidateWorkspace = dataset.Workspace;
pFieldChecker.Validate(pInFields, out pError, out pOutFields);
#region 获取属性字段中图形字段
///方法1
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)//图形字段,shape
{
geoField = pField;
break;
}
}
///方法2
//String shapeFieldName = FeatureShp.ShapeFieldName;//图形字段名称
//int shapeFieldIndex = FeatureShp.FindField(shapeFieldName);//图形字段缩影
//geoField = pInFields.get_Field(shapeFieldIndex);
#endregion
IGeometryDef geometryDef = geoField.GeometryDef;
//输出路径,包好工作空间和文件名
IFeatureDataConverter DataConvert = new FeatureDataConverterClass();
IFeatureClassName pOutFeatureClassName = new FeatureClassNameClass();
IDatasetName pOutDatasetName = (IDatasetName)pOutFeatureClassName;
pOutDatasetName.WorkspaceName = (IWorkspaceName)((IDataset)dataset.Workspace).FullName;
pOutDatasetName.Name = sdefeaturename;
//目的要素数据集名称
IFeatureDataset pFeatDS = (IFeatureDataset)dataset;
IFeatureDatasetName pOutFeatDSName = pFeatDS.FullName as IFeatureDatasetName;
//InputDatasetName,InputQueryFilter,outputFDatasetName,outputFClassName,OutputGeometryDef,OutputFields,configKey,FlushInterval,parentHWND
//第二个参数可以作为转换的查询过滤条件
IEnumInvalidObject InvalidErr= DataConvert.ConvertFeatureClass(FeatureName, null, pOutFeatDSName, pOutFeatureClassName, geometryDef, pOutFields, "", 1000, 0);
IInvalidObjectInfo invalidObjectInfo = null;
InvalidErr.Reset();
while ((invalidObjectInfo = InvalidErr.Next()) != null)
{
//发生错误位置
Console.WriteLine("Errors occurred for the following feature: {0}",
invalidObjectInfo.InvalidObjectID);
return false;
}
pOutFeatDSName = null;
pFeatDS = null;
return true;
}
catch (Exception ex)
{
return false;
}
}
矢量数据拓扑检查
/// <summary>
/// 检查数据库中矢量数据拓扑错误
/// </summary>
/// <param name="featureWorkspace"></param>
/// <param name="featureDatasetName"></param>
/// <param name="topologyName"></param>
/// <returns></returns>
public ITopology OpenTopologyFromFeatureWorkspace(IFeatureWorkspace featureWorkspace,
String featureDatasetName, String topologyName)
{
//打开矢量数据,
IFeatureDataset featureDataset = featureWorkspace.OpenFeatureDataset
(featureDatasetName);
ITopologyContainer topologyContainer = (ITopologyContainer)featureDataset;
// 拓扑检查
ITopology topology = topologyContainer.get_TopologyByName(topologyName);
return topology;
}
支付宝赞助 505180987@qq.com