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文件还在学习中........

猜你喜欢

转载自blog.csdn.net/gis0911178/article/details/52162477
今日推荐