Esempio n. 1
0
        /// <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();
            }
        }
Esempio n. 2
0
        /*
        /// <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;
        }
Esempio n. 3
0
 /// <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;
 }
Esempio n. 4
0
        /// <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;
            }
        }
Esempio n. 5
0
        /// <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;
        }
Esempio n. 6
0
        /// <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;
            }
        }
Esempio n. 7
0
        /// <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;
        }
Esempio n. 8
0
/*
        /// <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;
            }
        }