日期:2014-05-18 浏览次数:21074 次
//写shp文件
FileStream ShpFileStream = new FileStream(outFilePath + PointFile.m_FileName + ".shp", FileMode.Create, FileAccess.Write);
BinaryWriter BShpW = new BinaryWriter(ShpFileStream, Encoding.Default);
//////////////////////////////////////////////////////////////////////////
//开始写.shp头文件
//////// fileCode 部分 位序 big
int fileCode = 170328064; //fileCode部分的总是为9994 且其位序为big故需要转换位序
BShpW.Write(fileCode);
/////// Unused 部分 位序 big,但其总是为0,故不用再进行换位
int[] Unused = new Int32[5];
for (int i = 0; i < 5; BShpW.Write(Unused[i]), i++) ;
/////// fileLength 部分 位序 big ChangeOnBig是将高低位调转的函数
byte[] fileLength = ChangeOnBig(((44 *PointFile.Points.Count) + 100) / 2);
BShpW.Write(fileLength);
////// versionNumber 部分 位序 little
int versionNumber = 1000;
BShpW.Write(versionNumber);
////// shapeType 部分 位序 little
int shapeType = EssentialType;
BShpW.Write(shapeType); //如果是点Z则是11
BShpW.Write(Xmin);
BShpW.Write(Ymin);
BShpW.Write(Xmax);
BShpW.Write(Ymax);
//写入Zmin
BShpW.Write(PointFile.Hmin);
//写入Zmax
BShpW.Write(PointFile.Hmax);
double Mmin = 0.0;
BShpW.Write(Mmin);
double Mmax = 0.0;
BShpW.Write(Mmax);
///关于一个点的头文件已记录完毕,下面是点的shp实体文件:
byte[] BRecordNumber = new byte[4];
int ID = 0;
for (int i = 0; i < PointCounts; i++, ID++)
{
////// 写入 RecordNumber 部分 位序 big
BRecordNumber = ChangeOnBig(Convert.ToInt32(ID + 1));
BShpW.Write(BRecordNumber);
////// 写入 Content 部分 位序 big
byte[] BContentLength = new byte[4];
BContentLength = ChangeOnBig(18);
BShpW.Write(BContentLength);
//写入要素类型
BShpW.Write(11);
PerPoint thisPoint = PointFile.Points[i];
tx = thisPoint.m_Coor.x; //X坐标
ty = thisPoint.m_Coor.y; //Y坐标
BShpW.Write(tx); BShpW.Write(ty);
double Zcord = Convert.ToDouble(thisPoint.m_Coor.H);
BShpW.Write(Zcord);
//Measure的值在此处对于每个点都是固定的
byte[] Measure = new byte[8] { 255, 255, 255, 255, 255, 255, 239, 255 };
BShpW.Write(Measure);
}
BShpW.Close();
DBFFileWrite(outFilePath, EssentialType); //写dbf文件