本页包含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 <= 0 ) {
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 <= 0 ) {
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 > 0 ) { //其它尚未支持的数据格式
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 <= 0 ) {
135 System.out.println ( "NOT Radial Image Data" ) ;
136 return ( false ) ;
137 }
138
139 int skipLength = productDescriptionBlock.OffsetToSymbology* 2 - 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 <= 0 ) {
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 > 0 ) { //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 }
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 <= 0 ) {
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 <= 0 ) {
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 > 0 ) { //其它尚未支持的数据格式
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 <= 0 ) {
135 System.out.println ( "NOT Radial Image Data" ) ;
136 return ( false ) ;
137 }
138
139 int skipLength = productDescriptionBlock.OffsetToSymbology* 2 - 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 <= 0 ) {
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 > 0 ) { //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 }