Doppler产品数据格式(SymbologyImage)

本页包含SymbologyImage.java、ProductSymbologyBlock.java、ProductSymbologyLayerBlock.java三个类。

 


SymbologyImage.java
001  /**
002    * PACKAGE      : cma.gmb.doppler
003    * FILENAME     : SymbologyImage.java
004    * DESCRIPTION  : 处理多普勒雷达产品数据(扫描产品Radial和栅格产品Raster)
005    * AUTHOR       : 刘泽军
006    * EMAIL        : BJ0773@gmail.com
007    * Date         : 2007-06-02 23:52:38
008    * Update       : 2007-06-13 分别把RadialImage.java、RasterImage.java独立出去
009    * Reference    : 《National Climatic Data Center DATA DOCUMENTATION FOR TD7000 -
010    *                 TD7599 NEXRAD LEVEL III》
011    *
012    */
013 
014  package  cma.gmb.doppler;
015 
016  import  java.io.*;
017  import  java.awt.*;
018 
019  import  cma.common.dataio.*;
020  import  cma.common.projection.*;
021  import  cma.micaps.diamond.*;
022  import  cma.gmb.doppler.datatype.*;
023 
024  public class  SymbologyImage  {
025 
026       public   MessageHeaderBlock              messageHeaderBlock;
027       public   ProductDescriptionBlock         productDescriptionBlock;
028       public   ProductSymbologyBlock           productSymbologyBlock;
029       public   ProductSymbologyLayerBlock []     productSymbologyLayerBlock;
030 
031       public   RadialImage []                    radialImage;
032       public   RasterImage []                    rasterImage;
033 
034  /**
035    * 功能:构造函数
036    * 参数:
037    *      无
038    * 返回值:
039    *      无
040    */
041       public  SymbologyImage () {
042       }
043 
044  /**
045    * 功能:读取多普勒雷达Symbology产品
046    * 参数:
047    *      fname   - 文件名
048    * 返回值:
049    *      是否成功
050    */
051       public  boolean  loadFromFile ( String fname throws  Exception  {
052           File f =  new  File ( fname ) ;
053           RandomAccessFile fin =  new  RandomAccessFile ( f,  "r" ) ;
054 
055           boolean  ok  =  false ;
056 
057           messageHeaderBlock      =  new  MessageHeaderBlock () ;
058           ok  = messageHeaderBlock.read ( fin ) ;
059 
060           productDescriptionBlock     =  new  ProductDescriptionBlock () ;
061           ok  = ok && productDescriptionBlock.read ( fin ) ;
062 
063           if !ok || productDescriptionBlock.OffsetToSymbology <=  ) {
064               System.out.println ( "NOT Radial Image Data" ) ;
065               fin.close () ;
066               return ( false ) ;
067           }
068 
069           fin.seek ( productDescriptionBlock.OffsetToSymbology* 2 ) ;
070 
071           productSymbologyBlock   =  new  ProductSymbologyBlock () ;
072           ok  = ok && productSymbologyBlock.read ( fin ) ;
073 
074           if !ok || productSymbologyBlock.NumberOfLayers <=  ) {
075               fin.close () ;
076               return ( false ) ;
077           }
078 
079           productSymbologyLayerBlock  =  new  ProductSymbologyLayerBlock [ productSymbologyBlock.NumberOfLayers ] ;
080           radialImage                 =  new  RadialImage [ productSymbologyBlock.NumberOfLayers ] ;
081           rasterImage                 =  new  RasterImage [ productSymbologyBlock.NumberOfLayers ] ;
082           for ( int  i= 0 ;i<productSymbologyBlock.NumberOfLayers;i++ ) {
083               productSymbologyLayerBlock [ i ]    new  ProductSymbologyLayerBlock () ;
084               ok  = ok && productSymbologyLayerBlock [ i ] .read ( fin ) ;
085               if !ok  ) {
086                   return ( false ) ;
087               }
088               if "AF1F" .equalsIgnoreCase ( productSymbologyLayerBlock [ i ] .PacketCode ) ) { //扫描数据 Radial Image
089                   radialImage [ i ]   new  RadialImage () ;
090                   radialImage [ i ] .messageHeaderBlock           = messageHeaderBlock;
091                   radialImage [ i ] .productDescriptionBlock      = productDescriptionBlock;
092                   radialImage [ i ] .productSymbologyBlock        = productSymbologyBlock;
093                   radialImage [ i ] .productSymbologyLayerBlock   = productSymbologyLayerBlock [ i ] ;
094                   ok  = ok && radialImage [ i ] .read ( fin ) ;
095               }
096               else if "BA0F" .equalsIgnoreCase ( productSymbologyLayerBlock [ i ] .PacketCode ||
097                        "BA07" .equalsIgnoreCase ( productSymbologyLayerBlock [ i ] .PacketCode ) ) { //栅格数据 Raster Image
098                   rasterImage [ i ]   new  RasterImage () ;
099                   rasterImage [ i ] .messageHeaderBlock           = messageHeaderBlock;
100                   rasterImage [ i ] .productDescriptionBlock      = productDescriptionBlock;
101                   rasterImage [ i ] .productSymbologyBlock        = productSymbologyBlock;
102                   rasterImage [ i ] .productSymbologyLayerBlock   = productSymbologyLayerBlock [ i ] ;
103                   ok  = ok && rasterImage [ i ] .read ( fin ) ;
104               }
105               else if productSymbologyLayerBlock [ i ] .BlockLength >  ) { //其它尚未支持的数据格式
106                   byte []   data    =  new  byte [ productSymbologyLayerBlock [ i ] .BlockLength ] ;
107                   fin.read ( data ) ;
108               }
109           }
110           fin.close () ;
111 
112           return ( ok ) ;
113       }
114 
115  /**
116    * 2007-06-04增加,并在相关的类中增加 read(InputStream fin) 方法
117    *
118    * 功能:读取多普勒雷达Symbology产品,主要是考虑直接从 .tar.gz 中读取
119    * 参数:
120    *      fin     - InputStream,注意不能使用 fin.close() 方法,因为在函数外部可能还需要继续从 fin 读数据
121    * 返回值:
122    *      是否成功
123    */
124       public  boolean  loadFromStream ( InputStream fin throws  Exception  {
125 
126           boolean  ok  =  false ;
127 
128           messageHeaderBlock      =  new  MessageHeaderBlock () ;
129           ok  = messageHeaderBlock.read ( fin ) ;
130 
131           productDescriptionBlock     =  new  ProductDescriptionBlock () ;
132           ok  = ok && productDescriptionBlock.read ( fin ) ;
133 
134           if !ok || productDescriptionBlock.OffsetToSymbology <=  ) {
135               System.out.println ( "NOT Radial Image Data" ) ;
136               return ( false ) ;
137           }
138 
139           int  skipLength  = productDescriptionBlock.OffsetToSymbology* - MessageHeaderBlock.SIZE - ProductDescriptionBlock.SIZE;
140           fin.skip ( skipLength ) ;
141 
142           productSymbologyBlock   =  new  ProductSymbologyBlock () ;
143           ok  = ok && productSymbologyBlock.read ( fin ) ;
144 
145           if !ok || productSymbologyBlock.NumberOfLayers <=  ) {
146               return ( false ) ;
147           }
148 
149           productSymbologyLayerBlock  =  new  ProductSymbologyLayerBlock [ productSymbologyBlock.NumberOfLayers ] ;
150           radialImage                 =  new  RadialImage [ productSymbologyBlock.NumberOfLayers ] ;
151           rasterImage                 =  new  RasterImage [ productSymbologyBlock.NumberOfLayers ] ;
152           for ( int  i= 0 ;i<productSymbologyBlock.NumberOfLayers;i++ ) {
153               productSymbologyLayerBlock [ i ]    new  ProductSymbologyLayerBlock () ;
154               ok  = ok && productSymbologyLayerBlock [ i ] .read ( fin ) ;
155               if !ok  ) {
156                   return ( false ) ;
157               }
158               if "AF1F" .equalsIgnoreCase ( productSymbologyLayerBlock [ i ] .PacketCode ) ) { //扫描数据 Radial Image
159                   radialImage [ i ]   new  RadialImage () ;
160                   radialImage [ i ] .messageHeaderBlock           = messageHeaderBlock;
161                   radialImage [ i ] .productDescriptionBlock      = productDescriptionBlock;
162                   radialImage [ i ] .productSymbologyBlock        = productSymbologyBlock;
163                   radialImage [ i ] .productSymbologyLayerBlock   = productSymbologyLayerBlock [ i ] ;
164                   ok  = ok && radialImage [ i ] .read ( fin ) ;
165               }
166               else if "BA0F" .equalsIgnoreCase ( productSymbologyLayerBlock [ i ] .PacketCode ||
167                        "BA07" .equalsIgnoreCase ( productSymbologyLayerBlock [ i ] .PacketCode ) ) { //栅格数据 Raster Image
168                   rasterImage [ i ]   new  RasterImage () ;
169                   rasterImage [ i ] .messageHeaderBlock           = messageHeaderBlock;
170                   rasterImage [ i ] .productDescriptionBlock      = productDescriptionBlock;
171                   rasterImage [ i ] .productSymbologyBlock        = productSymbologyBlock;
172                   rasterImage [ i ] .productSymbologyLayerBlock   = productSymbologyLayerBlock [ i ] ;
173                   ok  = ok && rasterImage [ i ] .read ( fin ) ;
174               }
175               else if productSymbologyLayerBlock [ i ] .BlockLength >  ) { //Unknow Data
176                   byte []   data    =  new  byte [ productSymbologyLayerBlock [ i ] .BlockLength ] ;
177                   fin.read ( data ) ;
178               }
179           }
180 
181           return ( ok ) ;
182       }
183 
184  }

 


ProductSymbologyBlock.java
001  /**
002    * PACKAGE     : cma.gmb.doppler.datatype
003      FILENAME    : ProductSymbologyBlock.java
004    * DESCRIPTION : 多普勒雷达产品数据结构
005    * AUTHOR      : 刘泽军
006    * EMAIL       : BJ0773@gmail.com
007    * Date        : 2007-05-21 12:03:44
008    * Update      :
009    * Reference   : 《NEXRAD LEVEL II数据格式》中文版及英文版
010    */
011 
012  package  cma.gmb.doppler.datatype;
013 
014  import  java.io.*;
015  import  java.lang.*;
016 
017  import  cma.common.dataio.*;
018 
019  public class  ProductSymbologyBlock  { //产品数据结构
020 
021       public  static   int  SIZE    =  10 ;
022 
023       public   short    BlockDivider;    //数据块分隔符=-1
024       public   short    BlockID;         //产品数据标识=1
025       public   int      BlockLength;     //数据长度(字节数)
026       public   short    NumberOfLayers;  //产品层数
027 
028  /**
029    * 功能:构造函数
030    * 参数:
031    *      无
032    * 返回:
033    *      无
034    */
035       public  ProductSymbologyBlock () {
036       }
037 
038  /**
039    * 功能:从文件中读取数据,并进行BigEndian转换
040    * 参数:
041    *      raf     - 随机访问的文件对象
042    * 返回:
043    *      是否成功
044    */
045       public  boolean  read ( RandomAccessFile raf ) {
046           try  {
047               byte []   buf =  new  byte [ ProductSymbologyBlock.SIZE ] ;
048               int      len = raf.read ( buf ) ;
049               return ( len == ProductSymbologyBlock.SIZE ? parse ( buf,  0 false ) ;
050           }
051           catch ( Exception ex ) {
052               return ( false ) ;
053           }
054       }
055 
056  /**
057    * 功能:从输入流文件中读取数据,并进行BigEndian转换
058    * 参数:
059    *      raf     - InputStream对象
060    * 返回:
061    *      是否成功
062    */
063       public  boolean  read ( InputStream in ) {
064           try  {
065               byte []   buf =  new  byte [ ProductSymbologyBlock.SIZE ] ;
066               int      len = in.read ( buf ) ;
067               return ( len == ProductSymbologyBlock.SIZE ? parse ( buf,  0 false ) ;
068           }
069           catch ( Exception ex ) {
070               return ( false ) ;
071           }
072       }
073 
074  /**
075    * 功能:从缓冲区中读数据
076    *       (在外部方法中,一次性读入所有数据,然后逐类分析数据)
077    * 参数:
078    *      buf     - 缓冲数据
079    *      index   - 偏移
080    * 返回:
081    *      正确读出的数据字节数
082    */
083       public  int  read ( byte []  buf,  int  index ) {
084           return ( parse ( buf, index ) ?ProductSymbologyBlock.SIZE: 0 ) ;
085       }
086 
087  /**
088    * 功能:从缓冲区中分析出数据
089    * 参数:
090    *      buf     - 缓冲数据
091    * 返回:
092    *      是否成功
093    */
094       public  boolean  parse ( byte []  buf ) {
095           return ( parse ( buf,  0 )) ;
096       }
097 
098  /**
099    * 功能:从缓冲区中分析出数据
100    * 参数:
101    *      buf     - 缓冲数据
102    *      index   - 偏移
103    * 返回:
104    *      是否成功
105    */
106       public  boolean  parse ( byte []  buf,  int  index ) {
107           if buf.length < index + ProductSymbologyBlock.SIZE  ) {
108               return ( false ) ;
109           }
110           BlockDivider    = DataConverterBE.getShort ( buf, index+ 0 ) ;
111           BlockID         = DataConverterBE.getShort ( buf, index+ 2 ) ;
112           BlockLength     = DataConverterBE.getShort ( buf, index+ 4 ) ;
113           NumberOfLayers  = DataConverterBE.getShort ( buf, index+ 8 ) ;
114           return ( true ) ;
115       }
116 
117  /**
118    * 功能:获得数据信息
119    * 参数:
120    *      无
121    * 返回:
122    *      数据信息
123    */
124       public  String info () {
125           String  msg =
126               "/nProductSymbologyBlock.SIZE = "  + String.valueOf ( ProductSymbologyBlock.SIZE +
127               "/n    BlockDivider           = "  + String.valueOf ( BlockDivider +
128               "/n    BlockID                = "  + String.valueOf ( BlockID +
129               "/n    BlockLength            = "  + String.valueOf ( BlockLength +
130               "/n    NumberOfLayers         = "  + String.valueOf ( NumberOfLayers +
131               "/n" ;
132           return ( msg ) ;
133       }
134  /**
135    * 功能:打印数据,主要用于测试
136    * 参数:
137    *      无
138    * 返回:
139    *      无
140    */
141       public  void  print () {
142           System.out.println ( info ()) ;
143       }
144 
145  }

 


ProductSymbologyLayerBlock.java
001  /**
002    * PACKAGE     : cma.gmb.doppler.datatype
003      FILENAME    : ProductSymbologyLayerBlock.java
004    * DESCRIPTION : 多普勒雷达产品数据结构
005    * AUTHOR      : 刘泽军
006    * EMAIL       : BJ0773@gmail.com
007    * Date        : 2007-05-31 21:45:21
008    * Update      :
009    * Reference   : 《NEXRAD LEVEL II数据格式》中文版及英文版
010    */
011 
012  package  cma.gmb.doppler.datatype;
013 
014  import  java.io.*;
015  import  java.lang.*;
016 
017  import  cma.common.dataio.*;
018 
019  public class  ProductSymbologyLayerBlock  { //层数据包
020 
021       public  static   int  SIZE    =  8 ;
022 
023       public   short    LayerDivider;    //数据层分隔符=-1
024       public   int      BlockLength;     //层数据长度(字节数)
025       public   String  PacketCode;      //包代码,AF1F则为Radial数据,BA07、BA0F、8000、00C0则为Raster数据,见英文格式P48页起
026 
027  /**
028    * 功能:构造函数
029    * 参数:
030    *      无
031    * 返回:
032    *      无
033    */
034       public  ProductSymbologyLayerBlock () {
035       }
036 
037  /**
038    * 功能:从文件中读取数据,并进行BigEndian转换
039    * 参数:
040    *      raf     - 随机访问的文件对象
041    * 返回:
042    *      是否成功
043    */
044       public  boolean  read ( RandomAccessFile raf ) {
045           try  {
046               byte []   buf =  new  byte [ ProductSymbologyLayerBlock.SIZE ] ;
047               int      len = raf.read ( buf ) ;
048               return ( len == ProductSymbologyLayerBlock.SIZE ? parse ( buf,  0 false ) ;
049           }
050           catch ( Exception ex ) {
051               return ( false ) ;
052           }
053       }
054 
055  /**
056    * 功能:从输入流文件中读取数据,并进行BigEndian转换
057    * 参数:
058    *      in      - InputStream对象
059    * 返回:
060    *      是否成功
061    */
062       public  boolean  read ( InputStream in ) {
063           try  {
064               byte []   buf =  new  byte [ ProductSymbologyLayerBlock.SIZE ] ;
065               int      len = in.read ( buf ) ;
066               return ( len == ProductSymbologyLayerBlock.SIZE ? parse ( buf,  0 false ) ;
067           }
068           catch ( Exception ex ) {
069               return ( false ) ;
070           }
071       }
072 
073  /**
074    * 功能:从缓冲区中读数据
075    *       (在外部方法中,一次性读入所有数据,然后逐类分析数据)
076    * 参数:
077    *      buf     - 缓冲数据
078    *      index   - 偏移
079    * 返回:
080    *      正确读出的数据字节数
081    */
082       public  int  read ( byte []  buf,  int  index ) {
083           return ( parse ( buf, index ) ?ProductSymbologyLayerBlock.SIZE: 0 ) ;
084       }
085 
086  /**
087    * 功能:从缓冲区中分析出数据
088    * 参数:
089    *      buf     - 缓冲数据
090    * 返回:
091    *      是否成功
092    */
093       public  boolean  parse ( byte []  buf ) {
094           return ( parse ( buf,  0 )) ;
095       }
096 
097  /**
098    * 功能:从缓冲区中分析出数据
099    * 参数:
100    *      buf     - 缓冲数据
101    *      index   - 偏移
102    * 返回:
103    *      是否成功
104    */
105       public  boolean  parse ( byte []  buf,  int  index ) {
106           LayerDivider            = DataConverterBE.getShort ( buf, index+  0 ) ;
107           BlockLength             = DataConverterBE.getInt   ( buf, index+  2 ) ;
108           PacketCode              = DataConverterBE.getHex   ( buf, index+  6 2 ) ;
109           return ( true ) ;
110       }
111 
112  /**
113    * 功能:获得数据信息
114    * 参数:
115    *      无
116    * 返回:
117    *      数据信息
118    */
119       public  String info () {
120           String  msg =
121               "/nProductSymbologyLayerBlock.SIZE = "  + String.valueOf ( ProductSymbologyLayerBlock.SIZE +
122               "/n    LayerDivider                = "  + String.valueOf ( LayerDivider +
123               "/n    BlockLength                 = "  + String.valueOf ( BlockLength +
124               "/n    PacketCode                  = "  + String.valueOf ( PacketCode +
125               "/n" ;
126           return ( msg ) ;
127       }
128 
129  /**
130    * 功能:打印数据,主要用于测试
131    * 参数:
132    *      无
133    * 返回:
134    *      无
135    */
136       public  void  print () {
137           System.out.println ( info ()) ;
138       }
139 
140  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值