本页包含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 }