/// <summary> /// 执行转换 /// </summary> /// <param name="bIgnoreHeadError">是否忽略头文件的错误</param> /// <returns></returns> public EnumVCT2MDBExchangeInfo Exchange(bool bAllowDefaultProjection) { ///指示当前是否在读取VCT实体 bool bIsReadEntity = false; ///指示当前是否在读取VCT属性 bool bIsReadAtti = false; try { //读取头节点 FileData.HeadNode headNode = m_VCTFile.ReadHeadNode(); if (headNode != null) { //创建数据集 ESRIData.Dataset dataset = m_MDBFile.CreateDataset(headNode, m_strDataSetName); ///数据集的空间参考创建失败 if (dataset.ESRIDataset==null) { return EnumVCT2MDBExchangeInfo.DATASETERROR; } IGeoDataset pDataset = dataset.ESRIDataset as IGeoDataset; if (pDataset!=null&& pDataset.SpatialReference is UnknownCoordinateSystemClass && !bAllowDefaultProjection) { return EnumVCT2MDBExchangeInfo.PROJECTIONERROR; } if (dataset != null) { //读取要素参数节点和表结构节点 Hashtable arrFeatureCodeNode = m_VCTFile.ReadFeatureCodeNodes(); ///读取要素代码错误 if (arrFeatureCodeNode == null) { return EnumVCT2MDBExchangeInfo.FEATURECODEERROR; } List<FileData.TableStructureNode> arrTableStructureNode = m_VCTFile.ReadTableStructureNodes(); ///读取要素代码错误 if (arrTableStructureNode == null) { return EnumVCT2MDBExchangeInfo.FEATUREATRRIBUTE; } if (arrFeatureCodeNode != null && arrTableStructureNode != null) { //创建图层 //ESRIData.FeatureLayerFactory featureLayerFactory = new ESRIData.FeatureLayerFactory(dataset.Workspace); //featureLayerFactory.CreateFeatureLayers(arrTableStructureNode, arrFeatureCodeNode); //dataset.LayerFactory = featureLayerFactory; dataset.CreateFeatureLayers(arrTableStructureNode, arrFeatureCodeNode); //读取空间实体节点 string strFeatureCode = "";//上一个实体所属图层的要素代码 ESRIData.FeatureLayer featureLayer = null; ESRIData.TableLayer tableLayer = null; FileData.EntityNode entityNode; bIsReadEntity = true;///开始读取实体 while ((entityNode = m_VCTFile.ReadEntityNode()) != null) { //获取实体所属图层 if (strFeatureCode != entityNode.FeatureCode) tableLayer = dataset.GetFeatureLayerByCode(entityNode.FeatureCode); //创建空间实体对象 featureLayer = tableLayer as FeatureLayer; if (featureLayer != null) { featureLayer.CreateFeatureEntity(entityNode); } strFeatureCode = entityNode.FeatureCode; } //读取属性节点 FileData.TableNode tableNode = null; bIsReadAtti = true;///开始读取VCT属性 while ((tableNode = m_VCTFile.ReadTableNode()) != null) { //获取属性表对象 tableLayer = dataset.GetFeatureLayerByName(tableNode.TableName); featureLayer = tableLayer as FeatureLayer; if (featureLayer != null) { //读取数据表记录 //FileData.RecordNode recordNode = null; //while ((recordNode = m_VCTFile.ReadRecordNode()) != null) //{ // ESRIData.FeatureEntity featureEntity = featureLayer.GetFeatureEntityByID(recordNode.EntityID); // featureEntity.AttachAttribute(recordNode); //} List<FileData.RecordNode> arrRecordNode = m_VCTFile.ReadRecordNodes(); if (arrRecordNode.Count > 0) { arrRecordNode.Sort(); List<ESRIData.FeatureEntity> arrFeatureEntity = featureLayer.GetFeatureEntitys(); if (arrFeatureEntity.Count > 0) { arrFeatureEntity.Sort(); int j = 0; for (int i = 0; i < arrFeatureEntity.Count; i++) { for (; j < arrRecordNode.Count; j++) { if (arrFeatureEntity[i].EntityID == arrRecordNode[j].EntityID) arrFeatureEntity[i].AttachAttribute(arrRecordNode[j], featureLayer.StructureNode); else if (arrFeatureEntity[i].EntityID < arrRecordNode[j].EntityID) { break; } else { //插入 } } } arrFeatureEntity.Clear(); arrFeatureEntity = null; } else { //插入 } arrRecordNode.Clear(); arrRecordNode = null; } } else { ///add by zengping 2011-4-24添加属性记录 if (tableLayer != null) { List<FileData.RecordNode> arrRecordNode = m_VCTFile.ReadRecordNodes(); foreach (FileData.RecordNode Recorditem in arrRecordNode) { tableLayer.InsertAttibuteTableRecord(Recorditem); } arrRecordNode.Clear(); arrRecordNode = null; } else tableNode = null; } } tableLayer = null; arrFeatureCodeNode.Clear(); arrTableStructureNode.Clear(); arrTableStructureNode = null; arrFeatureCodeNode = null; if (bAllowDefaultProjection && dataset.Projection.SpatialReference is UnknownCoordinateSystemClass) return EnumVCT2MDBExchangeInfo.SUCCESSWITHDEFAULTPROJECTION; else return EnumVCT2MDBExchangeInfo.EXCHANGESUCCESS; } dataset.Dispose(); } else { ///获取数据集错误 return EnumVCT2MDBExchangeInfo.DATASETERROR; } headNode = null; } else { return EnumVCT2MDBExchangeInfo.HEADFILEERROR; } return EnumVCT2MDBExchangeInfo.EXCHANGEFAIL; } catch (Exception ex) { LogAPI.WriteErrorLog(ex); ///读取实体过程中出错 if (bIsReadEntity && !bIsReadAtti) return EnumVCT2MDBExchangeInfo.FEATUREENTY; ///读取属性过程中出错 else if (bIsReadEntity && bIsReadAtti) return EnumVCT2MDBExchangeInfo.FEATUREATRRIBUTE; return EnumVCT2MDBExchangeInfo.EXCHANGUNKNOWEERROR; } finally { GC.Collect(); } }
/* /// <summary> /// �ַ���תΪ˫���� /// </summary> public static double ConvertToDouble(string strValue,out bool bSuccess) { try { string strTemp = strValue; strValue = ""; for (int i = 0; i < strTemp.Length; i++) { if ((strTemp[i] >= '0' && strTemp[i] <= '9') || strTemp[i] == '.' || strTemp[i] == '-') { strValue += strTemp[i].ToString(); } } bSuccess = true; return Convert.ToDouble(strValue); } catch (System.Exception e) { bSuccess = false; return 0; } } /// <summary> /// �ַ���תΪ���� /// </summary> public static int ConvertToInt32(string strValue,out bool bSuccess) { try { bSuccess = true; return Convert.ToInt32(ConvertToDouble(strValue)); } catch (System.Exception e) { bSuccess = false; return 0; } } */ /// <summary> /// ��ȡVCTͷ�ڵ� /// </summary> public HeadNode ReadHeadNode() { if (this.m_streamReader != null) { HeadNode headNode = new HeadNode(); string strLine = ""; //��ȡ�������ֻ��� bool bFoundBegin = false; bool bFoundEnd = false; while (bFoundEnd == false) { strLine = this.ReadLine(true); //����ͷ�ڵ�Ŀ�ʼ��ǡ�HeadBegin�� if (bFoundBegin == false) { if (strLine.IndexOf("HeadBegin", System.StringComparison.OrdinalIgnoreCase) > -1) bFoundBegin = true; } else { //����ͷ�ڵ�Ľ�����ǡ�HeadEnd�� if (strLine.IndexOf("HeadEnd", System.StringComparison.OrdinalIgnoreCase) > -1) bFoundEnd = true; else { //������ǣ�����ֵ char cHeadSpilit = Metadata.MetaDataFile.HeadConfig.HeadSpilit.Symbol.ToCharArray()[0]; string[] arrFlag = strLine.Split(cHeadSpilit); if (arrFlag.Length == 2) { if (false == headNode.SetValue(arrFlag[0], arrFlag[1])) break; } } } } return headNode; } return null; }
/// <summary> /// д��VCTͷ�ڵ� /// </summary> /// <param name="headNode">VCTͷ�ڵ�</param> public bool WriteHeadNode(HeadNode headNode) { if (this.m_streamWriter != null) { this.m_streamWriter.WriteLine("HeadBegin"); this.m_streamWriter.WriteLine(headNode); this.m_streamWriter.WriteLine("HeadEnd"); this.m_streamWriter.Flush(); return true; } return false; }
/// <summary> /// �������ݼ� /// </summary> /// <param name="headNode">VCTͷ�ڵ�</param> public Dataset CreateDataset(HeadNode headNode, string strName) { if (headNode == null) return null; try { m_Dataset = new Dataset(m_pIWorkspace); if (m_Dataset.CreateESRIDataset(strName, headNode)) return m_Dataset; return m_Dataset; } catch (Exception ex) { Logger.WriteErrorLog(ex); return null; } }
/// <summary> /// ��ȡVCTͷ�ڵ� /// </summary> public HeadNode GetHeadNode() { m_HeadNode = new HeadNode(); ///ͷ�ļ����ݱ�ʶ���汾�š�����ϵͳ���ͣ�ά�� m_HeadNode.Datamark =Metadata.MetaDataFile.HeadConfig.DataMark.Value; m_HeadNode.Version = Metadata.MetaDataFile.HeadConfig.Version.Defualt;// "1.0"; m_HeadNode.CoordinateSystemType = Metadata.MetaDataFile.HeadConfig.CoordSystemType.Defualt;//"C"; m_HeadNode.Dim =Convert.ToInt32( Metadata.MetaDataFile.HeadConfig.CoordinateDim.Defualt); ///ͶӰ���� m_HeadNode.Projection = Metadata.MetaDataFile.HeadConfig.Projection.Value; ///ͷ�ļ�X��Y���귽�� m_HeadNode.XaxisDirection = Metadata.MetaDataFile.HeadConfig.XAxisDirection.Defualt; m_HeadNode.YAxisDirection = Metadata.MetaDataFile.HeadConfig.YAxisDirection.Defualt; //��ȡͶӰ���� // m_HeadNode.Parametetor = Metadata.MetaDataFile.HeadConfig.ProjectionParator.Value;//ipSpheroid.SemiMajorAxis.ToString("f6") + "," + ipSpheroid.SemiMinorAxis.ToString("f6"); ///�ο�����,�����ᣬ���ʵĵ��� m_HeadNode.Spheroid = Metadata.MetaDataFile.HeadConfig.Spheroid.Value; //pSpatialReference.Name + "," + ipSpheroid.SemiMajorAxis.ToString("f6") + "," + flater.ToString("f6"); //�������� m_HeadNode.PrimeMeridian = Metadata.MetaDataFile.HeadConfig.PrimeMeridian.Value;// ipProjCoordSys.get_CentralMeridian(true).ToString(); ///������ m_HeadNode.Scale = Metadata.MetaDataFile.HeadConfig.Scale.Value; ///���굥λ m_HeadNode.Unit = Metadata.MetaDataFile.HeadConfig.CoordinateUnit.Defualt; ///ƫ���� m_HeadNode.Excursion = Metadata.MetaDataFile.HeadConfig.Excurtion.Value; //if("3_Degree") //��ȡ�ռ�ο����� ISpatialReference pSpatialReference = m_pSpatialReference; ISpheroid ipSpheroid=null; IProjection ipProjection; ///ͶӰ����ϵ if (m_pSpatialReference is IProjectedCoordinateSystem) { //��ȡ�ռ�ο����� IProjectedCoordinateSystem ipProjCoordSys = m_pSpatialReference as IProjectedCoordinateSystem;//ͶӰ�ο���Ϣ ipProjection = ipProjCoordSys.Projection; IGeographicCoordinateSystem ipGeoCoordSys = ipProjCoordSys.GeographicCoordinateSystem; ipSpheroid = ipGeoCoordSys.Datum.Spheroid; //m_HeadNode.Excursion = ipProjCoordSys.FalseEasting.ToString();///����ƫ���� //m_HeadNode.Scale = ipProjCoordSys.ScaleFactor.ToString("6f");//������ ///��ȡ��С�������� double xMin = 10000000, xMax = 10000000, yMin = -10000000, yMax = -10000000; ipProjCoordSys.GetDomain(out xMin, out xMax, out yMin, out yMax); //GetXyDomain(m_pWorkspace, ref xMin, ref yMin, ref xMax, ref yMax); m_HeadNode.MajorMax = new PointInfoNode(xMax, yMax); m_HeadNode.MajorMin = new PointInfoNode(xMin, yMin); m_HeadNode.CoordinateSystemType = "P"; ///ͶӰ����(��ƫ����ƫ��ԭ�㾭�ȡ���һ��γ�ߣ��ڶ���γ�ߡ���λ��) m_HeadNode.Parametetor.EastOffset = ipProjCoordSys.FalseEasting.ToString(); m_HeadNode.Parametetor.NorthOffset = ipProjCoordSys.FalseNorthing.ToString(); m_HeadNode.Parametetor.OriginLongtitude = ipProjCoordSys.get_CentralMeridian(true).ToString(); try { m_HeadNode.Parametetor.FirstStandard = ipProjCoordSys.LatitudeOf1st.ToString(); m_HeadNode.Parametetor.SecondStandard = ipProjCoordSys.LatitudeOf2nd.ToString(); m_HeadNode.Parametetor.Angle = ipProjCoordSys.Azimuth.ToString(); } catch { } //m_HeadNode.Parametetor.Angle = ipProjCoordSys.Azimuth.ToString(); // m_HeadNode.Parametetor.OriginLatitude= ipProjCoordSys. /////����ͶӰ�������жϴ��ţ����� if (ipProjCoordSys.Name.Contains("3_Degree")) { m_HeadNode.Parametetor.With = "3"; } else { m_HeadNode.Parametetor.With = "6"; } ////����Zone�ı�ʾ���ܴ����� if (ipProjCoordSys.Name.Contains("Zone")) { int index = ipProjCoordSys.Name.LastIndexOf("Zone_"); int nTolLen = ipProjCoordSys.Name.Length; string strSubName = ipProjCoordSys.Name.Substring(index+5, nTolLen - index-5); ////�����в�����n���ʾ�д��� if (!strSubName.Contains("N")) m_HeadNode.Parametetor.Num = m_HeadNode.Parametetor.Num; } else { ///�����ڴ��� } } else if (m_pSpatialReference is IGeographicCoordinateSystem) { IGeographicCoordinateSystem ipGeoCoordSys = m_pSpatialReference as IGeographicCoordinateSystem; ipSpheroid = ipGeoCoordSys.Datum.Spheroid; ///��ȡ��С�������� double xMin = 10000000, xMax = 10000000, yMin = -10000000, yMax = -10000000; ipGeoCoordSys.GetDomain(out xMin, out xMax, out yMin, out yMax); //GetXyDomain(m_pWorkspace, ref xMin, ref yMin, ref xMax, ref yMax); m_HeadNode.MajorMax = new PointInfoNode(xMax, yMax); m_HeadNode.MajorMin = new PointInfoNode(xMin, yMin); m_HeadNode.CoordinateSystemType = "D"; //���뾭�� m_HeadNode.Parametetor.OriginLongtitude = ipGeoCoordSys.PrimeMeridian.Longitude.ToString(); } ///�̻߳� ʱ��ο�ϵ m_HeadNode.Vertical = Metadata.MetaDataFile.HeadConfig.Vertical.Value; m_HeadNode.TemporalReferenceSystem = Metadata.MetaDataFile.HeadConfig.TemporalReferenceSystem.Value; ///��ȡ���� string dataTime = DateTime.Now.Year.ToString(); ///�����·ݲ��ֲ�����λ��0 if (DateTime.Now.Month < 10) dataTime = dataTime + "0" + DateTime.Now.Month.ToString(); else dataTime += DateTime.Now.Month.ToString(); ///�������ڲ��ֲ�����λ��0 if (DateTime.Now.Day < 10) dataTime = dataTime + "0" + DateTime.Now.Day.ToString(); else dataTime += DateTime.Now.Day.ToString(); m_HeadNode.Date= dataTime; HeadNode.Separator = Metadata.MetaDataFile.HeadConfig.Sparator.Value.ToCharArray()[0]; return m_HeadNode; }
/// <summary> /// �����ռ�ο� /// </summary> /// <param name="headNode">VCTͷ�ڵ�</param> private ISpatialReference CreateProjection(HeadNode headNode) { try { string sPrjInfo = ""; //����ͶӰ�����еij�����ֵ�����ж���ʲô����ϵͳ������54������80��WGS��84�������ط�����ϵ�� //����54 double dMajorAxis = headNode.MajorMax.Y; //��ȡ�ο���������� �����ƣ������ᣬ���ʵĵ����� string sProjection = headNode.Spheroid.Split(',')[0]; dMajorAxis = Math.Abs(dMajorAxis - 6378245); //if (fabs( m_dSemiMajorAxis - 6378245) < 0.0001) if (dMajorAxis < 0.0001) { sPrjInfo = string.Format("PROJCS[\"{0}\",GEOGCS[\"GCS_Beijing_1954\",DATUM[\"D_Beijing_1954\"" + ",SPHEROID[\"{1}\",6378140.0,298.257]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]]," + "PROJECTION[\"Gauss_Kruger\"],PARAMETER[\"False_Easting\",{2}],PARAMETER[\"False_Northing\",0.0]," + "PARAMETER[\"Central_Meridian\",{3}],PARAMETER[\"Scale_Factor\",1.0],PARAMETER[\"Latitude_Of_Origin\",0.0]," + "UNIT[\"Meter\",1.0]]", sProjection, "Gauss-Krueger", headNode.Excursion, headNode.Parametetor.OriginLongtitude); } //����80 else { // sPrjInfo = string.Format("PROJCS["%s\",GEOGCS[\"GCS_Xian_1980\",DATUM[\"D_Xian_1980\",SPHEROID[\"%s\",6378140.0,298.257]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Gauss_Kruger\"],PARAMETER[\"False_Easting\",%s],PARAMETER[\"False_Northing\",0.0],PARAMETER[\"Central_Meridian\",%f],PARAMETER[\"Scale_Factor\",1.0],PARAMETER[\"Latitude_Of_Origin\",0.0],UNIT[\"Meter\",1.0]]", m_strProjection, m_strSpheroid, sPianYi, m_lMeridian); sPrjInfo = string.Format("PROJCS[\"{0}\",GEOGCS[\"GCS_Xian_1980\",DATUM[\"D_Xian_1980\"," + "SPHEROID[\"{1}\",6378140.0,298.257]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]]," + "PROJECTION[\"Gauss_Kruger\"],PARAMETER[\"False_Easting\",{2}],PARAMETER[\"False_Northing\",0.0]," + "PARAMETER[\"Central_Meridian\",{3}],PARAMETER[\"Scale_Factor\",1.0],PARAMETER[\"Latitude_Of_Origin\",0.0]," + "UNIT[\"Meter\",1.0]]", sProjection, "Gauss-Krueger", headNode.Parametetor.EastOffset, headNode.Parametetor.OriginLongtitude); } //��������Ϣд�뵽Prj�ļ� string sPrjFilename = Application.StartupPath + "tempPrj.prj"; FileStream fs = File.Create(sPrjFilename); StreamWriter sw = new StreamWriter(fs); sw.Write(sPrjInfo); sw.Close(); fs.Close(); //����Prj�ļ����ɿռ�ο� ISpatialReferenceFactory ipSpatialFactory = new SpatialReferenceEnvironmentClass(); ISpatialReference pSpatialReference = ipSpatialFactory.CreateESRISpatialReferenceFromPRJFile(sPrjFilename); pSpatialReference.SetDomain(headNode.MajorMin.X,headNode.MajorMax.X,headNode.MajorMin.Y,headNode.MajorMax.Y);// //���þ���,��ֹcutʧ�� //������λС�����ȡ��Ա�֤����ʱҲ����λ ISpatialReferenceTolerance ipSrTolerance = pSpatialReference as ISpatialReferenceTolerance; ipSrTolerance.XYTolerance = 0.000001; ipSrTolerance.MTolerance = 0.001; ipSrTolerance.ZTolerance = 0.001; ISpatialReferenceResolution ipSrResolution = pSpatialReference as ISpatialReferenceResolution; ipSrResolution.MResolution = 0.001; ipSrResolution.set_XYResolution(true, 0.000001); ipSrResolution.set_ZResolution(true, 0.001); //ɾ�����ɵ�Prj�ļ� File.Delete(sPrjFilename); //ISpatialReference pSpatialReference; //ISpatialReferenceFactory pSpatialreferenceFactory; //pSpatialreferenceFactory = new SpatialReferenceEnvironmentClass(); //IGeographicCoordinateSystem pGeographicCoordinateSystem; //pGeographicCoordinateSystem = pSpatialreferenceFactory.CreateGeographicCoordinateSystem((int)esriSRGeoCS3Type.esriSRGeoCS_Xian1980); //pSpatialReference = pGeographicCoordinateSystem as ISpatialReference; //pSpatialReference.SetFalseOriginAndUnits(-180, -90, 1000000);// return pSpatialReference; } catch (Exception ex) { LogAPI.WriteLog("�����ռ�ο�ʧ�ܣ�ϵͳĬ�ϴ����յĿռ�ο���\r\n"); LogAPI.WriteErrorLog(ex); ISpatialReference pSpatialReference = new UnknownCoordinateSystemClass(); pSpatialReference.SetDomain(headNode.MajorMin.X, headNode.MajorMax.X, headNode.MajorMin.Y, headNode.MajorMax.Y);// return pSpatialReference; } }
/// <summary> /// vctתmdb��ʱ��esri���ݼ� /// </summary> /// <param name="pWorkspace"></param> /// <param name="sDatasetName"></param> /// <param name="pHeadnode"></param> /// <returns></returns> public bool CreateESRIDataset(string strDatasetName, HeadNode pHeadnode) { try { ISpatialReference pISpatialReference = CreateProjection(pHeadnode); if (pISpatialReference != null) { IFeatureWorkspace pIFeatureWorkspace = this.m_pIWorkspace as IFeatureWorkspace; this.m_pIDataset = pIFeatureWorkspace.CreateFeatureDataset(strDatasetName, pISpatialReference); return true; } } catch (Exception ex) { LogAPI.WriteErrorLog(ex); } return false; }
/* /// <summary> /// 处理面实体中引用线对象的标识码 /// </summary> /// <param name="arrLineNode">VCT线实体节点集合</param> /// <param name="arrFeatureCode">关联图层要素编码集合</param> /// <param name="arrLineNodeEx">VCT面实体中的线实体节点集合</param> private void MatchPolygonToLine(ref List<FileData.LineNode> arrLineNode, List<string> arrFeatureCode, ref List<FileData.LineNodeEx> arrLineNodeEx) { if (arrFeatureCode != null && arrFeatureCode.Count > 0) { List<FileData.LineNode> arrLinkLineNode = new List<FileData.LineNode>(); for (int i = 0; i < arrLineNode.Count; i++) { if (arrFeatureCode.Contains(arrLineNode[i].FeatureCode)) { arrLinkLineNode.Add(arrLineNode[i]); } } if (arrLinkLineNode.Count > 0) { //排序 arrLinkLineNode.Sort(); arrLineNodeEx.Sort(); //更新构面线的标识码 int j = 0; for (int i = 0; i < arrLinkLineNode.Count; i++) { for (; j < arrLineNodeEx.Count; j++) { //必须是未找到标识码的 if (arrLineNodeEx[j].EntityID == -1) { if (arrLinkLineNode[i] == arrLineNodeEx[j]) { arrLineNodeEx[j].IsFromLine = true; arrLineNodeEx[j].EntityID = arrLinkLineNode[i].EntityID; } else if (arrLinkLineNode[i] > arrLineNodeEx[j]) { } else { break; } } } } //反向 List<FileData.LineNodeEx> arrLineNodeExReverse = new List<FileData.LineNodeEx>(); for (int i = 0; i < arrLineNodeEx.Count; i++) { //必须是未找到标识码的 if (arrLineNodeEx[i].EntityID == -1) { FileData.LineNodeEx lineNodeEx = arrLineNodeEx[i]; lineNodeEx.Reverse(); arrLineNodeExReverse.Add(lineNodeEx); } } arrLineNodeExReverse.Sort();//反向后排序 j = 0; for (int i = 0; i < arrLinkLineNode.Count; i++) { for (; j < arrLineNodeExReverse.Count; j++) { if (arrLinkLineNode[i] == arrLineNodeExReverse[j]) { arrLineNodeExReverse[j].IsFromLine = true; arrLineNodeExReverse[j].EntityID = arrLinkLineNode[i].EntityID; } else if (arrLinkLineNode[i] > arrLineNodeExReverse[j]) { } else { break; } } } arrLineNodeEx.Clear(); for (int i = 0; i < arrLineNodeExReverse.Count; i++) { //必须是未找到标识码的 if (arrLineNodeExReverse[i].EntityID == -1) { arrLineNodeEx.Add(arrLineNodeExReverse[i]); } } } } return arrLineNodeEx; } */ //public FileData.LineNodeEx CloneLineNodeEx(FileData.LineNodeEx lineNodeExSource) //{ // //m_InitiallyLineNode = this; // try // { // MemoryStream stream = new MemoryStream(); // BinaryFormatter formatter = new BinaryFormatter(); // formatter.Serialize(stream, lineNodeExSource); // stream.Position = 0; // FileData.LineNodeEx lineNodeEx = formatter.Deserialize(stream) as FileData.LineNodeEx; // lineNodeEx.InitiallyLineNode = lineNodeExSource; // return lineNodeEx; // } // catch (Exception ex) // { // LogAPI.WriteErrorLog(ex); // } // /* // try // { // FileData.LineNodeEx lineNodeEx = new FileData.LineNodeEx(); // lineNodeEx.IsReverse = lineNodeExSource.IsReverse; // lineNodeEx.PolygonID = lineNodeExSource.PolygonID; // lineNodeEx.LineIndex = lineNodeExSource.LineIndex; // lineNodeEx.IsFromLine = lineNodeExSource.IsFromLine; // lineNodeEx.LineType = lineNodeExSource.LineType; // lineNodeEx.SegmentNodes = new FileData.SegmentNodes(); // for (int i = 0; i < lineNodeExSource.SegmentNodes.Count; i++) // { // lineNodeEx.SegmentNodes.Add(lineNodeExSource.SegmentNodes[i]); // //BrokenLineNode brokenLineNode1 = this.SegmentNodes[i] as BrokenLineNode; // //if (brokenLineNode1 != null) // //{ // // BrokenLineNode brokenLineNode2 = new BrokenLineNode(); // // brokenLineNode2.PointInfoNodes = new PointInfoNodes(); // // for (int j = 0; j < brokenLineNode1.PointInfoNodes.Count; j++) // // { // // PointInfoNode pointInfoNode = new PointInfoNode(); // // pointInfoNode.X = brokenLineNode1.PointInfoNodes[j].X; // // pointInfoNode.Y = brokenLineNode1.PointInfoNodes[j].Y; // // brokenLineNode2.PointInfoNodes.Add(pointInfoNode); // // } // // lineNodeEx.SegmentNodes.Add(brokenLineNode2); // //} // } // lineNodeEx.EntityID = lineNodeExSource.EntityID; // lineNodeEx.FeatureCode = lineNodeExSource.FeatureCode; // lineNodeEx.Representation = lineNodeExSource.Representation; // lineNodeEx.InitiallyLineNode = lineNodeExSource; // return lineNodeEx; // } // catch (Exception ex) // { // LogAPI.WriteErrorLog(ex); // }*/ // return null; //} /* /// <summary> /// 处理面实体中引用线对象的标识码 /// </summary> /// <param name="arrLineNodeExNew">VCT面实体中的线实体节点集合(需要新建)</param> private void MatchPolygonToLine(ref List<FileData.LineNodeEx> arrLineNodeExNew) { List<FileData.LineNodeEx> arrLineNodeNewClone = new List<VCT.FileData.LineNodeEx>(); for (int i = 0; i < arrLineNodeExNew.Count; i++) { //克隆对象,并反向 FileData.LineNodeEx lineNodeEx = CloneLineNodeEx(arrLineNodeExNew[i]);//.Clone() as FileData.LineNodeEx; if (lineNodeEx != null) { lineNodeEx.Reverse(); arrLineNodeNewClone.Add(lineNodeEx); } } arrLineNodeExNew.Sort(); arrLineNodeNewClone.Sort(); int j = 0; for (int i = 0; i < arrLineNodeExNew.Count; i++) { if (arrLineNodeExNew[i].EntityID == -1) { //需要创建要素编码 arrLineNodeExNew[i].EntityID = this.m_nNewEntityID; ////未做合并处理 //m_VCTFile.WritePolygonLineNode(arrLineNodeExNew[i]); } for (; j < arrLineNodeNewClone.Count; j++) { if (arrLineNodeNewClone[j].InitiallyLineNode.EntityID == -1) { if (arrLineNodeExNew[i] == arrLineNodeNewClone[j]) { arrLineNodeNewClone[j].InitiallyLineNode.EntityID = arrLineNodeExNew[i].EntityID; arrLineNodeNewClone[j].InitiallyLineNode.Reverse(); //arrLineNodeNewClone[j].InitiallyLineNode.IsReverse = arrLineNodeNewClone[j].IsReverse; arrLineNodeNewClone[j].InitiallyLineNode.OtherPolygonLineNode = arrLineNodeExNew[i]; arrLineNodeExNew[i].OtherPolygonLineNode = arrLineNodeNewClone[j].InitiallyLineNode; } if (arrLineNodeExNew[i] > arrLineNodeNewClone[j]) { } else { break; } } } } //for (int i = 0; i < arrLineNodeExNew.Count; i++) //{ // if ((arrLineNodeExNew[i].InitiallyLineNode == null && arrLineNodeExNew[i].EntityID == -1) || //非克隆对象 // (arrLineNodeExNew[i].InitiallyLineNode != null && arrLineNodeExNew[i].InitiallyLineNode.EntityID == -1)) //克隆对象 // { // if (i > 0) // { // if (arrLineNodeExNew[i] == arrLineNodeExNew[i - 1]) // { // arrLineNodeExNew[i].EntityID = arrLineNodeExNew[i - 1].EntityID; // if (arrLineNodeExNew[i].InitiallyLineNode != null) // { // //arrLineNodeExNew[i]是克隆对象,需要更新原始对象的标识码和方向标识 // arrLineNodeExNew[i].InitiallyLineNode.EntityID = arrLineNodeExNew[i].EntityID; // arrLineNodeExNew[i].InitiallyLineNode.IsReverse = arrLineNodeExNew[i].IsReverse; // } // continue; // } // } // //需要创建要素编码 // arrLineNodeExNew[i].EntityID = this.NewEntityID; // if (arrLineNodeExNew[i].InitiallyLineNode != null) // { // //arrLineNodeExNew[i]是克隆对象,需要更新原始对象的标识码和方向标识 // arrLineNodeExNew[i].InitiallyLineNode.EntityID = arrLineNodeExNew[i].EntityID; // arrLineNodeExNew[i].InitiallyLineNode.IsReverse = arrLineNodeExNew[i].IsReverse; // } // m_VCTFile.WritePolygonLineNode(arrLineNodeExNew[i]); // } //} } */ ///// <summary> ///// 处理面实体中引用线对象的标识码 ///// </summary> ///// <param name="arrLineNode">VCT线实体节点集合</param> //private void WritePolygonLineNodes(ref List<FileData.LineNodeEx> arrLineNode) //{ // ////按标识码、在面的边界线集合中的索引排序 // FileData.LineNodeExComparer lineNodeExComparer = new FileData.LineNodeExComparer(); // arrLineNode.Sort(lineNodeExComparer); // FileData.LineNodeEx lineNode = null; // for (int i = 0; i < arrLineNode.Count; i++) // { // if (lineNode == null) // { // lineNode = arrLineNode[i]; // } // else // { // if (arrLineNode[i].EntityID == lineNode.EntityID) // { // lineNode.SegmentNodes.AddRange(arrLineNode[i].SegmentNodes); // } // else // { // m_VCTFile.WritePolygonLineNode(lineNode); // lineNode = arrLineNode[i]; // } // if (i == arrLineNode.Count - 1) // { // m_VCTFile.WritePolygonLineNode(lineNode); // } // } // } //} /// <summary> /// 执行转换 /// </summary> public EnumMDB2VCTExchangeInfo Exchange() { ///指示当前转换的执行位置 int nExcutePosition = 0; ///1.表结构 2.点 3.线 4.面 try { //获取PGDB数据集 m_dataset = m_MDBFile.GetDataset(); if (m_dataset != null) { //获取当前数据的最大实体标识码 this.m_nNewEntityID = m_dataset.GetMaxEntityID() + 1; //获取VCT头节点 ESRIData.Projection projection = m_dataset.GetProjection(); if (projection != null) { FileData.HeadNode headNode = projection.GetHeadNode(); ///生成头文件错误 if (headNode == null) { return EnumMDB2VCTExchangeInfo.HEADFILEERROR; } //1、写入VCT头节点 m_VCTFile.WriteHeadNode(headNode); //获取图层集合 ESRIData.TableLayer tableLayer; m_nLayerCount = m_dataset.GetLayerCount(); List<FileData.FeatureCodeNode> arrFeatureCodeNode = new List<FileData.FeatureCodeNode>(); List<FileData.TableStructureNode> arrTableStructureNode = new List<FileData.TableStructureNode>(); nExcutePosition++; for (int i = 0; i < m_nLayerCount; i++) { //获取图层对象 tableLayer = m_dataset.GetFeatureLayerByIndex(i); //获取图层要素参数信息 FileData.FeatureCodeNode featureCodeNode = tableLayer.GetFeatureCodeNode(); arrFeatureCodeNode.Add(featureCodeNode); //获取图层表结构信息 FileData.TableStructureNode tableStructureNode = tableLayer.StructureNode; arrTableStructureNode.Add(tableStructureNode); } //2、写入VCT要素参数节点 m_VCTFile.WriteFeatureCodeNodes(arrFeatureCodeNode); //3、写入VCT表结构节点 m_VCTFile.WriteTableStructureNode(arrTableStructureNode); ///释放不在使用的对象,减少内存使用率 add by 曾平 //m_VCTFile.Flush(); arrFeatureCodeNode.Clear(); arrTableStructureNode.Clear(); nExcutePosition++; //4、写入点实体节点 for (int i = 0; i < m_nLayerCount; i++) { //获取图层对象 tableLayer = m_dataset.GetFeatureLayerByIndex(i); ESRIData.PointLayer pointLayer = tableLayer as ESRIData.PointLayer; if (pointLayer != null) { if (pointLayer.FeatureEntys != null) { for (int j = 0; j < pointLayer.FeatureEntys.Count; j++) { m_VCTFile.WritePointNode(pointLayer.FeatureEntys[j].GetEntityNode() as FileData.PointNode); } } } } nExcutePosition++; ////5、写入线实体节点 //List<FileData.LineNode> arrLineNode = new List<FileData.LineNode>(); for (int i = 0; i < m_nLayerCount; i++) { //获取图层对象 tableLayer = m_dataset.GetFeatureLayerByIndex(i); ESRIData.LineLayer lineLayer = tableLayer as ESRIData.LineLayer; if (lineLayer != null) { if (lineLayer.FeatureEntys != null) { for (int j = 0; j < lineLayer.FeatureEntys.Count; j++) { FileData.LineNode lineNode = lineLayer.FeatureEntys[j].GetEntityNode() as FileData.LineNode; if (lineNode != null) { m_VCTFile.WriteLineNode(lineNode); } } } } } ////处理面实体中引用线对象的标识码 ////List<FileData.PolygonNode> arrPolygonNode = MatchPolygonToLine(dataset, ref arrLineNode); ////6、写入面实体节点 nExcutePosition++; WritePolygonNodes pWritePolygonNodes = new WritePolygonNodes(m_dataset, this.m_pTempFile, this.m_VCTFile, this.m_nNewEntityID); //pWritePolygonNodes.WriteCommplete += new WriteCommpleteEventHandler(WritePolygonNodes_WriteCommplete); pWritePolygonNodes.Write(); WritePolygonNodes_WriteCommplete(true); return EnumMDB2VCTExchangeInfo.EXCHANGESUCCESS; } else { return EnumMDB2VCTExchangeInfo.PROJCTIONERROR; } } else { return EnumMDB2VCTExchangeInfo.DATASETERROR; } } catch(Exception ex) { LogAPI.WriteErrorLog(ex); EnumMDB2VCTExchangeInfo pInfo = EnumMDB2VCTExchangeInfo.EXCHANGUNKNOWEERROR; if (nExcutePosition == 1) pInfo = EnumMDB2VCTExchangeInfo.FEATUREINFOERROR; else if (nExcutePosition == 2) pInfo = EnumMDB2VCTExchangeInfo.POINTERROR; else if (nExcutePosition == 3) pInfo = EnumMDB2VCTExchangeInfo.LINEERROR; else if (nExcutePosition == 4) pInfo = EnumMDB2VCTExchangeInfo.PLOYGONERROR; return pInfo; } }