Shapefile导入数据库 c#

来源:互联网 发布:nginx 多域名别名 编辑:程序博客网 时间:2024/05/17 05:10
研究了一天shape图层导入数据库,现将实现代码及注意事项整理如下:

//引用
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.DataSourcesGDB;
using ESRI.ArcGIS.Geometry;
using System.Runtime.InteropServices;
using ESRI.ArcGIS.Controls;

//调用方法
public void ShapefileImportDB()
{
    //将要导入数据库的shape图层添加到mapControl
    string filePath = System.AppDomain.CurrentDomain.BaseDirectory + @"data\Intersect";
    m_mapControl.AddShapeFile(filePath, "intersect.shp");
    //设置数据库连接字符串(此处采用的是Oracle数据库,其他数据库大同小异,未加以验证)
IPropertySet pPropertySet = new PropertySet();
    pPropertySet.SetProperty("Data Source", "192.168.34.54\\orcl");
    pPropertySet.SetProperty("User ID", "zsdz");
    pPropertySet.SetProperty("Password", "Zs123456");
    //pPropertySet.SetProperty("version", "SDE.DEFAULT");
    IFeatureLayer m_featureLayer = m_mapControl.get_Layer(0) as IFeatureLayer;
    IFeatureClass m_featureClass = m_featureLayer.FeatureClass;
    IWorkspaceFactory pWorkspaceFactory = new SdeWorkspaceFactory();
    IWorkspace pWorkspace = pWorkspaceFactory.Open(pPropertySet, 1);
    int code = getSpatialReferenceCode(m_featureClass);// 
    string datasetName = m_featureClass.AliasName;
    //删除数据库中原有的相同的要素类(因为我的写程序要定时将新生成的shape图层更新到数据库,所以要先对数据库原有的要输类进行删除)
DeleteFeatureDataset(pWorkspace, "ZSQYFJ_PY");
    //根据名称获取要素集(若数据库中存在该名称的要素集,则获取;若无,新建)
IFeatureDataset pFeatureDataset = getFeatureDataset(pWorkspace, "QYFJ");
    if (pFeatureDataset == null)
    {
        pFeatureDataset = CreateFeatureClass(pWorkspace, code, "QYFJ");
}
//得到数据集后,将要素类导入数据库
    importToDB(m_featureClass, pWorkspace, pFeatureDataset, "ZSQYFJ_PY"); 
}

//获取数据库中的要素集
private IFeatureDataset getFeatureDataset(IWorkspace pWorkspace, string datasetName)
{
    IFeatureDataset pFeatureDataset = null;
    IEnumDataset               pEnumDataset=pWorkspace.get_Datasets(esriDatasetType.esriDTFeatureDataset);
    pEnumDataset.Reset();
    IDataset pDataset = pEnumDataset.Next();
    while (pDataset != null)
    {
        if (pDataset.Type == esriDatasetType.esriDTFeatureDataset)
        {
             if (pDataset.Name == "ZSDZ." + datasetName)
             {
                 pFeatureDataset = pDataset as IFeatureDataset;
             }
             pDataset = pEnumDataset.Next();
         }
     }
     return pFeatureDataset;
}

//获取参照投影的代号
private int getSpatialReferenceCode(IFeatureClass pFeatureClass)
{
     IDataset dataset = pFeatureClass as IDataset;
     IGeoDataset geoDataset = (IGeoDataset)dataset;
     int code = geoDataset.SpatialReference.FactoryCode;
     return code;
}

//数据库中无想要要素集情况下新建要素集
private IFeatureDataset CreateFeatureClass(IWorkspace workspace, int code, string datasetName)
{
     IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace;
     //创建一个要素创建一个投影
     ISpatialReferenceFactory spatialRefFactory = new SpatialReferenceEnvironment();
     ISpatialReference spatialReference = spatialRefFactory.CreateProjectedCoordinateSystem(code);
     //确定是否支持高精度存储空间  
     Boolean supportsHighPrecision = false;
     IWorkspaceProperties workspaceProperties = (IWorkspaceProperties)workspace;
     IWorkspaceProperty workspaceProperty = workspaceProperties.get_Property
         (esriWorkspacePropertyGroupType.esriWorkspacePropertyGroup,
         (int)esriWorkspacePropertyType.esriWorkspacePropSupportsHighPrecisionStorage);
     if (workspaceProperty.IsSupported)
     {
         supportsHighPrecision = Convert.ToBoolean(workspaceProperty.PropertyValue);
      }
      //设置投影精度
      IControlPrecision2 controlPrecision = (IControlPrecision2)spatialReference;
      controlPrecision.IsHighPrecision = supportsHighPrecision;
      //设置容差  
      ISpatialReferenceResolution spatialRefResolution =            (ISpatialReferenceResolution)spatialReference;
      spatialRefResolution.ConstructFromHorizon();
      spatialRefResolution.SetDefaultXYResolution();
      ISpatialReferenceTolerance spatialRefTolerance = (ISpatialReferenceTolerance)spatialReference;
      spatialRefTolerance.SetDefaultXYTolerance();
      //创建要素集
      IFeatureDataset featureDataset = featureWorkspace.CreateFeatureDataset(datasetName, spatialReference);
      return featureDataset;
}

//shapefile导入数据库
private void importToDB(IFeatureClass pFeaClass, IWorkspace pWorkspace, IFeatureDataset tFeatureClass, string SHPName)
{
     IFeatureClassDescription featureClassDescription = new FeatureClassDescriptionClass();
     IObjectClassDescription objectClassDescription = featureClassDescription as IObjectClassDescription;

     IFields pFields = pFeaClass.Fields;
     IFieldChecker pFieldChecker = new FieldCheckerClass();
     IEnumFieldError pEnumFieldError = null;
     IFields vFields = null;
     pFieldChecker.ValidateWorkspace = pWorkspace as IWorkspace;
     pFieldChecker.Validate(pFields, out pEnumFieldError, out vFields);
     IFeatureWorkspace featureWorkspace = pWorkspace as IFeatureWorkspace;
     IFeatureClass sdeFeatureClass = null;
     if (sdeFeatureClass == null)
     {
         sdeFeatureClass = tFeatureClass.CreateFeatureClass(SHPName, vFields,
              objectClassDescription.InstanceCLSID, objectClassDescription.ClassExtensionCLSID,
         pFeaClass.FeatureType, pFeaClass.ShapeFieldName, "");
         IFeatureCursor featureCursor = pFeaClass.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);
                   //此处忽略掉“DZHJTJ”字段,因为shape图层的这个字段存在null值,导入数据库会出错 
                   if (shpField.Name.Contains("DZHJTJ")) continue;
                   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();
           }
           featureCursor.Flush();
           //Marshal.ReleaseComObject(feature);
           Marshal.ReleaseComObject(featureCursor);
    }
}

//删除要素集
public static bool DeleteFeatureDataset(IWorkspace ws, string name)
{
     if (ws == null || string.IsNullOrEmpty(name))
     { 
       return false;
     }
     IFeatureDataset pFeaDataSet;
     IEnumDatasetName pEnumDatasetName;
     IFeatureWorkspace pFeaWorkspace;
     IDatasetName pDatasetName;
     try
     {
          pFeaWorkspace = ws as IFeatureWorkspace;
          pEnumDatasetName = ws.get_DatasetNames(esriDatasetType.esriDTFeatureClass ^ esriDatasetType.esriDTFeatureDataset);
          pEnumDatasetName.Reset();
          pDatasetName = pEnumDatasetName.Next();
          while (pDatasetName != null)
           {
               if (pDatasetName.Type == esriDatasetType.esriDTFeatureDataset)
               {
                        // 
                   IEnumDatasetName pEnumFcName = (pDatasetName as IFeatureDatasetName).FeatureClassNames;
                   IDatasetName pFcName = pEnumFcName.Next();
                   while (pFcName != null)
                   {
                        if (pFcName.Name.IndexOf(name) >= 0)
                        {
                             DeleteByName(pFeaWorkspace, pFcName);
                             return true;
                        }
                        pFcName = pEnumFcName.Next();
                    }
                 }
                 else
                 {
                     if (pDatasetName.Name.IndexOf(name) >= 0)
                     {
                         DeleteByName(pFeaWorkspace, pDatasetName);
                         return true;
                      }
                 }
                 pDatasetName = pEnumDatasetName.Next();
            }
            return false;
       }
       catch (Exception ex)
       {
           //ErrMsg = ex.Message;
           return false;
       }
}

private static void DeleteByName(IFeatureWorkspace pFeaWorkspace, IDatasetName pDatasetName)
{
IFeatureWorkspaceManage pWorkspaceManager = pFeaWorkspace as IFeatureWorkspaceManage;
    pWorkspaceManager.DeleteByName(pDatasetName);
}

注意:①LisenceControl一定要勾选ArcGIS Engine Enterprise Geo…
      ②IWorkspaceFactory接口的Open方法:
public IWorkspace Open (IPropertySet ConnectionProperties, int hWnd);
两个参数:前者即数据库连接方法,后者我也没搞太懂,经过多次测试似乎是数据库连接弹窗的样式,当hWnd=0时,程序运行是弹窗,只有点击ok后程序继续运行;若hWnd=1,则不会弹窗,程序默认ok后继续进行。


本程序实现结果就是ArcMap向数据库导入单个要素类
原创粉丝点击