Shapefile导入数据库 c#

xiaoxiao2021-02-28  117

研究了一天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向数据库导入单个要素类
转载请注明原文地址: https://www.6miu.com/read-35028.html

最新回复(0)