GPS文件处理

GPS数据导入计算机后,有多种格式,易于处理、易于识别的就是TXT和CSV格式,在本文中我处理的是TXT格式。

建立Shapefile和处理TXT数据都比较简单,后面我就只贴代码(代码里有详细注释),不讲原理了。

主代码:

  public static void CreateShpfromTXT(IMapControl3 map_control,progressFrm  progressfrm)

        {

         

            ProgressBar progressBar1 = progressfrm.progressBar1;

            OpenFileDialog openDia = new OpenFileDialog();

 

            openDia.Title = "打开GPS文件(TXT).......";

            openDia.Filter = "文本文件(*.TXT)|*.txt";

            openDia.RestoreDirectory = true;

            openDia.Multiselect = true;

            if (openDia.ShowDialog() == DialogResult.OK)

            {

                string[] arrayFileName = openDia.FileNames;

                string[] arraySafeName = openDia.SafeFileNames;

                for (int i = arrayFileName.Length-1; i >=0; i--)

                {

                    //根据用户选择的多个TXT文件  依次生成Shp文件

                    string filefullname = arrayFileName[i];

                    string filesafename = arraySafeName[i];

                    string directoryPath = filefullname.Remove(filefullname.LastIndexOf(filesafename), filesafename.Length);

                    string fileName = filesafename.Remove(filesafename.LastIndexOf(".TXT"), 4);

                    string shapeName = fileName + ".shp";

                    foreach (FileInfo file in new DirectoryInfo(directoryPath).GetFiles())

                    {

                        if (file.Name == shapeName)

                        {

                            file.Delete();//如果该Shp文件已经存在,则删除它以及与它相关的文件

                            (new FileInfo(directoryPath + fileName + ".shx")).Delete();

                            (new FileInfo(directoryPath + fileName + ".prj")).Delete();

                            (new FileInfo(directoryPath + fileName + ".dbf")).Delete();

                        }

                    }

                    #region 开始创建Shp

                    IFeatureClass newfeatureclass = CreatNewShapeFile(directoryPath, shapeName);

                    if (newfeatureclass != null)

                    {

                        string[] strs = File.ReadAllLines(filefullname);

                        int hasline = strs.Count();//获取该TXT文件有多少个点

                        progressBar1.Maximum = hasline;

                        progressBar1.Value = 0;

                        progressfrm.TipText ="";

                        progressfrm.TipText = string.Format("正在处理GPS文件:{0},请稍等……", filefullname);

                        progressfrm.Refresh();

                        System.IO.FileStream filestreamTXT = new System.IO.FileStream(filefullname, FileMode.Open);

                     

                        StreamReader streamreader = new StreamReader(filestreamTXT);

                        streamreader.BaseStream.Seek(0, SeekOrigin.Begin);

                        streamreader.ReadLine(); streamreader.ReadLine(); streamreader.ReadLine();

                        while (streamreader.Peek() > 0)

                        {

 

                            string strLine = streamreader.ReadLine() + " ";

                            List<string> filedArray = findWord(strLine);

                            if (filedArray != null)

                            {

                                List<string> filedArrayUnion = GetUnionfieldList(filedArray);

                                IFeature newfeature = newfeatureclass.CreateFeature();

                                IPoint newpoint = new PointClass();

                                newpoint.X = Convert.ToDouble(filedArrayUnion[2]);

                                newpoint.Y = Convert.ToDouble(filedArrayUnion[1]);

                                newpoint.Z = Convert.ToDouble(filedArrayUnion[3]);

                                newfeature.Shape = newpoint as IGeometry;

                

                                newfeature.Store();

                                progressBar1.Value++;

                            }

                        }

                        strs = null;

                     

                    }

 

                    #endregion

       

                    map_control.AddShapeFile(directoryPath, shapeName);

                }

            }

        }

创建一个空的Shapefile:

  public static IFeatureClass CreatNewShapeFile(string directoryPath, string shapeName)

        {

 

            IAoInitialize aoinitialize = new AoInitializeClass();

            aoinitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeEngine);

 

            //步骤:打开工作空间;建立字段集;建立字段;IFeatureWorkspace.CreatFeatureClass

            //关键在于几何字段的IGeometryDefEdit,另外还有esriFieldType.esriFieldTypeGeometry,esriFeatureType.esriFTSimple

 

            const string strShapeFieldName = "shape";

            IWorkspaceFactory pWSF = new ShapefileWorkspaceFactoryClass();

            IFeatureWorkspace pWS = (IFeatureWorkspace)pWSF.OpenFromFile(directoryPath, 0);

            //  directoryPath 父文件夹

 

            //设置字段集 

            IFields pFields = new FieldsClass();

            IFieldsEdit pFieldsEdit = (IFieldsEdit)pFields;

 

            //设置字段 

            IField pFieldgeo = new FieldClass();

            IFieldEdit pFieldEditgeo = (IFieldEdit)pFieldgeo;

 

            //创建类型为几何类型的字段,添加Shape字段,OID是不用添加的

            pFieldEditgeo.Name_2 = "Shape";//Name代表只读,Name_2代表只写

            pFieldEditgeo.Type_2 = esriFieldType.esriFieldTypeGeometry;

 

            //为esriFieldTypeGeometry类型的字段创建几何定义,包括类型和空间参照  

            IGeometryDef pGeoDef = new GeometryDefClass();     //The geometry definition for the field if IsGeometry is TRUE. 

            IGeometryDefEdit pGeoDefEdit = (IGeometryDefEdit)pGeoDef;

            pGeoDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;

            // pGeoDefEdit.SpatialReference_2 = new UnknownCoordinateSystemClass() ;

            // pFieldEditgeo.GeometryDef_2 = pGeoDef;

            ISpatialReferenceFactory3 spatialReferenceFactory = new SpatialReferenceEnvironmentClass();

            ISpatialReference spatialReference = spatialReferenceFactory.CreateSpatialReference((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);

            ISpatialReferenceInfo spatialReferenceInfo = spatialReference as ISpatialReferenceInfo;

            ISpatialReference spatial = spatialReferenceInfo as ISpatialReference;

            pGeoDefEdit.SpatialReference_2 = spatial;

            pFieldEditgeo.GeometryDef_2 = pGeoDef;

            pFieldsEdit.AddField(pFieldgeo);

            //创建shapefile 

            IFeatureClass newfeatureclass = pWS.CreateFeatureClass(shapeName, pFields, null, null, esriFeatureType.esriFTSimple, "Shape", "");

            return newfeatureclass;

 

        }

posted @ 2013-03-25 10:07  GIS_Darren  阅读(387)  评论(0编辑  收藏  举报