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();
}
//地图上没显示要素信息
//Mxd文档里属性信息表有数据,就是在地图上显示不出来,参考系都没问题
{
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();
}
//地图上没显示要素信息
//Mxd文档里属性信息表有数据,就是在地图上显示不出来,参考系都没问题
1 个回复
朱新颖
赞同来自: why小飞
{
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啊,那怎么显示啊?建议检查下代码。
要回复问题请先登录或注册