⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 esrishapefile.cs

📁 开源用于shp文件的读取操作
💻 CS
📖 第 1 页 / 共 2 页
字号:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;


using System.Data.Odbc;  //add by hand,which is needed when load the layer attribute information
using System.Data.OleDb;
using System.Collections;
using System.Data;
using System.Xml;


namespace CGCL.CGFiles
{
    public class CGShapeFileParser
    {
        public class ESRI_ShxHeader
        {
            int FileCode; //9994
            int[] Unused2 = new int[5];
            int FileLength;
            int Version; //1000
            int ShapeType; // 0- Null shape
            // 1- Point
            // 3-Arc
            // 5-Polygon
            // 8-MultiPoint
            double XMin;
            double YMin;
            double XMax;
            double YMax;
            int[] Unused3 = new int[8];
        }

        class ESRI_ShapeFile
        {
            int FileCode; //9994
            int[] Unused = new int[5];
            int FileLength;
            int Version; //1000
            int ShapeType; // 0- Null shape
            // 1- Point
            // 3-Arc
            // 5-Polygon
            // 8-MultiPoint
            double XMin;
            double YMin;
            double XMax;
            double YMax;
            int[] Unused1 = new int[8];
        }


        class ESRI_RecordHeader
        {
            int RecNumber;
            int ContentLength;
        }

        class ESRI_PointContent
        {
            int ShapeType;
            double X;
            double Y;
        }
        class ESRI_IndexRec//索引文件
        {
            int Offset;
            int ContentLen;
        }

        class ESRI_ArcContent
        {
            int ShapeType;
            double xmin;
            double ymin;
            double xmax;
            double ymax;
            int NumParts;
            int NumPoints;
        }

        class ESRI_PolygonContent
        {
            int ShapeType;
            double xmin;
            double ymin;
            double xmax;
            double ymax;
            int NumParts;
            int NumPoints;
        }     
               
        public bool LoadShapeFile(CGDataAdapter.CGLocalGeoDataAdapter adapter)
        {

            string connectionString;
            OdbcConnection connection;
            OdbcDataAdapter OdbcAdapter;


            CGMap.CGGeoLayer geolayer = adapter.getMasterGeoLayer();            

            string shpfilepath = adapter.getPath();
            string shpfilename = adapter.getFileName();
            string shxfilepath = shpfilepath.Substring(0, shpfilepath.LastIndexOf("\\") + 1) + adapter.getFileName() + ".shx";

            //read out the layer attribute infomation
            connectionString = "Dsn=Visual FoxPro Database;sourcedb=" + shpfilepath + ";sourcetype=DBF;exclusive=No;backgroundfetch=Yes;collate=Machine";
            connection = new OdbcConnection(connectionString);
            connection.Open();
            OdbcAdapter = new OdbcDataAdapter("select * from " + shpfilename, connectionString);

            // Create new DataTable and DataSource objects.
            DataSet ds = new DataSet();
            OdbcAdapter.Fill(ds);
            connection.Close();

            if (geolayer == null) return false;

            try
            {
                //先读取.shx文件,得到文件的总字节长度
                FileStream fs = new FileStream(shxfilepath, FileMode.Open, FileAccess.Read);   //文件流形式  
                BinaryReader BinaryFile = new BinaryReader(fs);  //二进制读取文件的对象
                long BytesSum = fs.Length;  //得到文件的字节总长  
                int shapecount = (int)(BytesSum - 100) / 8;  //得以总记录数目             

                BinaryFile.Close();
                fs.Close();

                //打开shp文件
                if (shxfilepath == "")
                {
                    //  MessageBox.Show("索引文件打开出错");
                    return false;
                }
                //打开.shp文件,读取x,y坐标的信息
                fs = new FileStream(shpfilepath, FileMode.Open, FileAccess.Read);   //文件流形式
                BinaryFile = new BinaryReader(fs);     //打开二进制文件   

                BinaryFile.ReadBytes(32);  //先读出36个字节,紧接着是Box边界合
                int shapetype = BinaryFile.ReadInt32();              
                
                geolayer.envlope.left = BinaryFile.ReadDouble();   //读出整个shp图层的边界合
                geolayer.envlope.bottom = BinaryFile.ReadDouble();
                geolayer.envlope.right = BinaryFile.ReadDouble();
                geolayer.envlope.top = BinaryFile.ReadDouble();


                BinaryFile.ReadBytes(32);  //   shp中尚未使用的边界盒    


                //Get Shape Data From Here On
                int stype;
                double x, y;
                double left, right, top, bottom;

                int partcount;
                int pointcount;

                switch (shapetype)
                {
                    case 1://single point

                                geolayer.shapeType = CGConstants.CGShapeType.SHAPE_POINT;
                                for (int i = 0; i < shapecount; i++)
                                {
                                    CGGeoShape.CGGeoPoint gps = new CGGeoShape.CGGeoPoint();

                                    BinaryFile.ReadBytes(12); //记录头8个字节和一个int(4个字节)的shapetype

                                   /* stype = BinaryFile.ReadInt32();
                                  
                                    if (stype != shapetype)
                                        continue;

                                    */
                                    x = BinaryFile.ReadDouble();
                                    y = BinaryFile.ReadDouble();

                                    gps.objectID = i;
                                    gps.objectUID = i;

                                    gps.x = x;
                                    gps.y = y;
                                    gps.z = 0;
                                    gps.envlope.left = gps.x;
                                    gps.envlope.right = gps.x;
                                    gps.envlope.top = gps.y;
                                    gps.envlope.bottom = gps.y;
                                    geolayer.getDataContainer().Add(gps);
                                }
                        break;

                    case 8://multi points layer
                        break;

                    case 3://Polyline layer
                        geolayer.shapeType = CGConstants.CGShapeType.SHAPE_LINE;

                        for (int i = 0; i < shapecount; i++)
                        {
                            geolayer.getAttributeContainer().Add(ds.Tables[0].Rows[i][0]);      //read out the attribute step by step

                            BinaryFile.ReadBytes(12);

                            //	 int pos = indexRecs[i].Offset+8;
                            //	 bb0.position(pos);
                            //	 stype = bb0.getInt();
                            //	 if (stype!=nshapetype){
                            //		 continue;
                            //	 }

                            left = BinaryFile.ReadDouble();
                            bottom = BinaryFile.ReadDouble();
                            right = BinaryFile.ReadDouble();
                            top = BinaryFile.ReadDouble();

                            partcount = BinaryFile.ReadInt32();
                            pointcount = BinaryFile.ReadInt32();

                            int[] parts = new int[partcount];
                            int[] partspos = new int[partcount];

                            double[] xpoints = new double[pointcount];
                            double[] ypoints = new double[pointcount];
                            double[] zpoints = new double[pointcount];

                            //firstly read out parts begin pos in file
                            for (int j = 0; j < partcount; j++)
                            {
                                parts[j] = BinaryFile.ReadInt32();
                            }
                            //shift them to be points count included in parts
                            if (partcount > 0)
                                partspos[0] = 0;

                            int newpos = 0;
                            for (int j = 0; j <= partcount - 2; j++)
                            {
                                parts[j] = parts[j + 1] - parts[j];
                                newpos += parts[j];
                                partspos[j + 1] = newpos;
                            }

                            parts[partcount - 1] = pointcount - parts[partcount - 1];

                            //read out coordinates
                            for (int j = 0; j < pointcount; j++)
                            {
                                x = BinaryFile.ReadDouble();
                                y = BinaryFile.ReadDouble();
                                xpoints[j] = x;
                                ypoints[j] = y;
                                zpoints[j] = 0;
                            }
                            if (pointcount > 1)
                            {
                                CGGeoShape.CGGeoLine gl = new CGGeoShape.CGGeoLine(xpoints, ypoints, zpoints, parts, partspos, pointcount, partcount);
                                gl.envlope.left = left;
                                gl.envlope.right = right;
                                gl.envlope.top = top;
                                gl.envlope.bottom = bottom;

                                gl.objectID = i;
                                gl.objectUID = i;
                                geolayer.getDataContainer().Add(gl);

                            }
                        }
                        break;
                    case 5://Polygon layer
                        geolayer.shapeType = CGConstants.CGShapeType.SHAPE_POLYGON;
                        for (int i = 0; i < shapecount; i++)
                        {
                            geolayer.getAttributeContainer().Add(ds.Tables[0].Rows[i][0]);   

                          /*  bb0.rewind();
                            bb0.position(indexRecs[i].Offset + 8);
                            stype = BinaryFile.ReadInt32();

                            if (stype != shapetype)
                            {
                                continue;
                            }*/

                            BinaryFile.ReadBytes(12);

                            left = BinaryFile.ReadDouble();
                            bottom = BinaryFile.ReadDouble();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -