1. 程式人生 > >C#不用ArcEngine,生成Shp檔案(三)---------生成.shp格式檔案

C#不用ArcEngine,生成Shp檔案(三)---------生成.shp格式檔案

用上一篇裡面 C#不用ArcEngine,生成Shp檔案(二)  讀取到的.shp檔案資訊,生成一個一樣的.shp檔案。測試資料下載地址為:http://download.csdn.net/detail/gis0911178/9650967

讀取到的資訊如下:

--------------------------------------------------------------------------------

檔案長度:110
Xmin:120.062485706624
Ymin:27.752624080108
Xmax:120.102341678472
Ymax:27.7716597681547
檔案記錄號為:1
座標長度為:56
幾何型別:5
Box[0]:120.062485706624
Box[1]:27.752624080108
Box[2]:120.102341678472
Box[3]:27.7716597681547
子面個數:1
座標點個數:4
每個子環在座標點內的起始位置:
parts[0]:0
Points陣列:
Points[0]:120.062485706624 27.7618444915056
Points[1]:120.102341678472 27.7716597681547
Points[2]:120.081521394671 27.752624080108
Points[3]:120.062485706624 27.7618444915056

------------------------------------------------------------------------------------------------------

按照以上資訊,生成.shp檔案的程式碼(程式碼下載地址http://download.csdn.net/detail/gis0911178/9598945):

string path = @shpFullNameDir;
                if (!File.Exists(path))
                {
                    using (FileStream fs = new FileStream(path, FileMode.Create,FileAccess.Write))
                    {
                        //byte[] data = new UTF8Encoding().GetBytes("abcdefg");
                        //fs.Write(data, 0, data.Length);
                        //寫入FileCode
                        int fileCode = ChangeByteOrder(9994);
                        byte[] fc = System.BitConverter.GetBytes(fileCode);
                        fs.Seek(0,SeekOrigin.Begin);
                        fs.Write(fc,0,fc.Length);
                        //寫入檔案長度
                        int fileLength = ChangeByteOrder(110);
                        byte[] fl = System.BitConverter.GetBytes(fileLength);
                        fs.Seek(24, SeekOrigin.Begin);
                        fs.Write(fl, 0, fl.Length);
                        //寫入版本號
                        int versionNumber = 1000;
                        byte[] vn = System.BitConverter.GetBytes(versionNumber);
                        fs.Seek(28, SeekOrigin.Begin);
                        fs.Write(vn, 0, vn.Length);
                        //寫入檔案型別
                        int fileType = 5;
                        byte[] ft = System.BitConverter.GetBytes(fileType); ;
                        fs.Seek(32, SeekOrigin.Begin);
                        fs.Write(ft, 0, ft.Length);
                        //寫入Extent範圍
                        double xMin = 120.062485706624;
                        byte[] xin = System.BitConverter.GetBytes(xMin);
                        fs.Seek(36, SeekOrigin.Begin);
                        fs.Write(xin, 0, xin.Length);
                        double yMin = 27.752624080108;
                        byte[] yin = System.BitConverter.GetBytes(yMin);
                        fs.Seek(44, SeekOrigin.Begin);
                        fs.Write(yin, 0, yin.Length);
                        double xMax = 120.102341678472;
                        byte[] xax = System.BitConverter.GetBytes(xMax);
                        fs.Seek(52, SeekOrigin.Begin);
                        fs.Write(xax, 0, xax.Length);
                        double yMax = 27.7716597681547;
                        byte[] yax = System.BitConverter.GetBytes(yMax);
                        fs.Seek(60, SeekOrigin.Begin);
                        fs.Write(yax, 0, yax.Length);

                        int currentByte = 100;//從101位開始寫入實體內容
                        //檔案記錄號
                        fs.Seek(currentByte, SeekOrigin.Begin);
                        byte[] fn1 = System.BitConverter.GetBytes(ChangeByteOrder(1));
                        fs.Write(fn1,0,fn1.Length);
                        currentByte += 4;
                        //座標長度
                        fs.Seek(currentByte, SeekOrigin.Begin);
                        byte[] fn1_length = System.BitConverter.GetBytes(ChangeByteOrder(56));
                        fs.Write(fn1_length,0,fn1_length.Length);
                        currentByte += 4;
                        //幾何型別
                        fs.Seek(currentByte, SeekOrigin.Begin);
                        fs.Write(ft, 0, ft.Length);
                        currentByte += 4;
                        //座標範圍
                        fs.Seek(currentByte, SeekOrigin.Begin);
                        double Box1 = 120.062485706624;
                        byte[] b1 = System.BitConverter.GetBytes(Box1);
                        fs.Write(b1, 0, b1.Length);
                        currentByte += 8;

                        fs.Seek(currentByte, SeekOrigin.Begin);
                        double Box2 = 27.752624080108;
                        byte[] b2 = System.BitConverter.GetBytes(Box2);
                        fs.Write(b2, 0, b2.Length);
                        currentByte += 8;

                        fs.Seek(currentByte, SeekOrigin.Begin);
                        double Box3 = 120.102341678472;
                        byte[] b3 = System.BitConverter.GetBytes(Box3);
                        fs.Write(b3, 0, b3.Length);
                        currentByte += 8;

                        fs.Seek(currentByte, SeekOrigin.Begin);
                        double Box4 = 27.7716597681547;
                        byte[] b4 = System.BitConverter.GetBytes(Box4);
                        fs.Write(b4, 0, b4.Length);
                        currentByte += 8;
                        //子面個數
                        fs.Seek(currentByte, SeekOrigin.Begin);
                        byte[] zm = System.BitConverter.GetBytes(1);
                        fs.Write(zm, 0, zm.Length);
                        currentByte += 4;
                        //座標點數
                        fs.Seek(currentByte, SeekOrigin.Begin);
                        byte[] zb = System.BitConverter.GetBytes(4);
                        fs.Write(zb, 0, zb.Length);
                        currentByte += 4;
                        //每個子面在座標陣列內的起始位置
                        fs.Seek(currentByte, SeekOrigin.Begin);
                        byte[] p1 = System.BitConverter.GetBytes(0);
                        fs.Write(p1, 0, p1.Length);
                        currentByte += 4;
                        //寫入座標陣列,本例只有三個點,首尾重合 寫入四個點
                        fs.Seek(currentByte, SeekOrigin.Begin);
                        byte[] zz1 = System.BitConverter.GetBytes(120.062485706624);
                        fs.Write(zz1, 0, zz1.Length);
                        currentByte += 8;

                        fs.Seek(currentByte, SeekOrigin.Begin);
                        byte[] zz2 = System.BitConverter.GetBytes(27.7618444915056);
                        fs.Write(zz2, 0, zz2.Length);
                        currentByte += 8;

                        fs.Seek(currentByte, SeekOrigin.Begin);
                        byte[] zz3 = System.BitConverter.GetBytes(120.102341678472);
                        fs.Write(zz3, 0, zz3.Length);
                        currentByte += 8;

                        fs.Seek(currentByte, SeekOrigin.Begin);
                        byte[] zz4 = System.BitConverter.GetBytes(27.7716597681547);
                        fs.Write(zz4, 0, zz4.Length);
                        currentByte += 8;

                        fs.Seek(currentByte, SeekOrigin.Begin);
                        byte[] zz5 = System.BitConverter.GetBytes(120.081521394671);
                        fs.Write(zz5, 0, zz5.Length);
                        currentByte += 8;

                        fs.Seek(currentByte, SeekOrigin.Begin);
                        byte[] zz6 = System.BitConverter.GetBytes(27.752624080108);
                        fs.Write(zz6, 0, zz6.Length);
                        currentByte += 8;
                        fs.Seek(currentByte, SeekOrigin.Begin);
                        byte[] zz7 = System.BitConverter.GetBytes(120.062485706624);
                        fs.Write(zz7, 0, zz7.Length);
                        currentByte += 8;
                        fs.Seek(currentByte, SeekOrigin.Begin);
                        byte[] zz8 = System.BitConverter.GetBytes(27.7618444915056);
                        fs.Write(zz8, 0, zz8.Length);
                        currentByte += 8;


                        //清空緩衝區、關閉流
                        fs.Flush();
                        fs.Close();
                    }
                }

在寫入的時候,同樣要注意位序轉換,位序轉換函式ChangeByteOrder()在第二篇有。現在只是生成了.shp檔案。         

dbf檔案還在學習中........