• C#解析grd文件


    打开grd(ascii编码的)

    例如:  

        DSAA      //都是这样 没有什么特别的
        2800  2200    //表示x方向上的网格点(xNumCol)有2800个  Y方向上的网格点(yNumRow)有2200
        119   121.8    //x的最小值为119   x的最大值为 121.8
        29.8  32       //y的最小值为29.8  y的最大值为32
        75.248794733946  152.49487339557  //z的最小值是75.248794733946 z的最大值是152.49487339557 

    有类似于下面的数据

     90.27496621276215  90.27466509955178  90.27437613458082  90.27409937596927  90.27383488200486 ................

    (x1,y1)        (x2,y1)                (x3,y1)                     (x4,y1)        (x5,y1)                     (x10,y1)

    ...............           .....................                   ....................            .....................    ......................  ..................此处省略(2800/10)行

                                                            (x280,y1)

    90.27496621276215  90.27466509955178  90.27437613458082  90.27409937596927  90.27383488200486 ................

    (x1,y2)        (x2,y2)                (x3,y2)                     (x4,y2)        (x5,y2)                     (x10,y2)

    ...............           .....................                   ....................            .....................    ......................  ..................此处省略(2800/10)行

                                                            (x280,y2)

    ..............................................................................................................................................................................

    ...............................................................................................................................................................................

    90.27496621276215  90.27466509955178  90.27437613458082  90.27409937596927  90.27383488200486       ................

    (x1,y2200)    (x2,y2200)                (x3,y2200)                     (x4,y2200)        (x5,y2200)                     (x10,y2200)

    ...............           .....................                   ....................            .....................    ......................  ..................此处省略(2800/10)行

                                                                         (x280,y2200)

    //问题随意给出在xmin到xmax   和 ymin到ymax的两个字 求出z的值来 例如 x=100  y =30

    判断x=100出现的位置

          int xNum=0;

          if(xNum<=xMin){ // 取在第一个位置

          xNum=0;

          }else if(xNum>=XMax){

              xNum=xNumCol-1;

                }else{

                                            for(int i=0;i<xNumCol;i++){

                            if(xmin+x*xInterval<x&&xmin +(i+1)*xInterval>x){ //表示下标为i

                                  xum=i;

                            }else{

                                 xum=i+1;

                                }

                         }

                }

    同理可求出Y的位置

                    

                        if (y <= yMin)
    			{
    				
    				yNum = 0;
    			}
    			else if (y >= yMax)
    			{
    				yNum = NumRow - 1;
    			}
    			else
    				for (int i = 0; i < NumRow; i++)
    				{
    					if (yMin + i * yInterval <= y && yMin + (i + 1) * yInterval > y)
    					{
    						if (y - (yMin + i * yInterval) <= yMin + (i + 1) * yInterval - y)
    						{
    							
    							yNum = i;//y的位置
    						}
    						else
    						{
    							
    							yNum = i + 1;
    						}
    						break;
    					}
    				}


    根据xNum 和 YNum 然后算出 要的Z值出现在哪一行和改行的哪个位置 就可以取到最佳值了
    int row =y*(xnum/10+1)+5+x/10+1;//具体行数
    int col =x%10;//在该行的哪个位置


    然后开个流去读取文件就可以了
    StreamReader sr = new StreamReader(filename,Decoding.Default);
    var i=0;
    string txtTag="";
    while(!sr.EndOfStream){
    i++;
    if(i<row+2){
    txtTag=sr.ReadLine();
    }else{
    break;
    }
    }
    sr.close();
    double factValue = txtTag.split('')[col];//取出值

    //效率很低 因为要一行一行的读 不能跳这读 很闹心


    其实文件格式很固定 用二进制流取就很快了 50M的文件读取随机读取只要7毫秒哟
    自己看代码吧
    View Code
    protected void Page_Load(object sender, EventArgs e)
            {
    
                List<double> d = new List<double>();
                Random random = new Random();
                DateTime Starttime = System.DateTime.Now;
                for (int i = 0; i < 40; i++)
                {
                    double x = random.NextDouble() * (122.452486 - 117.742635) + 117.742635;
                    double y = random.NextDouble() * (32.463007 - 29.418809) + 29.418809;
                    d.Add(show("~/file/grid.b.grd", x, y));
                }
                DateTime EndTime = System.DateTime.Now;
                TimeSpan dt = EndTime - Starttime;
                double time = dt.TotalMilliseconds;
            }
    
            public double show(string fileAddress, double x, double y)
            {
    
                int NumCol; //x方向的网格数
                int NumRow;//y方向的网格数
                double xMin;//x的起始值
                double xMax;//x的结束值
                double yMin;//y的起始值
                double yMax;//y的结束值
                FileStream fs = new FileStream(Server.MapPath(fileAddress), FileMode.Open, FileAccess.Read);
                BinaryReader br = new BinaryReader(fs, Encoding.ASCII);
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < 4; i++)
                {
                    sb.Append(br.ReadChar());
                }
                sb.Append('\n');
                for (int i = 0; i < 2; i++)
                {
                    sb.Append(br.ReadInt16()).Append(" ");
                }
                for (int i = 0; i < 6; i++)
                {
                    sb.Append(br.ReadDouble()).Append(" ");
                }
                var list = sb.ToString().Split('\n')[1].Split(' ');
                NumCol = Convert.ToInt32(list[0]);
                NumRow = Convert.ToInt32(list[1]);
                xMin = Convert.ToDouble(list[2]);
                xMax = Convert.ToDouble(list[3]);
                yMin = Convert.ToDouble(list[4]);
                yMax = Convert.ToDouble(list[5]);
                double xInterval = (xMax - xMin) / NumCol; // x方向增量
                double yInterval = (yMax - yMin) / NumRow; // y方向增量
                int xNum = 0, yNum = 0;
                if (x <= xMin)
                {
                
                    xNum = 0;
                }
                else if (x >= xMax)
                {
                    
                    xNum = NumCol - 1;
                }
                else
                    for (int i = 0; i < NumCol; i++)//对行进行处理
                    {
                        if (xMin + i * xInterval <= x && xMin + (i + 1) * xInterval > x) //判断x值所在的区间
                        {
                            if (x - (xMin + i * xInterval) <= xMin + (i + 1) * xInterval - x)
                            {
                                xNum = i;//x在的位置
                            }
                            else
                            {
                                xNum = i + 1;
                            }
                            break;
                        }
                    }
                if (y <= yMin)
                {
                    
                    yNum = 0;
                }
                else if (y >= yMax)
                {
                    yNum = NumRow - 1;
                }
                else
                    for (int i = 0; i < NumRow; i++)
                    {
                        if (yMin + i * yInterval <= y && yMin + (i + 1) * yInterval > y)
                        {
                            if (y - (yMin + i * yInterval) <= yMin + (i + 1) * yInterval - y)
                            {
                                
                                yNum = i;//y的位置
                            }
                            else
                            {
                                
                                yNum = i + 1;
                            }
                            break;
                        }
                    }
                int factValue = yNum * NumCol + xNum;
                float z = 0.0f;
                br.BaseStream.Position = (factValue - 1) * 4 + 60;
                if (br.PeekChar() > -1)
                {
                    z = br.ReadSingle();
                }
                br.Close();
                fs.Close();
                return Convert.ToDouble(z);
            }
  • 相关阅读:
    二维动规思想,j 具有明显枚举特征
    二分法题目总结
    最大(小)值最小(大)化 (二分法变形)
    C/ C++ 输入输出流
    正序扫描字符串问题
    React(基础一)_react中的三大属性
    找位置
    STL vector
    STL stack
    打印日期
  • 原文地址:https://www.cnblogs.com/leidc/p/2612201.html
Copyright © 2020-2023  润新知