码迷,mamicode.com
首页 > Windows程序 > 详细

C#读取二进制格式的shapefile

时间:2020-04-04 14:57:44      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:索引   nts   符号   access   ade   最小   version   pen   cat   

1.定义基本图形类

namespace Mercator.Shapefile.IO
{
    /// <summary>
    /// 一个点包括一对以X,Y顺序排列的双精度的坐标
    /// </summary>
    public class Point
    {
        /// <summary>
        /// X坐标
        /// </summary>
        public double X;

        /// <summary>
        /// Y坐标
        /// </summary>
        public double Y;
    }

    /// <summary>
    /// 一条PolyLine是指一条包含一个或多个部分的有序的顶点集合。
    /// </summary>
    public class Polyline
    {
        /// <summary>
        /// 边界盒,以Xmin,Ymin,Xmax,Ymax的顺序存储。
        /// </summary>
        public double[] Box { get; set; } = new double[4];

        /// <summary>
        /// Part的数目
        /// </summary>
        public int NumParts;

        /// <summary>
        /// 所有Part的点的总数
        /// </summary>
        public int NumPoints;

        /// <summary>
        /// NumParts长度的数组。
        /// 为每条PolyLine存储它在点数组中的第一个点的索引。
        /// 数组索引是从0开始的。
        /// </summary>
        public ArrayList Parts { get; set; } = new ArrayList();

        /// <summary>
        /// NumPoints长度的数组。
        /// 在PolyLine中的每一Part的点被首尾相连得存储。
        /// Part2的点跟在Part1的点之后,如此下去。
        /// Part数组对每一Part保持开始点的数组索引。 
        /// 在不同Part间的点之间没有分隔符。
        /// </summary>
        public ArrayList Points { get; set; } = new ArrayList(); //所有Part的点
    }

    /// <summary>
    /// 一个多边形包含一个或多个环
    /// </summary>
    public class Polygon : Polyline
    { 
    }
}

2.读取二进制文件

        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 < polyline.NumParts; i++)
                        {
                            var parts = reader.ReadInt32();
                            polyline.Parts.Add(parts);
                        }
                        for (int i = 0; i < polyline.NumPoints; 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 < polygon.NumParts; i++)
                        {
                            var parts = reader.ReadInt32();
                            polygon.Parts.Add(parts);
                        }
                        for (int i = 0; i < polygon.NumPoints; 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

标签:索引   nts   符号   access   ade   最小   version   pen   cat   

原文地址:https://www.cnblogs.com/mercator/p/12631494.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!