您的位置:首页 > 编程语言 > C#

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

2016-08-09 14:37 501 查看
用上一篇里面 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文件还在学习中........
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息