日期:2014-05-18  浏览次数:20951 次

怎样将矢量图转换成Shpfile?
一个Shpfile文件由三个文件组成,.shp,.dbf,.shx。
转换成Shpfile时,三部分都要有。
提供代码

------解决方案--------------------
对于Point , PolyLine , Polygon ,PointZ ,PolyLineZ, PolygonZ我比较熟,但是其他类型的就不太清楚了~

PointZ:

C# code

//写shp文件
FileStream ShpFileStream = new FileStream(outFilePath + PointFile.m_FileName + ".shp", FileMode.Create, FileAccess.Write);
                        BinaryWriter BShpW = new BinaryWriter(ShpFileStream, Encoding.Default);

                        //////////////////////////////////////////////////////////////////////////
                        //开始写.shp头文件

                        //////// fileCode 部分 位序 big
                        int fileCode = 170328064; //fileCode部分的总是为9994 且其位序为big故需要转换位序
                        BShpW.Write(fileCode);

                        /////// Unused 部分 位序 big,但其总是为0,故不用再进行换位      
                        int[] Unused = new Int32[5];
                        for (int i = 0; i < 5; BShpW.Write(Unused[i]), i++) ;

                        /////// fileLength 部分 位序 big    ChangeOnBig是将高低位调转的函数             
                        byte[] fileLength = ChangeOnBig(((44 *PointFile.Points.Count) + 100) / 2);
                        BShpW.Write(fileLength);

                        ////// versionNumber  部分 位序 little
                        int versionNumber = 1000;
                        BShpW.Write(versionNumber);

                        ////// shapeType 部分 位序 little
                        int shapeType = EssentialType;
                        BShpW.Write(shapeType);  //如果是点Z则是11
                                                 
                        BShpW.Write(Xmin);
                        BShpW.Write(Ymin);
                        BShpW.Write(Xmax);
                        BShpW.Write(Ymax);
                        
                        //写入Zmin
                        BShpW.Write(PointFile.Hmin);

                        //写入Zmax
                        BShpW.Write(PointFile.Hmax);

                        double Mmin = 0.0;
                        BShpW.Write(Mmin);

                        double Mmax = 0.0;
                        BShpW.Write(Mmax);

                        ///关于一个点的头文件已记录完毕,下面是点的shp实体文件:

                        byte[] BRecordNumber = new byte[4];
                        int ID = 0;
                        for (int i = 0; i < PointCounts; i++, ID++)
                        {
                            ////// 写入 RecordNumber  部分 位序 big                                 
                            BRecordNumber = ChangeOnBig(Convert.ToInt32(ID + 1));
                            BShpW.Write(BRecordNumber);

                            ////// 写入 Content  部分 位序 big 
                            byte[] BContentLength = new byte[4];
                            BContentLength = ChangeOnBig(18);
                            BShpW.Write(BContentLength);
                                            
                            //写入要素类型
                            BShpW.Write(11);

                            PerPoint thisPoint = PointFile.Points[i];

                            tx = thisPoint.m_Coor.x;  //X坐标
                            ty = thisPoint.m_Coor.y;  //Y坐标
                          
                            BShpW.Write(tx); BShpW.Write(ty);                            

                            double Zcord = Convert.ToDouble(thisPoint.m_Coor.H);
                            BShpW.Write(Zcord);
                            
                            //Measure的值在此处对于每个点都是固定的
                            byte[] Measure = new byte[8] { 255, 255, 255, 255, 255, 255, 239, 255 };
                            BShpW.Write(Measure);
                        }
                        BShpW.Close();
                        DBFFileWrite(outFilePath, EssentialType);  //写dbf文件