用上一篇里面 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文件还在学习中........