在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例桌面应用界面/GUI → C#操作shapfile

C#操作shapfile

桌面应用界面/GUI

下载此实例
  • 开发语言:C#
  • 实例大小:0.70M
  • 下载次数:21
  • 浏览次数:289
  • 发布时间:2019-08-10
  • 实例类别:桌面应用界面/GUI
  • 发 布 人:pdon
  • 文件格式:.rar
  • 所需积分:11
 相关标签: 操作 C#

实例介绍

【实例简介】读取shapfile文件

【实例截图】

from clipboard

【核心代码】

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace EsriShpReader
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        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轴放大倍数
        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button_open_Click(object sender, EventArgs e)
        {
            string shpfilepath = "";
            OpenFileDialog openFileDialog1 = new OpenFileDialog();
            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;

                }

            }
        }

        private void button_updata_Click(object sender, EventArgs e)
        {
            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();
        }

        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;

            } 
           // 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;

            }
        }
    }
}

标签: 操作 C#

实例下载地址

C#操作shapfile

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警