예제 #1
0
        /// <summary>
        /// 创建边界
        /// </summary>
        /// <returns></returns>
        private bool CreateBorder()
        {
            ShpOperator shpOper = new ShpOperator();

            shpOper.ReadShpFile(m_provinceShpFile);

            int polygonCnt = shpOper.Polygons.Count;

            float gridStep = 0.005f;

            RectangleF lonlatBox = FixLonLatBox();

            int widthPts  = (int)(lonlatBox.Width / gridStep) + 1;
            int heightPts = (int)(lonlatBox.Height / gridStep) + 1;

            DatasetInfo lonInfo = m_L1DataFile.LongitudeInfo;

            float[, ,] lon = m_L1DataFile.Longitude;
            float[, ,] lat = m_L1DataFile.Latitude;
            DatasetInfo latInfo = m_L1DataFile.LatitudeInfo;

            GridPt[,] grid = new GridPt[widthPts, heightPts];

            for (int ystart = 0; ystart < lonInfo.row; ystart++)
            {
                for (int xstart = 0; xstart < lonInfo.col; xstart++)
                {
                    int xIndex = (int)((lon[0, ystart, xstart] - lonlatBox.X) / gridStep);
                    int yIndex = (int)((lat[0, ystart, xstart] - lonlatBox.Y) / gridStep);

                    grid[xIndex, yIndex].Y = ystart;
                    grid[xIndex, yIndex].X = xstart;
                }
            }


            for (int i = 0; i < polygonCnt; i++)
            {
                Polygon_shape shape = shpOper.Polygons[i];

                RectangleF shapeRect = new RectangleF();
                shapeRect.X      = (float)shape.Box[0];
                shapeRect.Y      = (float)shape.Box[1];
                shapeRect.Height = (float)shape.Box[3] - (float)shape.Box[1];
                shapeRect.Width  = (float)shape.Box[2] - (float)shape.Box[0];

                if (lonlatBox.IntersectsWith(shapeRect))
                {
                    //return true;
                    List <Point> polygonPts = new List <Point>();
                    for (int j = 0; j < shape.NumPoints; j++)
                    {
                        //if(shape.Points[j])
                        int xIndex = (int)((shape.Points[j].X - lonlatBox.X) / gridStep);
                        int yIndex = (int)((shape.Points[j].Y - lonlatBox.Y) / gridStep);

                        if (xIndex <= 0 || yIndex <= 0 || xIndex >= widthPts || yIndex >= heightPts)
                        {
                            continue;
                        }

                        if (grid[xIndex, yIndex].X == 0 && grid[xIndex, yIndex].Y == 0)
                        {
                            continue;
                        }

                        polygonPts.Add(new Point(grid[xIndex, yIndex].X, grid[xIndex, yIndex].Y));
                        //m_PolygonPts.

                        //grid[xIndex,yIndex]
                    }

                    if (polygonPts.Count > 3)
                    {
                        m_PolygonPts.Add(polygonPts.ToArray());
                    }
                }

                //shape.
            }


            m_BorderImgWidth  = latInfo.col;
            m_BorderImgHeight = latInfo.row;
            return(false);
        }
예제 #2
0
        private void ParseSHP(string fileName)
        {
            BinaryReader br = new BinaryReader(File.Open(fileName, FileMode.Open));

            br.ReadBytes(24);
            int FileLength = br.ReadInt32();//<0代表数据长度未知
            int FileBanben = br.ReadInt32();

            ShapeType = br.ReadInt32();
            double xmin, ymin, xmax, ymax;

            xmin = br.ReadDouble();
            ymax = -1 * br.ReadDouble();
            xmax = br.ReadDouble();
            ymin = -1 * br.ReadDouble();
            double width  = xmax * xmin;
            double height = ymax * ymin;

            br.ReadBytes(32);

            switch (ShapeType)
            {
            case 1:
                m_points.Clear();
                while (br.PeekChar() != -1)
                {
                    PointF point = new PointF();

                    uint RecordNum  = br.ReadUInt32();
                    int  DataLength = br.ReadInt32();


                    //读取第i个记录
                    br.ReadInt32();
                    point.X = (float)br.ReadDouble();
                    point.Y = (float)br.ReadDouble();
                    m_points.Add(point);
                }
                break;

            case 3:
                m_polylines.Clear();
                while (br.PeekChar() != -1)
                {
                    PolyLine_shape polyline = new PolyLine_shape();
                    polyline.Box    = new double[4];
                    polyline.Parts  = new List <int>();
                    polyline.Points = new List <PointF>();

                    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++)
                    {
                        polyline.Parts.Add(br.ReadInt32());
                    }
                    for (int j = 0; j < polyline.NumPoints; j++)
                    {
                        PointF pointtemp = new PointF();
                        pointtemp.X = (float)br.ReadDouble();
                        pointtemp.Y = (float)br.ReadDouble();

                        polyline.Points.Add(pointtemp);
                    }
                    m_polylines.Add(polyline);
                }

                break;

            case 5:
                m_polygons.Clear();
                while (br.PeekChar() != -1)
                {
                    Polygon_shape polygon = new Polygon_shape();
                    polygon.Box    = new double[4];
                    polygon.Parts  = new List <int>();
                    polygon.Points = new List <PointF>();

                    uint RecordNum  = br.ReadUInt32();
                    int  DataLength = br.ReadInt32();

                    //读取第i个记录
                    int m = br.ReadInt32();
                    polygon.Box[0]    = br.ReadDouble();
                    polygon.Box[1]    = br.ReadDouble();
                    polygon.Box[2]    = br.ReadDouble();
                    polygon.Box[3]    = br.ReadDouble();
                    polygon.NumParts  = br.ReadInt32();
                    polygon.NumPoints = br.ReadInt32();
                    for (int j = 0; j < polygon.NumParts; j++)
                    {
                        polygon.Parts.Add(br.ReadInt32());
                    }
                    for (int j = 0; j < polygon.NumPoints; j++)
                    {
                        PointF pointtemp = new PointF();
                        pointtemp.X = (float)br.ReadDouble();
                        pointtemp.Y = (float)br.ReadDouble();
                        polygon.Points.Add(pointtemp);
                    }
                    m_polygons.Add(polygon);
                }

                break;
            }
            br.Close();
        }
예제 #3
0
파일: GDAL.cs 프로젝트: xiaoniDAY/Rookie
        private void 打开shp文件ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            DialogResult dr = this.openFileDialog1.ShowDialog();

            if (dr == DialogResult.OK)
            {
                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.pictureBox1.Width * 0.9 / width);   //x轴放大倍数
                n2 = (float)(this.pictureBox1.Height * 0.9 / height); //y轴放大倍数
                br.ReadBytes(32);

                switch (ShapeType)
                {
                case 1:
                    points.Clear();
                    while (br.PeekChar() != -1)
                    {
                        Point_shape point = new Point_shape();

                        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_shape 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_shape polyline = new PolyLine_shape();
                        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_shape pointtemp = new Point_shape();
                            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_shape 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_shape ps = (Point_shape)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_shape polygon = new Polygon_shape();
                        polygon.Parts  = new ArrayList();
                        polygon.Points = new ArrayList();

                        uint RecordNum  = br.ReadUInt32();
                        int  DataLength = br.ReadInt32();

                        //读取第i个记录
                        int m = br.ReadInt32();
                        polygon.Box1      = br.ReadDouble();
                        polygon.Box2      = br.ReadDouble();
                        polygon.Box3      = br.ReadDouble();
                        polygon.Box4      = 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_shape pointtemp = new Point_shape();
                            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_shape 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_shape ps = (Point_shape)p.Points[j];
                                sw1.WriteLine("    {0},{1},{2} ", ps.X, -1 * ps.Y, 0);
                            }
                            count++;
                        }
                    }
                    sw1.Close();
                    break;
                }
                br.Close();
            }
            this.pictureBox1.Refresh();
        }
예제 #4
0
        private void ParseSHP(string fileName)
        {
            BinaryReader br = new BinaryReader(File.Open(fileName, FileMode.Open));

            br.ReadBytes(24);
            int FileLength = br.ReadInt32();//<0代表数据长度未知
            int FileBanben = br.ReadInt32();
            ShapeType = br.ReadInt32();
            double xmin, ymin, xmax, ymax;
            xmin = br.ReadDouble();
            ymax = -1 * br.ReadDouble();
            xmax = br.ReadDouble();
            ymin = -1 * br.ReadDouble();
            double width = xmax * xmin;
            double height = ymax * ymin;
            br.ReadBytes(32);

            switch (ShapeType)
            {
                case 1:
                    m_points.Clear();
                    while (br.PeekChar() != -1)
                    {
                        PointF point = new PointF();

                        uint RecordNum = br.ReadUInt32();
                        int DataLength = br.ReadInt32();

                        //读取第i个记录
                        br.ReadInt32();
                        point.X = (float)br.ReadDouble();
                        point.Y = (float)br.ReadDouble();
                        m_points.Add(point);
                    }
                    break;
                case 3:
                    m_polylines.Clear();
                    while (br.PeekChar() != -1)
                    {
                        PolyLine_shape polyline = new PolyLine_shape();
                        polyline.Box = new double[4];
                        polyline.Parts = new List<int>();
                        polyline.Points = new List<PointF>();

                        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++)
                        {
                            polyline.Parts.Add(br.ReadInt32());
                        }
                        for (int j = 0; j < polyline.NumPoints; j++)
                        {

                            PointF pointtemp = new PointF();
                            pointtemp.X = (float)br.ReadDouble();
                            pointtemp.Y = (float)br.ReadDouble();

                            polyline.Points.Add(pointtemp);
                        }
                        m_polylines.Add(polyline);
                    }

                    break;
                case 5:
                    m_polygons.Clear();
                    while (br.PeekChar() != -1)
                    {
                        Polygon_shape polygon = new Polygon_shape();
                        polygon.Box = new double[4];
                        polygon.Parts = new List<int>();
                        polygon.Points = new List<PointF>();

                        uint RecordNum = br.ReadUInt32();
                        int DataLength = br.ReadInt32();

                        //读取第i个记录
                        int m = br.ReadInt32();
                        polygon.Box[0] = br.ReadDouble();
                        polygon.Box[1] = br.ReadDouble();
                        polygon.Box[2] = br.ReadDouble();
                        polygon.Box[3] = br.ReadDouble();
                        polygon.NumParts = br.ReadInt32();
                        polygon.NumPoints = br.ReadInt32();
                        for (int j = 0; j < polygon.NumParts; j++)
                        {
                            polygon.Parts.Add(br.ReadInt32());
                        }
                        for (int j = 0; j < polygon.NumPoints; j++)
                        {
                            PointF pointtemp = new PointF();
                            pointtemp.X = (float)br.ReadDouble();
                            pointtemp.Y = (float)br.ReadDouble();
                            polygon.Points.Add(pointtemp);
                        }
                        m_polygons.Add(polygon);
                    }

                    break;
            }
            br.Close();
        }