Doppler产品数据格式(SymbologyImage)

本文介绍了一种处理多普勒雷达产品数据的Java类SymbologyImage,该类能够读取并解析雷达扫描(Radial)和栅格(Raster)产品数据。通过MessageHeaderBlock、ProductDescriptionBlock等组件实现数据的加载与处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本页包含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 fnamethrows 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 ifproductSymbologyLayerBlock[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 finthrows 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 ifproductSymbologyLayerBlock[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, 0false);
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, 0false);
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         ifbuf.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, 0false);
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, 0false);
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+ 62);
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 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值