C#读取二进制格式的shapefile
2021-03-11 17:30
标签:索引 nts 符号 access ade 最小 version pen cat 1.定义基本图形类 2.读取二进制文件 C#读取二进制格式的shapefile 标签:索引 nts 符号 access ade 最小 version pen cat 原文地址:https://www.cnblogs.com/mercator/p/12631494.htmlnamespace Mercator.Shapefile.IO
{
///
public void ReadSHP(string shapefilename)
{
var polygons = new ArrayList();//面集合
var polylines = new ArrayList();//线集合
var points = new ArrayList();//点集合
var stream = new FileStream(shapefilename, FileMode.Open, FileAccess.Read);
var reader = new BinaryReader(stream);
#region 主文件头包含17个字段,共100个字节,其中包含九个4字节(32位有符号整数,int32)整数字段,紧接着是八个8字节(双精度浮点数)有符号浮点数字段。
// 字节0–3,文件编号 (永远是十六进制数0x0000270a)
var file_no = reader.ReadInt32();
// 字节4–23,五个没有被使用的32位整数
for (int i = 0; i 5; i++)
{
reader.ReadInt32();
}
// 字节24–27,文件长度,包括文件头。(用16位整数表示)
var file_length = reader.ReadInt32();
// 字节28–31,版本
var file_version = reader.ReadInt32();
// 字节32–35,图形类型
var file_shape_type = reader.ReadInt32();
// 字节36–67,最小外接矩形 (MBR),也就是一个包含shapefile之中所有图形的矩形。以四个浮点数表示,分别是X坐标最小值,Y坐标最小值,X坐标最大值,Y坐标最大值。
var x_min = reader.ReadDouble();
var y_max = reader.ReadDouble();
var x_max = reader.ReadDouble();
var y_min = reader.ReadDouble();
// 字节68–83,Z坐标值的范围。以两个浮点数表示,分别是Z坐标的最小值与Z坐标的最大值。
var z_min = reader.ReadDouble();
var z_max = reader.ReadDouble();
// 字节84–99,M坐标值的范围。以两个浮点数表示,分别是M坐标的最小值与M坐标的最大值。
var m_min = reader.ReadDouble();
var m_max = reader.ReadDouble();
#endregion
switch (file_shape_type)
{
case 1: // Point(点)
while (reader.PeekChar() != -1)
{
var point = new Point();
#region 记录头,每个数据记录以一个8字节记录头开始
//字节0–3,记录编号 (从1开始)
var record_no = reader.ReadUInt32();
//字节4–7,记录长度(以16位整数表示)
int record_length = reader.ReadInt32();
#endregion
//读取第i个记录
reader.ReadInt32();
point.X = reader.ReadDouble();
point.Y = -1 * reader.ReadDouble();
points.Add(point);
}
break;
case 3: // Polyline(折线)
while (reader.PeekChar() != -1)
{
var polyline = new Polyline();
#region 记录头,每个数据记录以一个8字节记录头开始
//字节0–3,记录编号 (从1开始)
var record_no = reader.ReadUInt32();
//字节4–7,记录长度(以16位整数表示)
int record_length = reader.ReadInt32();
#endregion
// 字节0–3,图形类型
var shape_type = reader.ReadInt32();
// 字节4-,图形内容,变长记录的内容由图形的类型决定。
for (int i = 0; i 4; i++)
{
polyline.Box[i] = reader.ReadDouble();
}
// 多边形中环的数目
polyline.NumParts = reader.ReadInt32();
// 所有环的点的总数目
polyline.NumPoints = reader.ReadInt32();
for (int i = 0; i )
{
var parts = reader.ReadInt32();
polyline.Parts.Add(parts);
}
for (int i = 0; i )
{
var point = new Point();
point.X = reader.ReadDouble();
point.Y = -1 * reader.ReadDouble();
polyline.Points.Add(point);
}
polylines.Add(polyline);
}
break;
case 5: // Polygon(多边形)
#region 记录
while (reader.PeekChar() != -1)
{
var polygon = new Polygon();
#region 记录头,每个数据记录以一个8字节记录头开始
//字节0–3,记录编号 (从1开始)
var record_no = reader.ReadUInt32();
//字节4–7,记录长度(以16位整数表示)
int record_length = reader.ReadInt32();
#endregion
#region 实际记录
// 字节0–3,图形类型
var shape_type = reader.ReadInt32();
// 字节4-,图形内容,变长记录的内容由图形的类型决定。
for (int i = 0; i 4; i++)
{
polygon.Box[i] = reader.ReadDouble();
}
// 多边形中环的数目
polygon.NumParts = reader.ReadInt32();
// 所有环的点的总数目
polygon.NumPoints = reader.ReadInt32();
for (int i = 0; i )
{
var parts = reader.ReadInt32();
polygon.Parts.Add(parts);
}
for (int i = 0; i )
{
var point = new Point();
point.X = reader.ReadDouble();
point.Y = -1 * reader.ReadDouble();
polygon.Points.Add(point);
}
polygons.Add(polygon);
#endregion
}
#endregion
break;
}
}
文章标题:C#读取二进制格式的shapefile
文章链接:http://soscw.com/index.php/essay/63303.html