ARCGIS Engine 开发Shp数据写入SDE(sql)

最近在写数据管理,这几天写了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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值