/// <summary> /// 创建空间图层 /// </summary> /// <param name="tableStructureNode">VCT表结构节点</param> /// <param name="featureCodeNode">VCT要素编码节点</param> private FeatureLayer CreateFeatureLayer(TableStructureNode tableStructureNode, FeatureCodeNode featureCodeNode) { try { FeatureLayer featureLayer = null; ///获取要素集 IFeatureDataset featureDataset = m_pIDataset as IFeatureDataset; //从配置文件读取图形类型 string sGeometryType = ""; Metadata.MetaTable pMetaTalbe = Metadata.MetaDataFile.MetaTabls[tableStructureNode.TableName] as Metadata.MetaTable; if (pMetaTalbe != null) { sGeometryType = Metadata.MetaDataFile.GraphConfig.GetGraphTypeMark(pMetaTalbe.Type); } else { Logger.WriteLog("未能获取【" + tableStructureNode.TableName + "】的图形类型!"); return null; } ///创建点实体 if (sGeometryType == "Point") { featureLayer = new PointLayer(); } ///创建线实体 else if (sGeometryType == "Line") { featureLayer = new LineLayer(); } ///创建面实体 else if (sGeometryType == "Polygon") { featureLayer = new PolygonLayer(); } else if (sGeometryType == "Annotation") { featureLayer = new AnnotationLayer(); } if (featureLayer != null) { featureLayer.StructureNode = tableStructureNode; IFeatureClass pFcls = CreateFeatureClass(featureDataset, tableStructureNode, featureCodeNode); featureLayer.Table = pFcls as ITable; featureLayer.UpdateFieldIndex(); return featureLayer; } } catch(Exception ex) { Logger.WriteErrorLog(ex); } return null; }
/// <summary> /// 创建所有空间图层 /// </summary> /// <param name="tableStructureNodes">VCT表结构节点集合</param> /// <param name="featureCodeNodes">VCT要素编码节点集合</param> public List<TableLayer> CreateFeatureLayers(List<TableStructureNode> tableStructureNodes, Hashtable featureCodeNodes) { try { if (tableStructureNodes == null || featureCodeNodes == null) return null; List<TableLayer> arrFeatureLayer = new List<TableLayer>(); IFeatureDataset featureDataset = this.m_pIDataset as IFeatureDataset; ///读取第一个数据集进行处理 if (featureDataset != null) { ////遍历表结构节点进行空间数据表创建 foreach (TableStructureNode tableStructureNode in tableStructureNodes) { FeatureCodeNode featureCodeNode = featureCodeNodes[tableStructureNode.TableName] as FeatureCodeNode; //从配置文件读取图形类型 string sGeometryType = ""; Metadata.MetaTable pMetaTalbe = Metadata.MetaDataFile.MetaTabls[tableStructureNode.TableName] as Metadata.MetaTable; ///如果当前标准不包含表则不创建 if (pMetaTalbe != null) { sGeometryType = Metadata.MetaDataFile.GraphConfig.GetGraphTypeMark(pMetaTalbe.Type); if (sGeometryType == "NoneGeometry") { ///创建属性数据表 TableLayer pTalbeLayer = CreateTableLayer(m_pWorkspace as IFeatureWorkspace, tableStructureNode, featureCodeNode); if (pTalbeLayer != null) arrFeatureLayer.Add(pTalbeLayer); } else { ///创建空间数据表 FeatureLayer featureLayer = CreateFeatureLayer(tableStructureNode, featureCodeNode); if (featureLayer != null) arrFeatureLayer.Add(featureLayer); } } } return arrFeatureLayer; } return null; } catch(Exception ex) { Logger.WriteErrorLog(ex); return null; } }
/// <summary> /// 获取要素代码节点 /// </summary> /// <returns></returns> public virtual FeatureCodeNode GetFeatureCodeNode() { try { FeatureCodeNode pFeatureCodeNode = new FeatureCodeNode(); ///如果是空间数据 if (m_pITable is IFeatureClass) { ///要素名称 pFeatureCodeNode.FeatureName = (m_pITable as IObjectClass).AliasName; //要素代码 string sAttriTableName = (m_pITable as IDataset).Name; pFeatureCodeNode.FeatureCode = MetaDataFile.GetFeatureCodeByName(sAttriTableName); ///获取要素类型 if ((m_pITable as IFeatureClass).FeatureType != esriFeatureType.esriFTAnnotation) { switch ((m_pITable as IFeatureClass).ShapeType) { case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryLine: case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline: pFeatureCodeNode.GeometryType = Metadata.MetaDataFile.GraphConfig.GetGraphTypeMark("Line"); break; case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryMultipoint: case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint: pFeatureCodeNode.GeometryType = Metadata.MetaDataFile.GraphConfig.GetGraphTypeMark("Point"); break; case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon: pFeatureCodeNode.GeometryType = Metadata.MetaDataFile.GraphConfig.GetGraphTypeMark("Polygon"); break; case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryNull: pFeatureCodeNode.GeometryType = Metadata.MetaDataFile.GraphConfig.GetGraphTypeMark("NoneGeometry"); break; default: break; } } else { pFeatureCodeNode.GeometryType = Metadata.MetaDataFile.GraphConfig.GetGraphTypeMark("Annotation"); } ///数据表名称 pFeatureCodeNode.TableName = sAttriTableName; ///获取标识码字段 string sKeyFieldName = ""; sKeyFieldName = Metadata.MetaDataFile.GetEntityIDFieldName(sAttriTableName); if (sKeyFieldName != "") { m_strEntityFieldName = sKeyFieldName; } ////获取要素代码字段 sKeyFieldName = Metadata.MetaDataFile.GetYSDMFieldName(sAttriTableName); if (sKeyFieldName != "") { m_strSYDMFieldName = sKeyFieldName; } } ///如果是属性数据 else if (m_pITable != null) { pFeatureCodeNode.FeatureName = (m_pITable as IObjectClass).AliasName; string sAttriTableName = (m_pITable as IDataset).Name; pFeatureCodeNode.FeatureCode = MetaDataFile.GetFeatureCodeByName(sAttriTableName); ///数据表名称 pFeatureCodeNode.TableName = sAttriTableName; pFeatureCodeNode.GeometryType = Metadata.MetaDataFile.GraphConfig.GetGraphTypeMark("NoneGeometry"); } return(pFeatureCodeNode); } catch (Exception ex) { LogAPI.WriteErrorLog(ex); return(null); } }
/// <summary> /// 创建字段集合 /// </summary> /// <param name="ocDescription">要素类描述</param> /// <param name="tableStructureNode">表结构节点</param> /// <returns></returns> private IFields CreateFileds(TableStructureNode tableStructureNode, FeatureCodeNode featureCodeNode) { try { ///创建字段集合 IFeatureClassDescription fcDescription = new FeatureClassDescriptionClass(); IObjectClassDescription ocDescription = new ObjectClassDescriptionClass(); IFields fields = ocDescription.RequiredFields; //从配置文件读取图形类型 string sGeometryType = ""; Metadata.MetaTable pMetaTalbe = Metadata.MetaDataFile.MetaTabls[tableStructureNode.TableName] as Metadata.MetaTable; if (pMetaTalbe != null) { sGeometryType = Metadata.MetaDataFile.GraphConfig.GetGraphTypeMark(pMetaTalbe.Type); } //设置图形类型 if (sGeometryType != "NoneGeometry") { ocDescription = (IObjectClassDescription)fcDescription; fields = ocDescription.RequiredFields; int shapeFieldIndex = fields.FindField(fcDescription.ShapeFieldName); IField pGeometryfield = fields.get_Field(shapeFieldIndex); IGeometryDef geometryDef = pGeometryfield.GeometryDef; IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef; if (sGeometryType == "Point") geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint; else if (sGeometryType == "Line") geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolyline; else if (sGeometryType == "Polygon") geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon; } IFieldsEdit fieldsEdit = fields as IFieldsEdit; // 遍历表结构数据 int FieldCount = tableStructureNode.FieldNodes.Count; for (int i = 0; i < FieldCount; i++) { IField field = new FieldClass(); IFieldEdit fieldEdit = (IFieldEdit)field; ///获取字段信息 FieldNode pFieldNode = tableStructureNode.FieldNodes[i]; if (pFieldNode != null) { ///设置字段值 fieldEdit.Name_2 = pFieldNode.FieldName; //从配置中获取别名 if (pMetaTalbe != null) fieldEdit.AliasName_2 = pMetaTalbe.GetFiledALisNameByCode(pFieldNode.FieldName); esriFieldType type = esriFieldType.esriFieldTypeString; switch (pFieldNode.FieldType) { case "Char": type = esriFieldType.esriFieldTypeString; break; case "Int": type = esriFieldType.esriFieldTypeInteger; break; case "Float": type = esriFieldType.esriFieldTypeDouble; break; case "Time": type = esriFieldType.esriFieldTypeDate; break; case "DateTime": type = esriFieldType.esriFieldTypeDate; break; case "Varchar": type = esriFieldType.esriFieldTypeString; break; case "Varbin": type = esriFieldType.esriFieldTypeString; break; default: break; } fieldEdit.Type_2 = type; fieldEdit.Length_2 = pFieldNode.FieldLength; fieldEdit.Precision_2 = pFieldNode.FieldPrecision; fieldsEdit.AddField(field); } } return fields; } catch(Exception ex) { Logger.WriteErrorLog(ex); return null; } }
/// <summary> /// 创建属性表 /// </summary> /// <param name="pFeatureWorkspace"></param> /// <param name="tableStructureNode"></param> /// <param name="featureCodeNode"></param> /// <returns></returns> private TableLayer CreateTableLayer(IFeatureWorkspace pFeatureWorkspace, TableStructureNode tableStructureNode, FeatureCodeNode featureCodeNode) { try { if (pFeatureWorkspace != null&&tableStructureNode!=null&&featureCodeNode!=null) { IObjectClassDescription ocDescription = new ObjectClassDescriptionClass(); ///创建数据表字段 IFieldChecker fieldChecker = new FieldCheckerClass(); IFields validatedFields = CreateFileds(tableStructureNode, featureCodeNode); ///字段信息验证 IFields fixFields = null; fieldChecker.ValidateWorkspace = pFeatureWorkspace as IWorkspace; IEnumFieldError enumFieldError = null; fieldChecker.Validate(validatedFields, out enumFieldError, out fixFields); ITable pTable = pFeatureWorkspace.CreateTable(tableStructureNode.TableName, fixFields, ocDescription.InstanceCLSID, null, ""); if (pTable != null) { TableLayer pTableLayer = new TableLayer(); //从配置文件读取图形类型 string sGeometryType = ""; Metadata.MetaTable pMetaTalbe = Metadata.MetaDataFile.MetaTabls[tableStructureNode.TableName] as Metadata.MetaTable; if (pMetaTalbe != null) { sGeometryType = pMetaTalbe.Type; } else return null; pTableLayer.GeometryType = sGeometryType; pTableLayer.Table = pTable; pTableLayer.UpdateFieldIndex(); return pTableLayer; } return null; } return null; } catch (Exception ex) { Logger.WriteErrorLog(ex); return null; } }
private IFeatureClass CreateFeatureClass(IFeatureDataset featureDataset,TableStructureNode tableStructureNode, FeatureCodeNode featureCodeNode) { try { if (featureDataset != null) { IFeatureClassDescription fcDesc = new FeatureClassDescriptionClass(); IObjectClassDescription ocDesc = (IObjectClassDescription)fcDesc; ///创建数据表字段 IFieldChecker fieldChecker = new FieldCheckerClass(); IEnumFieldError enumFieldError = null; IFields validatedFields = CreateFileds(tableStructureNode, featureCodeNode); ///字段信息验证 IFields fixFields = null; fieldChecker.ValidateWorkspace = featureDataset.Workspace; fieldChecker.Validate(validatedFields, out enumFieldError, out fixFields); ////创建FeatureClass IFeatureClass featureClass = null; if (tableStructureNode.IsGeometryTable) { ////创建非注记FeatureClass if (featureCodeNode.GeometryType != "") { featureClass = featureDataset.CreateFeatureClass(featureCodeNode.TableName, fixFields, ocDesc.InstanceCLSID, ocDesc.ClassExtensionCLSID, esriFeatureType.esriFTSimple, fcDesc.ShapeFieldName, ""); } else { ///创建注记 IFormattedTextSymbol pTxtSymbo=new TextSymbolClass(); IFeatureWorkspaceAnno pFeatureWorkspaceAnno = this.m_pIDataset.Workspace as IFeatureWorkspaceAnno; IGraphicsLayerScale pGraphSacle = new GraphicsLayerScaleClass(); pGraphSacle.Units = ESRI.ArcGIS.esriSystem.esriUnits.esriFeet; //pGraphSacle.ReferenceScale=1000; ISymbolCollection pSymbolCollection = new SymbolCollectionClass(); IAnnotateLayerProperties pAnnoLayerProp = new LabelEngineLayerPropertiesClass(); pAnnoLayerProp.FeatureLinked = true; pAnnoLayerProp.CreateUnplacedElements = false; pAnnoLayerProp.DisplayAnnotation = true; pAnnoLayerProp.UseOutput = true; IAnnotationExpressionEngine pAnnoExpressionEngine =new AnnotationVBScriptEngineClass(); ILabelEngineLayerProperties pLabelEngineLayerProperties = pAnnoLayerProp as ILabelEngineLayerProperties; pLabelEngineLayerProperties.ExpressionParser = pAnnoExpressionEngine; pLabelEngineLayerProperties.Expression = "[DESCRIPTION]"; pLabelEngineLayerProperties.IsExpressionSimple = true; pLabelEngineLayerProperties.Offset = 0; pLabelEngineLayerProperties.SymbolID = 0; pLabelEngineLayerProperties.Symbol = pTxtSymbo; IAnnotateLayerTransformationProperties pAnnoLayerTransProp = pAnnoLayerProp as IAnnotateLayerTransformationProperties; pAnnoLayerTransProp.ReferenceScale=200; pAnnoLayerTransProp.Units= ESRI.ArcGIS.esriSystem.esriUnits.esriFeet; pAnnoLayerTransProp.ScaleRatio=1; IAnnotateLayerPropertiesCollection pAnnoLayerProptyCollection =new AnnotateLayerPropertiesCollectionClass(); pAnnoLayerProptyCollection.Add(pAnnoLayerProp); featureClass= pFeatureWorkspaceAnno.CreateAnnotationClass(featureCodeNode.TableName,fixFields,ocDesc.InstanceCLSID ,ocDesc.ClassExtensionCLSID,fcDesc.ShapeFieldName,"",featureDataset,null, pAnnoLayerProptyCollection, pGraphSacle, pSymbolCollection,true); } } else { ///创建非空间数据 } return featureClass; } return null; } catch(Exception ex) { Logger.WriteErrorLog(ex); return null; } }