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檔案還在學習中........