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