AE中将CAD中的要素导入SDE库中,并将要素信息显示在地图上,问题是要素属性信息都已经导入进去了,但是地图上显示不出来

//主方法,导入CAD并显示在地图上public static void showCADInMap(string file_path, string layer_name, DataTable dt)
        {
            string databaseName = SQLDataAccess.Database;//新建的数据库名称
            string fcDatasetName = "sde.DBO." + databaseName;//目标要素集名称
            bf.DelDataset(fcDatasetName);//由于导入CAD参考系不一样,故先删除要素集,新建一个满足需求的要素集

            ExportShapeFile importshape = new ExportShapeFile();
            IFeatureClass pFeatCls_temp = esf.GetCADFeatures(file_path, layer_name);//从Cad中得到要素类

            bf.CreateFeatureDatasetforCad(fcDatasetName, bf.getPSR(pFeatCls_temp));//重新生成一个要素集

            //在SDE指定要素集中新建要素类
            IFields pFields = bf.CreateFields1(layer_name, bf.getPSR(pFeatCls_temp));
            string str_FeatClsName = bf.GetRandomCode() + "_" + bf.ConvertLayerName(layer_name);
            IFeatureDataset pFeatDs = bf.getDataset(fcDatasetName) as IFeatureDataset;//获取SDE空间要素集
            IFeatureClass pFeatCls = bf.CreateFeatureClass(pFeatDs, str_FeatClsName, pFields);
            IFeatureClass pFeatClsTemp = bf.InsertFeats(pFeatCls, dt);
            SQLDataAccess.Database = databaseName;
            GISImport.SetMxdSource(pFeatClsTemp, layer_name);//为mxd设置数据源
            axMapControl.LoadMxFile("D:\\mxd\\" + databaseName + ".mxd");//重新加载mxd
        }
//子方法,从Cad中得到要素类
public IFeatureClass GetCADFeatures(string str_filePath,string str_layerName)
        {
            string str_CADfileDirectory = getNames(str_filePath)[0].ToString();//CAD文件所在文件夹路径
            string str_cadName = getNames(str_filePath)[1].ToString();//CAD文件名
            IWorkspaceFactory pCadWorkspacefactory = new CadWorkspaceFactoryClass();
            IFeatureWorkspace pWorkspace;
            pWorkspace = pCadWorkspacefactory.OpenFromFile(str_CADfileDirectory, 0) as IFeatureWorkspace;
            IFeatureDataset pFeatDataset;
            pFeatDataset = pWorkspace.OpenFeatureDataset(str_cadName);
            IFeatureClassContainer pFeatClassContainer;
            pFeatClassContainer = pFeatDataset as IFeatureClassContainer;
            IFeatureClass pFeatClass = null;
            int i;
            for (i = 0; i < pFeatClassContainer.ClassCount; i++)
            {
                IFeatureClass temp = pFeatClassContainer.get_Class(i);
                if (("Polyline".Equals(temp.AliasName) && "管道".Equals(str_layerName)) || ("Point".Equals(temp.AliasName) && !"管道".Equals(str_layerName)))
                {
                    pFeatClass = temp;
                    break;
                }
                else
                {
                    continue;
                }
            }
            return pFeatClass;
        }
//子方法,创建属性字段
public IFields CreateFields1(string str_layername, ISpatialReference pSR)
        {
            IField oField = new FieldClass();
            IFieldEdit oFieldEdit = oField as IFieldEdit;
            IFields oFields = new FieldsClass();
            IFieldsEdit oFieldsEdit = oFields as IFieldsEdit;
            oFieldEdit.Name_2 = "ObjectID";
            oFieldEdit.AliasName_2 = "FID";
            oFieldEdit.Type_2 = esriFieldType.esriFieldTypeOID;
            oFieldsEdit.AddField(oField);

            oField = new FieldClass();
            oFieldEdit = oField as IFieldEdit;
            oFieldEdit.Name_2 = "ElementId";
            oFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
            oFieldsEdit.AddField(oField);

            oField = new FieldClass();
            oFieldEdit = oField as IFieldEdit;
            oFieldEdit.Name_2 = "X";
            oFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble;
            oFieldsEdit.AddField(oField);

            oField = new FieldClass();
            oFieldEdit = oField as IFieldEdit;
            oFieldEdit.Name_2 = "Y";
            oFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble;
            oFieldsEdit.AddField(oField);

            oField = new FieldClass();
            oFieldEdit = oField as IFieldEdit;
            oFieldEdit.Name_2 = "elev";
            oFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble;
            oFieldsEdit.AddField(oField);

            oField = new FieldClass();
            oFieldEdit = oField as IFieldEdit;
            oFieldEdit.Name_2 = "Shape";
            oFieldEdit.IsNullable_2 = true;
            oFieldEdit.Required_2 = true;
            IGeometryDef geometryDef = new GeometryDefClass();
            IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef;
            geometryDef = new GeometryDefClass();
            geometryDefEdit = (IGeometryDefEdit)geometryDef;
            geometryDefEdit.AvgNumPoints_2 = 1;
            geometryDefEdit.GridCount_2 = 0;
            geometryDefEdit.HasM_2 = false;
            geometryDefEdit.HasZ_2 = false;
            oFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
            if ("管道".Equals(str_layername))
            {
                geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolyline;
            }
            else
            {
                geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;
            }
            geometryDefEdit.SpatialReference_2 = pSR;
            oFieldEdit.GeometryDef_2 = (GeometryDef)geometryDefEdit;
            oFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
            oFieldsEdit.AddField(oField);

            return oFields;
        }
//子方法,创建要素类
 public IFeatureClass CreateFeatureClass(IFeatureDataset featureDataset, String featureClassName, IFields fields)
        {
            IFeatureClass featureClass = null;
            // assign the class id value if not assigned
            ESRI.ArcGIS.esriSystem.UID CLSID = null;
            ESRI.ArcGIS.esriSystem.UID CLSEXT = null;
            string strConfigKeyword = "";
            if (CLSID == null)
            {
                CLSID = new ESRI.ArcGIS.esriSystem.UIDClass();
                CLSID.Value = "esriGeoDatabase.Feature";
            }

            System.String strShapeField = "";

            // locate the shape field
            for (Int32 j = 0; j < fields.FieldCount; j++)
            {
                esriFieldType dd = fields.get_Field(j).Type;
                if (dd == esriFieldType.esriFieldTypeGeometry)
                {
                    strShapeField = fields.get_Field(j).Name;
                }
            }

            // finally create and return the feature class
            if (featureDataset != null)
            {
                featureClass = featureDataset.CreateFeatureClass(featureClassName, fields, CLSID, CLSEXT, esriFeatureType.esriFTSimple, strShapeField, strConfigKeyword);
            }

            return featureClass;
        }
//子方法,将dt里的值绑定给各个要素
public IFeatureClass InsertFeats(IFeatureClass pFeatCls, DataTable dt)
        {
            IWorkspaceEdit pWorkEdit = GetWorkspaceEdit(pFeatCls);
            IFeatureCursor targetFeatCursor = pFeatCls.Insert(true);
            IFeatureBuffer pFeatBuff = pFeatCls.CreateFeatureBuffer();
            IFeatureClassWrite fr = (IFeatureClassWrite)pFeatCls;
            IFeature pFeat;
            pWorkEdit.StartEditing(true);//开启编辑状态
            pWorkEdit.StartEditOperation();//开启编辑操作
            foreach (DataRow dr in dt.Rows)
            {
                pFeat = pFeatCls.CreateFeature();
                foreach (DataColumn dc in dt.Columns)
                {
                    pFeat.set_Value(pFeat.Fields.FindFieldByAliasName(dc.ColumnName), dr[dc.ColumnName]);
                    pFeat.Store();
                    fr.WriteFeature(pFeat);
                }
            }
            pWorkEdit.StopEditOperation();//停止编辑操作
            pWorkEdit.StopEditing(true);//关闭编辑状态,并保存修改
            return pFeatCls;
        }
//子方法,设置mxd文件里的数据源,并绑定到地图上
public static void SetMxdSource(IFeatureClass pfeatcls,string str_layername)
        {
            IMapDocument pMapDocument = new MapDocumentClass(); 
            BusinessBase bb = new BusinessBase();
            pMapDocument.Open(bb.Str_GisMxdFile); //打开本地的abc地图文档,用来操作改mxd文件
            IMap pMap = pMapDocument.get_Map(0);  
            IMapLayers pMapLayer = pMap as IMapLayers;
            IFeatureLayer pfeatlayer = new FeatureLayerClass();
            pfeatlayer.FeatureClass = pfeatcls;
            pfeatlayer.Name = str_layername;
            pMapLayer.AddLayer(LayerRender1(pfeatlayer) as ILayer);
            pMapDocument.Save(true, true);
            pMapDocument.Close();
        }
//地图上没显示要素信息
1.png

//Mxd文档里属性信息表有数据,就是在地图上显示不出来,参考系都没问题
2.png

 
已邀请:

朱新颖

赞同来自: why小飞

public IFeatureClass InsertFeats(IFeatureClass pFeatCls, DataTable dt)
        {
            IWorkspaceEdit pWorkEdit = GetWorkspaceEdit(pFeatCls);
            IFeatureCursor targetFeatCursor = pFeatCls.Insert(true);
            IFeatureBuffer pFeatBuff = pFeatCls.CreateFeatureBuffer();
            IFeatureClassWrite fr = (IFeatureClassWrite)pFeatCls;
            IFeature pFeat;
            pWorkEdit.StartEditing(true);//开启编辑状态
            pWorkEdit.StartEditOperation();//开启编辑操作
            foreach (DataRow dr in dt.Rows)
            {
                pFeat = pFeatCls.CreateFeature();
                foreach (DataColumn dc in dt.Columns)
                {
                    pFeat.set_Value(pFeat.Fields.FindFieldByAliasName(dc.ColumnName), dr[dc.ColumnName]);
                    pFeat.Store();
                    fr.WriteFeature(pFeat);
                }
            }
            pWorkEdit.StopEditOperation();//停止编辑操作
            pWorkEdit.StopEditing(true);//关闭编辑状态,并保存修改
            return pFeatCls;
        }
这个函数中貌似没有给要素赋Geomery啊,那怎么显示啊?建议检查下代码。

要回复问题请先登录注册