C#讀取shapefile文件(不用AE)


1.創建工程文件,選窗體應用程序,命名為:EsriShpReader

 

2.添加SplitContainer控件到窗體

3.在SplitContainer.panel1中添加兩個按鈕Button,text屬性分別改為“打開”,“刷新”

4. 在SplitContainer.panel2中添加panel容器,用來顯示圖像

Dock設置為Fill,背景顏色設置為白色

5.界面圖如下:

 

6.在過程文件中添加類文件,命名為ShpClass

編寫點、線、面、三個類

class Point//點類

    {

     

        public double X;

        public double Y;

    }

    class Polyline//線類

    {

    

        public double[] Box=new double[4];

        public int NumParts;

        public int NumPoints;

        public ArrayList Parts; //在部分中第一個點的索引

        public ArrayList Points; //所有部分的點

    }

    class Polygon : Polyline//面類

    { }

  7.在Form1中添加

ArrayList polygons = new ArrayList();//面集合

        ArrayList polylines = new ArrayList();//線集合

        ArrayList points = new ArrayList();//點集合

        Pen pen = new Pen(Color.Black, 1);//定義畫筆

        int ShapeType;//shp文件類型

        int count;//計數

        double xmin, ymin, xmax, ymax;

        double n1, n2;//x,y軸放大倍數

8.添加button1的Click事件,添加代碼

 

            string shpfilepath = "";

            openFileDialog1.Filter = "shapefiles(*.shp)|*.shp|All files(*.*)|*.*";//打開文件路徑

            if (openFileDialog1.ShowDialog() == DialogResult.OK)

            {

                shpfilepath = openFileDialog1.FileName;

                BinaryReader br = new BinaryReader(openFileDialog1.OpenFile());

                //讀取文件過程

 

                br.ReadBytes(24);

                int FileLength = br.ReadInt32();//<0代表數據長度未知

                int FileBanben = br.ReadInt32();

                ShapeType = br.ReadInt32();

                xmin = br.ReadDouble();

                ymax = -1 * br.ReadDouble();

                xmax = br.ReadDouble();

                ymin = -1 * br.ReadDouble();

                double width = xmax - xmin;

                double height = ymax - ymin;

                n1 = (float)(this.panel1.Width * 0.9 / width);//x軸放大倍數

                n2 = (float)(this.panel1.Height * 0.9 / height);//y軸放大倍數

                br.ReadBytes(32);

 

                switch (ShapeType)

                {

                    case 1:

                        points.Clear();

                        while (br.PeekChar() != -1)

                        {

                            Point point = new Point();

 

                            uint RecordNum = br.ReadUInt32();

                            int DataLength = br.ReadInt32();

 

 

                            //讀取第i個記錄

                            br.ReadInt32();

                            point.X = br.ReadDouble();

                            point.Y = -1 * br.ReadDouble();

                            points.Add(point);

                        }

                        StreamWriter sw = new StreamWriter("point.txt");

 

                        foreach (Point p in points)

                        {

                            sw.WriteLine("{0},{1},{2} ", p.X, -1 * p.Y, 0);

                        }

                        sw.Close();

                        break;

                    case 3:

                        polylines.Clear();

                        while (br.PeekChar() != -1)

                        {

                            Polyline polyline = new Polyline();

                            polyline.Box = new double[4];

                            polyline.Parts = new ArrayList();

                            polyline.Points = new ArrayList();

 

                            uint RecordNum = br.ReadUInt32();

                            int DataLength = br.ReadInt32();

 

                            //讀取第i個記錄

                            br.ReadInt32();

                            polyline.Box[0] = br.ReadDouble();

                            polyline.Box[1] = br.ReadDouble();

                            polyline.Box[2] = br.ReadDouble();

                            polyline.Box[3] = br.ReadDouble();

                            polyline.NumParts = br.ReadInt32();

                            polyline.NumPoints = br.ReadInt32();

                            for (int i = 0; i < polyline.NumParts; i++)

                            {

                                int parts = new int();

                                parts = br.ReadInt32();

                                polyline.Parts.Add(parts);

                            }

                            for (int j = 0; j < polyline.NumPoints; j++)

                            {

 

                                Point pointtemp = new Point();

                                pointtemp.X = br.ReadDouble();

                                pointtemp.Y = -1 * br.ReadDouble();

                                polyline.Points.Add(pointtemp);

                            }

                            polylines.Add(polyline);

                        }

                        StreamWriter sw2 = new StreamWriter("line.txt");

                        count = 1;

                        foreach (Polyline p in polylines)

                        {

 

                            for (int i = 0; i < p.NumParts; i++)

                            {

                                int startpoint;

                                int endpoint;

                                if (i == p.NumParts - 1)

                                {

                                    startpoint = (int)p.Parts[i];

                                    endpoint = p.NumPoints;

                                }

                                else

                                {

                                    startpoint = (int)p.Parts[i];

                                    endpoint = (int)p.Parts[i + 1];

                                }

                                sw2.WriteLine("線" + count.ToString() + ":");

                                for (int k = 0, j = startpoint; j < endpoint; j++, k++)

                                {

                                    Point ps = (Point)p.Points[j];

                                    sw2.WriteLine("    {0},{1},{2} ", ps.X, -1 * ps.Y, 0);

                                }

                                count++;

                            }

                        }

                        sw2.Close();

                        break;

                    case 5:

                        polygons.Clear();

                        while (br.PeekChar() != -1)

                        {

                            Polygon polygon = new Polygon();

                            polygon.Parts = new ArrayList();

                            polygon.Points = new ArrayList();

 

                            uint RecordNum = br.ReadUInt32();

                            int DataLength = br.ReadInt32();

 

                            //讀取第i個記錄

                            int m = br.ReadInt32();

 

                            for (int i = 0; i < 4; i++)

                            {

                                polygon.Box[i] = br.ReadDouble();

                            }

                  

                            polygon.NumParts = br.ReadInt32();

                            polygon.NumPoints = br.ReadInt32();

                            for (int j = 0; j < polygon.NumParts; j++)

                            {

                                int parts = new int();

                                parts = br.ReadInt32();

                                polygon.Parts.Add(parts);

                            }

                            for (int j = 0; j < polygon.NumPoints; j++)

                            {

                                Point pointtemp = new Point();

                                pointtemp.X = br.ReadDouble();

                                pointtemp.Y = -1 * br.ReadDouble();

                                polygon.Points.Add(pointtemp);

                            }

                            polygons.Add(polygon);

                        }

                        StreamWriter sw1 = new StreamWriter("polygon.txt");

                        count = 1;

                        foreach (Polygon p in polygons)

                        {

                            for (int i = 0; i < p.NumParts; i++)

                            {

                                int startpoint;

                                int endpoint;

                                if (i == p.NumParts - 1)

                                {

                                    startpoint = (int)p.Parts[i];

                                    endpoint = p.NumPoints;

                                }

                                else

                                {

                                    startpoint = (int)p.Parts[i];

                                    endpoint= (int)p.Parts[i + 1];

                                }

                                sw1.WriteLine("多邊形" + count.ToString() + ":");

                                for (int k = 0, j = startpoint; j < endpoint; j++, k++)

                                {

                                    Point ps = (Point)p.Points[j];

                                    sw1.WriteLine("    {0},{1},{2} ", ps.X, -1 * ps.Y, 0);

                                }

                                count++;

                            }

                        }

                        sw1.Close();

                        break;

                }

            }

9. 添加button2的Click事件,添加代碼

double width = xmax - xmin;//圖像寬

            double height = ymax - ymin;//圖像高

            n1 = (float)(this.panel1.Width * 0.9 / width);//x軸放大倍數

            n2 = (float)(this.panel1.Height * 0.9 / height);//y軸放大倍數

            this.panel1.Refresh();

10.添加panel1的paint事件

 

        private void panel1_Paint(object sender, PaintEventArgs e)

        {

            PointF[] point;

 

            switch (ShapeType)

            {

                case 1://點類型

                    foreach (Point p in points)

                    {

                        PointF pp = new PointF();

                        pp.X = (float)(10 + (p.X - xmin) * n1);

                        pp.Y = (float)(10 + (p.Y - ymin) * n2);

                        e.Graphics.DrawEllipse(pen, pp.X, pp.Y, 1.5f, 1.5f);

                    }

                    break;

                case 3://線類型

                    foreach (Polyline p in polylines)

                    {

 

                        for (int i = 0; i < p.NumParts; i++)

                        {

                            int startpoint;

                            int endpoint;

                            point = null;

                            if (i == p.NumParts - 1)

                            {

                                startpoint = (int)p.Parts[i];

                                endpoint = p.NumPoints;

                            }

                            else

                            {

                                startpoint = (int)p.Parts[i];

                                endpoint = (int)p.Parts[i + 1];

                            }

                            point = new PointF[endpoint - startpoint];

                            for (int k = 0, j = startpoint; j < endpoint; j++, k++)

                            {

                                Point ps = (Point)p.Points[j];

                                point[k].X = (float)(10 + (ps.X - xmin) * n1);

                                point[k].Y = (float)(10 + (ps.Y - ymin) * n2);

                            }

                            e.Graphics.DrawLines(pen, point);

                        }

                    }

                    break;

                case 5://面類型

                    foreach (Polygon p in polygons)

                    {

                        for (int i = 0; i < p.NumParts; i++)

                        {

                            int startpoint;

                            int endpoint;

                            point = null;

                            if (i == p.NumParts - 1)

                            {

                                startpoint = (int)p.Parts[i];

                                endpoint = p.NumPoints;

                            }

                            else

                            {

                                startpoint = (int)p.Parts[i];

                                endpoint = (int)p.Parts[i + 1];

                            }

                            point = new PointF[endpoint - startpoint];

                            for (int k = 0, j = startpoint; j < endpoint; j++, k++)

                            {

                                Point ps = (Point)p.Points[j];

                                point[k].X = (float)(10 + (ps.X - xmin) * n1);

                                point[k].Y = (float)(10 + (ps.Y - ymin) * n2);

                            }

                            e.Graphics.DrawPolygon(pen, point);

                        }

                    }

                    break;

            }

        }

11.編譯運行


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM