爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 10642|回复: 16

MeteoInfo读取GeoTiff数据

[复制链接]

新浪微博达人勋

发表于 2012-12-18 19:05:16 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 luckycomcn 于 2014-12-10 19:32 编辑

    之前已经把一个项目迁移到MeteoInfo上。由于项目需要,要读取读取GeoTiff的数据,如果调用GDAL的话是最方便的,但是引入的Dll比较多,于是自己写了一些代码实现这些功能。由于手头上的GeoTiff不多,而全部代码都是自己写的,不排除存在纰漏,而代码目前只针对某些GeoTiff有效(主要是存储的数据的类型的问题)。投影信息是已经可以读取出来的,不过投影转换这块暂时还没做。
    其中GeoTiff格式参考了这篇文章tiff和geotiff格式分析
    因此这里的代码只是提供一种思路,想兼容自己的数据的话,还得自己修改一下。
    原理说一下,主要是根据文件内部的描述,读取各个标签,从而获取各种值(宽度、高度、经纬度信息等等),不同的标签代码表示的意义后面的附件有。得到这些信息之后就能自己去创建一个GridData对象,从而实现MeteoInfo对GeoTiff的支持。现在还存在的问题就是不同的GeoTiff里面存储的数据到底是什么类型,同样是32位的数据有可能是浮点型也可能是长整型,这个还没处理好。而数据存储的方式本身也有两种,一种是线性的,一种是按块储存,而且这只是我手头上的这两种数据,不知道是不是还有第三种或者第N种。大家也可以把自己的数据贴上来,我有空可以测试支持一下。
    废话不多说,上代码。里面带的标注应该足够多了。代码太长了,只放了部分出来,完整版在附件里面。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO;

  6. namespace yzqx.MeteoInfo
  7. {
  8.     class yzqxGeoTiff
  9.     {

  10.         #region 公开接口
  11.         public interface IyzTiff
  12.         {
  13.             /// <summary>
  14.             /// 256
  15.             /// </summary>
  16.             uint Width
  17.             {
  18.                 get;
  19.             }
  20.             /// <summary>
  21.             /// 257
  22.             /// </summary>
  23.             uint Hight
  24.             {
  25.                 get;
  26.             }
  27.             /// <summary>
  28.             /// 258
  29.             /// </summary>
  30.             uint BitPerSample
  31.             {
  32.                 get;
  33.             }
  34.             /// <summary>
  35.             /// 259
  36.             /// </summary>
  37.             uint Compression
  38.             {
  39.                 get;
  40.             }
  41.             string CompressionDes
  42.             {
  43.                 get;
  44.             }
  45.             /// <summary>
  46.             /// 262
  47.             /// </summary>
  48.             uint PhotometricInterpretation
  49.             {
  50.                 get;
  51.             }
  52.             string ColorDesc
  53.             {
  54.                 get;
  55.             }
  56.             /// <summary>
  57.             /// 273
  58.             /// </summary>
  59.             uint[] StripOffsets
  60.             {
  61.                 get;
  62.             }
  63.             /// <summary>
  64.             /// 274
  65.             /// </summary>
  66.             uint Orientation
  67.             {
  68.                 get;
  69.             }
  70.             /// <summary>
  71.             /// 277
  72.             /// </summary>
  73.             uint SamplesPerPixel
  74.             {
  75.                 get;
  76.             }
  77.             /// <summary>
  78.             /// 278
  79.             /// </summary>
  80.             uint RowsPerStrip
  81.             {
  82.                 get;
  83.             }
  84.             /// <summary>
  85.             /// 279
  86.             /// </summary>
  87.             uint[] StripByteCounts
  88.             {
  89.                 get;
  90.             }
  91.             /// <summary>
  92.             /// 282
  93.             /// </summary>
  94.             float[] XResolution
  95.             {
  96.                 get;
  97.             }
  98.             /// <summary>
  99.             /// 283
  100.             /// </summary>
  101.             float[] YResolution
  102.             {
  103.                 get;
  104.             }
  105.             /// <summary>
  106.             /// 284
  107.             /// </summary>
  108.             uint PlanarConfiguration
  109.             {
  110.                 get;
  111.             }
  112.             /// <summary>
  113.             /// 296
  114.             /// </summary>
  115.             uint ResolutionUnit
  116.             {
  117.                 get;
  118.             }
  119.             /// <summary>
  120.             /// 305
  121.             /// </summary>
  122.             string Software
  123.             {
  124.                 get;
  125.             }
  126.             /// <summary>
  127.             /// 322
  128.             /// </summary>
  129.             uint TileWidth
  130.             {
  131.                 get;
  132.             }
  133.             /// <summary>
  134.             /// 324
  135.             /// </summary>
  136.             uint TileLength
  137.             {
  138.                 get;
  139.             }
  140.             /// <summary>
  141.             /// 324
  142.             /// </summary>
  143.             uint[] TileOffsets
  144.             {
  145.                 get;
  146.             }
  147.             /// <summary>
  148.             /// 325
  149.             /// </summary>
  150.             uint[] TileByteCounts
  151.             {
  152.                 get;
  153.             }
  154.             /// <summary>
  155.             /// 339
  156.             /// </summary>
  157.             uint SampleFormat
  158.             {
  159.                 get;
  160.             }
  161.             /// <summary>
  162.             ///
  163.             /// </summary>
  164.             string PlanarCfgDesc
  165.             {
  166.                 get;
  167.             }
  168.             /// <summary>
  169.             /// 33550
  170.             /// </summary>
  171.             double[] ModelPixelScaleTag
  172.             {
  173.                 get;
  174.             }
  175.             /// <summary>
  176.             /// 33922
  177.             /// </summary>
  178.             double[] ModelTiepointTag
  179.             {
  180.                 get;
  181.             }
  182.             /// <summary>
  183.             /// 34735
  184.             /// </summary>
  185.             UInt16[] GeoKeyDirectoryTag
  186.             {
  187.                 get;
  188.             }
  189.             /// <summary>
  190.             /// 34736
  191.             /// </summary>
  192.             double[] GeoDoubleParamsTag
  193.             {
  194.                 get;
  195.             }
  196.             /// <summary>
  197.             /// 34737
  198.             /// </summary>
  199.             string GeoAsciiParamsTag
  200.             {
  201.                 get;
  202.             }
  203.             object ImageData
  204.             {
  205.                 get;
  206.             }
  207.         }
  208.         #endregion

  209.         public class yzTiff : IyzTiff
  210.         {
  211.             #region 私有变量声明
  212.             private object imageData;
  213.             private uint width;                         //256
  214.             private uint hight;                         //257
  215.             private uint bitPerSample;                  //258
  216.             private uint compression;                   //259
  217.             private uint photometricInterpretation;     //262
  218.             private uint[] stripOffsets;                //273
  219.             private uint orientation;                   //274
  220.             private uint samplesPerPixel;               //277
  221.             private uint rowsPerStrip;                  //278
  222.             private uint[] stripByteCounts;             //279
  223.             private float[] xResolution;                //282
  224.             private float[] yResolution;                //283
  225.             private uint planarConfiguration;           //284
  226.             private uint sesolutionUnit;                //296
  227.             private string software;                    //305
  228.             private uint tileWidth;                     //322
  229.             private uint tileLength;                    //323
  230.             private uint[] tileOffsets;                 //324
  231.             private uint[] tileByteCounts;              //325  
  232.             private uint sampleFormat;                  //339
  233.             double[] modelPixelScaleTag;                //33550
  234.             double[] modelTiepointTag;                  //33922
  235.             UInt16[] geoKeyDirectoryTag;                //34735
  236.             double[] geoDoubleParamsTag;                //34736
  237.             string geoAsciiParamsTag;                   //34737
  238.             private string compDesc, colorDesc, planarCfgDesc;
  239.             int useDataOffSet;
  240.             long lastUsePosition;
  241.             #endregion

  242.             /// <summary>
  243.             /// 初始化Tiff文件
  244.             /// </summary>
  245.             /// <param name="fileName">Tiff文件名</param>
  246.             public yzTiff(string fileName)
  247.             {
  248.                 width = 0;
  249.                 hight = 0;
  250.                 if (!File.Exists(fileName))
  251.                 {
  252.                     throw new Exception("文件不存在!");
  253.                 }
  254.                 else
  255.                 {
  256.                     FileStream fs = new FileStream(fileName, FileMode.Open);
  257.                     BinaryReader br = new BinaryReader(fs);
  258.                     #region 临时使用变量
  259.                     string dataType;        //数据存储类型,Intel还是Mortorola
  260.                     uint fileVer;           //文件版本,一般为42
  261.                     uint IFD1Offset;        //第一个IFD的偏移量
  262.                     uint IFD1Num;           //第一个IFD的标签数
  263.                     uint tagID;             //标签代码
  264.                     uint tagDataType;       //标签数据类型
  265.                     uint valueCount;        //数据的个数
  266.                     uint nextIFDOffSet;     //下一个标签偏移量
  267.                     #endregion

  268.                     #region 文件头信息读取
  269.                     //读取数据存储类型
  270.                     dataType = br.ReadChar().ToString() + br.ReadChar().ToString();
  271.                     if (dataType != "II")
  272.                     {
  273.                         throw new Exception("目前暂时不支持大端储存的Tiff文件");
  274.                     }
  275.                     fileVer = br.ReadUInt16();                  //读取文件版本
  276.                     IFD1Offset = br.ReadUInt32();               //读取第一个IFD偏移量
  277.                     br.BaseStream.Position = IFD1Offset;        //转到第一个偏移标记
  278.                     IFD1Num = br.ReadUInt16();                  //读取第一个IFD的标签数
  279.                     #endregion

  280.                     #region 循环读取第一个域,暂时不支持多个
  281.                     //略
  282.                     #endregion

  283.                     #region 读入图像数据
  284.                     if (nextIFDOffSet != 0)
  285.                     {
  286.                         throw new Exception("暂不支持多个域的GeoTiff文件");
  287.                     }
  288.                     else if (compression != 1)
  289.                     {
  290.                         throw new Exception("暂不支持数据经过压缩的GeoTiff文件");
  291.                     }
  292.                     else
  293.                     {
  294.                         if (tileOffsets != null)
  295.                         {
  296.                             if (bitPerSample == 16)
  297.                             {
  298.                                 int[,] useData = new int[hight, width];
  299.                                 int numtileLength =  (int)(hight / tileLength +1);
  300.                                 int numtileWidth = (int)(width / tileWidth + 1);
  301.                                 for (int i = 0; i < numtileLength; i++)
  302.                                 {
  303.                                     for (int j = 0; j < numtileWidth; j++)
  304.                                     {
  305.                                         br.BaseStream.Position = tileOffsets[i * numtileWidth + j];
  306.                                         for (int k = 0; k < tileLength; k++)
  307.                                         {                                    
  308.                                             for (int l = 0; l < tileWidth; l++)
  309.                                             {
  310.                                                 int onedata = br.ReadInt16();
  311.                                                 if (((i * tileLength + k) >= hight)||(j * tileWidth + l) >= width)
  312.                                                 {
  313.                                                 }
  314.                                                 else
  315.                                                 {                                                   
  316.                                                     if (onedata < -999)
  317.                                                     {
  318.                                                         useData[hight - (i * tileLength + k) - 1, j * tileWidth + l] = 9999;
  319.                                                     }
  320.                                                     else
  321.                                                     {
  322.                                                         useData[hight - (i * tileLength + k) - 1, j * tileWidth + l] = onedata;
  323.                                                     }
  324.                                                 }
  325.                                             }
  326.                                         }
  327.                                     }
  328.                                 }
  329.                                 imageData = useData;
  330.                             }
  331.                             else if (bitPerSample == 32)
  332.                             {
  333.                                 float[,] useData = new float[hight, width];
  334.                                 int numtileLength = (int)(hight / tileLength + 1);
  335.                                 int numtileWidth = (int)(width / tileWidth + 1);
  336.                                 for (int i = 0; i < numtileLength; i++)
  337.                                 {
  338.                                     for (int j = 0; j < numtileWidth; j++)
  339.                                     {
  340.                                         br.BaseStream.Position = tileOffsets[i * numtileWidth + j];
  341.                                         for (int k = 0; k < tileLength; k++)
  342.                                         {
  343.                                             for (int l = 0; l < tileWidth; l++)
  344.                                             {
  345.                                                 float onedata = br.ReadSingle();
  346.                                                 if (((i * tileLength + k) >= hight) || (j * tileWidth + l) >= width)
  347.                                                 {
  348.                                                 }
  349.                                                 else
  350.                                                 {
  351.                                                     if (onedata < -999)
  352.                                                     {
  353.                                                         useData[hight - (i * tileLength + k) - 1, j * tileWidth + l] = 9999;
  354.                                                     }
  355.                                                     else
  356.                                                     {
  357.                                                         useData[hight - (i * tileLength + k) - 1, j * tileWidth + l] = onedata;
  358.                                                     }
  359.                                                 }
  360.                                             }
  361.                                         }
  362.                                     }
  363.                                 }
  364.                                 imageData = useData;
  365.                             }
  366.                             else
  367.                             {
  368.                             }

  369.                         }
  370.                         else if (stripOffsets != null)
  371.                         {
  372.                             #region 32位浮点型
  373.                             if (bitPerSample == 32)
  374.                             {
  375.                                 float[] tempdata = new float[hight * width];
  376.                                 long imagePointNum = 0;
  377.                                 //读取数据
  378.                                 for (int i = 0; i < stripOffsets.Length; i++)
  379.                                 {
  380.                                     uint sbc = stripByteCounts * 8 / bitPerSample;
  381.                                     br.BaseStream.Position = stripOffsets;
  382.                                     for (int j = 0; j < sbc; j++)
  383.                                     {
  384.                                         tempdata[imagePointNum] = br.ReadSingle();
  385.                                         imagePointNum++;
  386.                                     }
  387.                                 }
  388.                                 //转化成矩阵
  389.                                 imagePointNum = 0;
  390.                                 float[,] useData = new float[hight, width];
  391.                                 for (int i = 0; i < hight; i++)
  392.                                 {
  393.                                     for (int j = 0; j < width; j++)
  394.                                     {
  395.                                         useData[hight - i - 1, j] = tempdata[imagePointNum];
  396.                                         imagePointNum++;
  397.                                     }
  398.                                 }
  399.                                 imageData = useData;
  400.                             }
  401.                             #endregion
  402.                             else if (bitPerSample == 16)
  403.                             {
  404.                                 int[] tempdata = new int[hight * width];
  405.                                 long imagePointNum = 0;
  406.                                 //读取数据
  407.                                 for (int i = 0; i < stripOffsets.Length; i++)
  408.                                 {
  409.                                     uint sbc = stripByteCounts * 8 / bitPerSample;
  410.                                     br.BaseStream.Position = stripOffsets;
  411.                                     for (int j = 0; j < sbc; j++)
  412.                                     {
  413.                                         tempdata[imagePointNum] = br.ReadInt16();
  414.                                         imagePointNum++;
  415.                                     }
  416.                                 }
  417.                                 //转化成矩阵
  418.                                 imagePointNum = 0;
  419.                                 int[,] useData = new int[hight, width];
  420.                                 for (int i = 0; i < hight; i++)
  421.                                 {
  422.                                     for (int j = 0; j < width; j++)
  423.                                     {
  424.                                         useData[hight - i - 1, j] = tempdata[imagePointNum];
  425.                                         imagePointNum++;
  426.                                     }
  427.                                 }
  428.                                 imageData = useData;
  429.                             }
  430.                             else
  431.                             {
  432.                             }
  433.                         }
  434.                         else
  435.                         {
  436.                             throw new Exception("暂时不支持此类GeoTiff文档");
  437.                         }
  438.                     }
  439.                     #endregion
  440.                     br.Close();
  441.                     fs.Close();
  442.                 }
  443.             }

  444.             #region 标签处理函数
  445.             private void dealOneTag(uint tagID, uint tagDataType, uint valueCount, uint valueOffiset)
  446.             {
  447.                 //略
  448.             }

  449.             private void dealOneTag(uint tagID, uint tagDataType, uint valueCount, float valueOffiset)
  450.             {

  451.                 //System.Windows.Forms.MessageBox.Show(tagID.ToString() + "尚未处理");
  452.             }

  453.             private void dealOffSetTag(uint tagID, uint tagDataType, uint valueCount, object value)
  454.             {
  455.                 //略
  456.             }

  457.             private string CompDes(uint compression)
  458.             {
  459.                 string descString = "";
  460.                 if (compression == 1)
  461.                 {
  462.                     descString = "No Compression";
  463.                 }
  464.                 else if (compression == 2)
  465.                 {
  466.                     descString = "CCITT Group 31";
  467.                 }
  468.                 else if (compression == 3)
  469.                 {
  470.                     descString = " CITT  Group 3 Fax T4";
  471.                 }
  472.                 else if (compression == 4)
  473.                 {
  474.                     descString = " CITT  Group 3 Fax T6";
  475.                 }
  476.                 else if (compression == 5)
  477.                 {
  478.                     descString = "LZW";
  479.                 }
  480.                 else if (compression == 6)
  481.                 {
  482.                     descString = "JPEG";
  483.                 }
  484.                 else if (compression == 32773)
  485.                 {
  486.                     descString = "PackBits";
  487.                 }
  488.                 else
  489.                 {
  490.                 }
  491.                 return descString;
  492.             }

  493.             private string ColorDes(uint colorID)
  494.             {
  495.                 string descString = "";
  496.                 if (colorID == 0)
  497.                 {
  498.                     descString = "对黑白及灰度图像而言, 0 为白色";
  499.                 }
  500.                 else if (colorID == 1)
  501.                 {
  502.                     descString = "对黑白及灰度图像而言, 0 为黑色";
  503.                 }
  504.                 else if (colorID == 2)
  505.                 {
  506.                     descString = "图像数据以 R,G,B 的方式存储";
  507.                 }
  508.                 else if (colorID == 3)
  509.                 {
  510.                     descString = "图像数据采用调色板索引";
  511.                 }
  512.                 else if (colorID == 4)
  513.                 {
  514.                     descString = "单色的透明混迭图像";
  515.                 }
  516.                 else if (colorID == 5)
  517.                 {
  518.                     descString = "图像数据以 C,M,Y,K 的方式存储";
  519.                 }
  520.                 else if (colorID == 6)
  521.                 {
  522.                     descString = " 图像数据以 Y,Cb,Cr 的方式存储";
  523.                 }
  524.                 else if (colorID == 8)
  525.                 {
  526.                     descString = " 图像以 L*,a*,b* 的方式存储";
  527.                 }
  528.                 else
  529.                 {
  530.                 }
  531.                 return descString;
  532.             }

  533.             private string PlanarCfgDes(uint ID)
  534.             {
  535.                 string descString = "";
  536.                 if (ID == 1)
  537.                 {
  538.                     descString = "单平面格式";
  539.                 }
  540.                 else if (ID == 2)
  541.                 {
  542.                     descString = "多平面格式";
  543.                 }
  544.                 else
  545.                 {
  546.                 }
  547.                 return descString;
  548.             }

  549.             private int dataTypeLenth(uint num)
  550.             {
  551.                 /**************************************
  552.                 1 = BYTE
  553.                 2 = ASCII
  554.                 3 = SHORT
  555.                 4 = LONG
  556.                 5 = RATIONAL
  557.                 6 = SBYTE
  558.                 7 = UNDEFINED
  559.                 8 = SSHORT
  560.                 9 = SLONG
  561.                 10= SRATIONAL
  562.                 11= FLOAT
  563.                 12= DOUBLE
  564.                 /**************************************/
  565.                 int returnNum = 0;
  566.                 if ((num == 1) || (num == 2) || (num == 6))
  567.                 {
  568.                     returnNum = 1;
  569.                 }
  570.                 else if ((num == 3) || (num == 8))
  571.                 {
  572.                     returnNum = 2;
  573.                 }
  574.                 else if ((num == 4) || (num == 9) || (num == 11))
  575.                 {
  576.                     returnNum = 4;
  577.                 }
  578.                 else if ((num == 5) || (num == 12))
  579.                 {
  580.                     returnNum = 8;
  581.                 }
  582.                 else
  583.                 {
  584.                 }
  585.                 if (returnNum != 0)
  586.                 {
  587.                     return returnNum;
  588.                 }
  589.                 else
  590.                 {
  591.                     throw new Exception("暂不支持此类标签");
  592.                 }
  593.             }
  594.             #endregion

  595.             #region 公共属性
  596.             //略
  597.             #endregion
  598.         }
  599.     }
  600. }


    接下来就是将读取到的信息变成GridData:

  1.         /// <summary>
  2.         /// 返回GeoTiff文件的GridData
  3.         /// </summary>
  4.         /// <param name="inputFileName"></param>
  5.         /// <returns></returns>
  6.         internal static GridData tifGridData(string inputFileName)
  7.         {
  8.             double startX, xCell, startY, endY, yCell;
  9.             int width, height;
  10.             yzqxGeoTiff.yzTiff gTiff = new yzqxGeoTiff.yzTiff(inputFileName);
  11.             xCell = gTiff.ModelPixelScaleTag[0];
  12.             yCell = gTiff.ModelPixelScaleTag[1];
  13.             startX = gTiff.ModelTiepointTag[3];
  14.             endY = gTiff.ModelTiepointTag[4];
  15.             width = (int)gTiff.Width;
  16.             height = (int)gTiff.Hight;
  17.             startY = endY - yCell * height;
  18.             GridData gData = new GridData(startX, xCell, width, startY, yCell, height);
  19.             if(gTiff.BitPerSample ==32)
  20.             {
  21.                 float[,] datData;
  22.                 datData = new float[height, width];
  23.                 datData = (float[,])gTiff.ImageData;
  24.                 for (int i = 0; i < height; i++)
  25.                 {
  26.                     for (int j = 0; j < width; j++)
  27.                     {
  28.                         gData.Data[i, j] = datData[i, j];
  29.                     }
  30.                 }
  31.             }
  32.             else if (gTiff.BitPerSample == 16)
  33.             {
  34.                 int[,] datData;
  35.                 datData = new int[height, width];
  36.                 datData = (int[,])gTiff.ImageData;
  37.                 for (int i = 0; i < height; i++)
  38.                 {
  39.                     for (int j = 0; j < width; j++)
  40.                     {
  41.                         gData.Data[i, j] = datData[i, j];
  42.                     }
  43.                 }
  44.             }
  45.             return gData;
  46.         }

   

yzqxGeoTiff.cs

40.9 KB, 下载次数: 12, 下载积分: 金钱 -5

完整版代码

tiff标签编号.doc

276 KB, 下载次数: 11, 下载积分: 金钱 -5

评分

参与人数 1金钱 +20 贡献 +8 收起 理由
mofangbao + 20 + 8

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-12-18 21:19:26 | 显示全部楼层
动作真够快的!

GeoTiff格式数据搞气象的人可能不怎么用,做遥感的应该经常接触。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-12-18 21:35:36 | 显示全部楼层

有数据格式的说明的话,做起来也快的,主要是自己刚好要用这个东西。
最麻烦的是没有格式说明,只能对着二进制格式自己去推敲的古怪数据。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-12-18 22:03:51 | 显示全部楼层
luckycomcn 发表于 2012-12-18 21:35
有数据格式的说明的话,做起来也快的,主要是自己刚好要用这个东西。
最麻烦的是没有格式说明,只能对着 ...

楼主写的代码还是很专业的,以后有空的话会仔细研究一下GeoTiff格式,以楼主的代码为基础把GeoTiff格式的支持加入MeteoInfo库中。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-5-30 18:30:49 | 显示全部楼层
楼主看看
这种数据怎么做
这是数据附带的文字说明

ASTER GDEM2数据
每个文件都是经纬度1°×1°的地表高程数据,3601×3601个数据;
每个文件名中代表的是正方形左下角处的经纬度坐标;
分辨率为30m。


ASTGTM2_N21E110_dem.tif

24.76 MB, 阅读权限: 30, 下载次数: 7, 下载积分: 金钱 -5

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-6-5 12:57:28 | 显示全部楼层
咦,有一灬仔 发表于 2014-5-30 18:30
楼主看看
这种数据怎么做
这是数据附带的文字说明

最近没登陆,回复晚了
这个数据现在meteoinfo里面可以直接打开了啊

QQ截图20140605125451.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-6-5 13:14:44 | 显示全部楼层
请问楼主,哪里可以下载最新版的meteoinfo安装包?我的版本老是报错,卸载重装又总是卡在99%好几个小时,没响应后关掉安装窗口,软件可以用,只是会一直报错 报错.jpg
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-6-5 13:52:34 | 显示全部楼层
咦,有一灬仔 发表于 2014-6-5 13:14
请问楼主,哪里可以下载最新版的meteoinfo安装包?我的版本老是报错,卸载重装又总是卡在99%好几个小时,没 ...

http://bbs.06climate.com/forum.p ... &extra=page%3D1
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-6-5 13:53:25 | 显示全部楼层
咦,有一灬仔 发表于 2014-6-5 13:14
请问楼主,哪里可以下载最新版的meteoinfo安装包?我的版本老是报错,卸载重装又总是卡在99%好几个小时,没 ...

老版本装好之后替换几个文件即可
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-6-5 14:23:10 | 显示全部楼层
谢谢分享~~~~
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表