/// <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 int GetMaxEntityID() { try { int nMaxEntityID = -1;///记录最大标识码 IEnumDataset pEnumDataset = m_pIDataset.Subsets; IDataset pSet = pEnumDataset.Next(); int nEntityID = -1; ///遍历数据集获取各个表中的标识码 while (pSet != null) { ITable pTable = pSet as ITable; ///从配置表中获取标识码字段 string sEntityFiled = ""; Metadata.MetaTable pMetaTable = Metadata.MetaDataFile.GetMetaTalbleByName(pSet.Name) as Metadata.MetaTable; if (pMetaTable != null) { sEntityFiled = pMetaTable.EntityIDFiledName; ////仅读取当前标准下的数据 ICursor pCursor = pTable.Search(null, true); IRow pRow = pCursor.NextRow(); while (pRow != null) { ///获取表中的最大标识码 int nIndex = pRow.Fields.FindField(sEntityFiled); if (nIndex != -1) { //if (!VCTFile.ConvertToInt32(pRow.get_Value(nIndex).ToString(), out nEntityID)) { nEntityID = pRow.get_Value(nIndex) == null || pRow.get_Value(nIndex).ToString() == "" ? -1 : Convert.ToInt32(pRow.get_Value(nIndex)); } if (nEntityID > nMaxEntityID) nMaxEntityID = nEntityID; } pRow = pCursor.NextRow(); } } pSet = pEnumDataset.Next(); } return nMaxEntityID; } catch(Exception ex) { LogAPI.WriteErrorLog(ex); return -1; } }
/// <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; } }
/// <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> /// 从mdb到vct转换时,初始化图层列表 /// </summary> private bool InitialFeatureList() { try { if (m_pIDataset == null) return false; m_FeatureList = new List<TableLayer>(); IEnumDataset pEnumDataset = m_pIDataset.Subsets; IDataset pSet = pEnumDataset.Next(); while (pSet != null) { FeatureLayer pFeatureLayer = null; IFeatureClass pFeatureCls = pSet as IFeatureClass; string sGeometryType = ""; ///从配置文件获取要素类型 Metadata.MetaTable pMetaTable = Metadata.MetaDataFile.MetaTabls[pSet.Name] as Metadata.MetaTable; if (pMetaTable != null) { sGeometryType = pMetaTable.Type; } else { ///如果不属于标准的数据则不处理 pSet = pEnumDataset.Next(); continue; } ///根据要素类型创建vct空间数据节点 esriGeometryType pFeatureType = pFeatureCls.ShapeType; if (pFeatureType == esriGeometryType.esriGeometryLine || pFeatureType == esriGeometryType.esriGeometryPolyline) { ///构造线节点 pFeatureLayer = new LineLayer(); if (sGeometryType == "") sGeometryType = "Line"; } else if (pFeatureType == esriGeometryType.esriGeometryPolygon) { //构造面节点 pFeatureLayer = new PolygonLayer(); if (sGeometryType == "") sGeometryType = "Polygon"; } else if (pFeatureType == esriGeometryType.esriGeometryPoint) { pFeatureLayer = new PointLayer(); if (sGeometryType == "") sGeometryType = "Point"; } ////注记图层 if (pFeatureCls.FeatureType == esriFeatureType.esriFTAnnotation) { pFeatureLayer = new AnnotationLayer(); pFeatureLayer.GeometryType = "Annotation"; } pFeatureLayer.CutGeometry =m_cutGeometry; //挂接空间数据表 pFeatureLayer.Table = pSet as ITable; pFeatureLayer.GeometryType = sGeometryType; pFeatureLayer.IsCut = m_bCut; pFeatureLayer.FeatureCode = MetaDataFile.GetFeatureCodeByName(pSet.Name); pFeatureLayer.UpdateFieldIndex(); m_FeatureList.Add(pFeatureLayer); pSet = pEnumDataset.Next(); } ///处理属性表集合 IEnumDataset pAttriTalbelDataSet= m_pIWorkspace.get_Datasets(esriDatasetType.esriDTTable); IDataset pAttriDataset = pAttriTalbelDataSet.Next(); while (pAttriDataset != null) { TableLayer pAttributeTalbe = new TableLayer(); ///从配置文件获取要素类型 Metadata.MetaTable pMetaTable = Metadata.MetaDataFile.MetaTabls[pAttriDataset.Name] as Metadata.MetaTable; if (pMetaTable != null) { pAttributeTalbe.GeometryType = pMetaTable.Type; pAttributeTalbe.Table = pAttriDataset as ITable; pAttributeTalbe.UpdateFieldIndex(); m_FeatureList.Add(pAttributeTalbe); } pAttriDataset = pAttriTalbelDataSet.Next(); } return true; } catch (Exception ex) { LogAPI.WriteErrorLog(ex); return false; } }