diff --git a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/ChartPanel.java b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/ChartPanel.java index 1ca394db..6b24049f 100644 --- a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/ChartPanel.java +++ b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/ChartPanel.java @@ -1298,6 +1298,11 @@ public class ChartPanel extends JPanel implements IChartPanel{ DocPrintJob job = service.createPrintJob(); PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet(); job.print(doc, attributes); + + if (sleep != null) { + Thread.sleep(sleep * 1000); + } + out.close(); } } else if (aFile.endsWith(".eps")) { @@ -1308,6 +1313,11 @@ public class ChartPanel extends JPanel implements IChartPanel{ g.startExport(); //this.paintGraphics(g); this.paintGraphics(g, width, height); + + if (sleep != null) { + Thread.sleep(sleep * 1000); + } + g.endExport(); g.dispose(); } else if (aFile.endsWith(".pdf")) { @@ -1319,6 +1329,11 @@ public class ChartPanel extends JPanel implements IChartPanel{ PdfTemplate pdfTemp = cb.createTemplate(width, height); Graphics2D g2 = new PdfGraphics2D(pdfTemp, width, height, true); this.paintGraphics(g2, width, height); + + if (sleep != null) { + Thread.sleep(sleep * 1000); + } + g2.dispose(); cb.addTemplate(pdfTemp, 0, 0); document.close(); @@ -1331,6 +1346,11 @@ public class ChartPanel extends JPanel implements IChartPanel{ g.startExport(); //this.paintGraphics(g); this.paintGraphics(g, width, height); + + if (sleep != null) { + Thread.sleep(sleep * 1000); + } + g.endExport(); g.dispose(); } else { diff --git a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/GLChartPanel.java b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/GLChartPanel.java index 292a1e40..f6438b2a 100644 --- a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/GLChartPanel.java +++ b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/GLChartPanel.java @@ -1345,6 +1345,11 @@ public class GLChartPanel extends GLJPanel implements IChartPanel{ DocPrintJob job = service.createPrintJob(); PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet(); job.print(doc, attributes); + + if (sleep != null) { + Thread.sleep(sleep * 1000); + } + out.close(); } } else if (aFile.endsWith(".eps")) { @@ -1355,6 +1360,11 @@ public class GLChartPanel extends GLJPanel implements IChartPanel{ g.startExport(); //this.paintGraphics(g); this.paintGraphics(g, width, height); + + if (sleep != null) { + Thread.sleep(sleep * 1000); + } + g.endExport(); g.dispose(); } else if (aFile.endsWith(".pdf")) { @@ -1366,6 +1376,11 @@ public class GLChartPanel extends GLJPanel implements IChartPanel{ PdfTemplate pdfTemp = cb.createTemplate(width, height); Graphics2D g2 = new PdfGraphics2D(pdfTemp, width, height, true); this.paintGraphics(g2, width, height); + + if (sleep != null) { + Thread.sleep(sleep * 1000); + } + g2.dispose(); cb.addTemplate(pdfTemp, 0, 0); document.close(); @@ -1378,6 +1393,11 @@ public class GLChartPanel extends GLJPanel implements IChartPanel{ g.startExport(); //this.paintGraphics(g); this.paintGraphics(g, width, height); + + if (sleep != null) { + Thread.sleep(sleep * 1000); + } + g.endExport(); g.dispose(); } else { diff --git a/meteoinfo-common/src/main/java/org/meteoinfo/common/util/GlobalUtil.java b/meteoinfo-common/src/main/java/org/meteoinfo/common/util/GlobalUtil.java index ebbf4444..cd634fd9 100644 --- a/meteoinfo-common/src/main/java/org/meteoinfo/common/util/GlobalUtil.java +++ b/meteoinfo-common/src/main/java/org/meteoinfo/common/util/GlobalUtil.java @@ -67,7 +67,7 @@ import java.util.zip.ZipInputStream; public static String getVersion(){ String version = GlobalUtil.class.getPackage().getImplementationVersion(); if (version == null || version.equals("")) { - version = "3.6.2"; + version = "3.6.3"; } return version; } diff --git a/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/radar/CMARadarBaseDataInfo.java b/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/radar/CMARadarBaseDataInfo.java index a3f8befc..34682973 100644 --- a/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/radar/CMARadarBaseDataInfo.java +++ b/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/radar/CMARadarBaseDataInfo.java @@ -39,6 +39,46 @@ public class CMARadarBaseDataInfo extends DataInfo implements IGridDataInfo { }).collect(Collectors.toMap(data -> (Integer) data[0], data -> (String) data[1])); private Map recordMap = new HashMap<>(); + /** + * Get generic header + * @return Generic header + */ + public GenericHeader getGenericHeader() { + return this.genericHeader; + } + + /** + * Get site config + * @return Site config + */ + public SiteConfig getSiteConfig() { + return this.siteConfig; + } + + /** + * Get task config + * @return Task config + */ + public TaskConfig getTaskConfig() { + return this.taskConfig; + } + + /** + * Get cut config list + * @return Cut config list + */ + public List getCutConfigs() { + return this.cutConfigs; + } + + /** + * Get record map + * @return Record map + */ + public Map getRecordMap() { + return this.recordMap; + } + @Override public GridArray getGridArray(String varName) { return null; @@ -184,7 +224,7 @@ public class CMARadarBaseDataInfo extends DataInfo implements IGridDataInfo { } else { record = new RadialRecord(product); record.setBinLength(momentHeader.binLength); - record.scale = momentHeader.scale;; + record.scale = momentHeader.scale; record.offset = momentHeader.offset; this.recordMap.put(product, record); } @@ -232,6 +272,7 @@ public class CMARadarBaseDataInfo extends DataInfo implements IGridDataInfo { this.addAttribute(new Attribute("StationLongitude", siteConfig.longitude)); this.addAttribute(new Attribute("AntennaHeight", siteConfig.antennaHeight)); this.addAttribute(new Attribute("GroundHeight", siteConfig.groundHeight)); + this.addAttribute(new Attribute("RadarType", siteConfig.getRadarType())); //Read radial data taskConfig = new TaskConfig(raf); diff --git a/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/radar/SiteConfig.java b/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/radar/SiteConfig.java index af5ad8bb..ddb8ec62 100644 --- a/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/radar/SiteConfig.java +++ b/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/radar/SiteConfig.java @@ -111,4 +111,51 @@ public class SiteConfig { reserved = new byte[46]; raf.read(reserved); } + + /** + * Get radar type string + * @return Radar type string + */ + public String getRadarType() { + switch (radarType) { + case 1: + return "SA"; + case 2: + return "SB"; + case 3: + return "SC"; + case 4: + return "SAD"; + case 5: + return "SBD"; + case 6: + return "SCD"; + case 33: + return "CA"; + case 34: + return "CB"; + case 35: + return "CC"; + case 36: + return "CCJ"; + case 37: + return "CD"; + case 38: + return "CAD"; + case 39: + return "CBD"; + case 40: + return "CCD"; + case 41: + return "CCJD"; + case 42: + return "CDD"; + case 65: + return "XA"; + case 66: + return "XAD"; + default: + return "UNDEFINE"; + } + } } diff --git a/meteoinfo-lab/milconfig.xml b/meteoinfo-lab/milconfig.xml index c27edf08..bef515da 100644 --- a/meteoinfo-lab/milconfig.xml +++ b/meteoinfo-lab/milconfig.xml @@ -1,36 +1,34 @@ - - - - - - + - + + + + + + - - - + + - - - + + @@ -38,5 +36,5 @@
- + diff --git a/meteoinfo-lab/pylib/mipylib/dataset/arldatafile.py b/meteoinfo-lab/pylib/mipylib/dataset/arldatafile.py new file mode 100644 index 00000000..0b0c7fa2 --- /dev/null +++ b/meteoinfo-lab/pylib/mipylib/dataset/arldatafile.py @@ -0,0 +1,117 @@ + +from .dimdatafile import DimDataFile + + +class ARLDataFile(DimDataFile): + + def __init__(self, dataset=None, access='r', arldata=None): + self.dataset = dataset + self.access = access + self._variables = [] + if not dataset is None: + self.filename = dataset.getFileName() + for v in dataset.getDataInfo().getVariables(): + self._variables.append(DimVariable(v)) + self.nvar = dataset.getDataInfo().getVariableNum() + self.fill_value = dataset.getMissingValue() + self.proj = dataset.getProjectionInfo() + self.arldata = arldata + + # Write ARL data + def setx(self, x): + """ + Set x (longitude) dimension value. + + :param x: (*array_like*) X dimension value. + """ + self.arldata.setX(x.aslist()) + + def sety(self, y): + """ + Set y (latitude) dimension value. + + :param y: (*array_like*) Y dimension value. + """ + self.arldata.setY(y.aslist()) + + def setlevels(self, levels, add_ground=True): + """ + Set vertical levels. + + :param levels: (*list*) Vertical levels. + :param add_ground: (*bool*) Whether add ground level. Default is `True`. + """ + if isinstance(levels, np.NDArray): + levels = levels.aslist() + if add_ground: + levels.insert(0, 1) + self.arldata.levels = levels + + def set2dvar(self, vnames): + """ + Set surface variables (2 dimensions ignore time dimension). + + :param vnames: (*list*) Variable names. + """ + self.arldata.LevelVarList.add(vnames) + + def set3dvar(self, vnames): + """ + Set level variables (3 dimensions ignore time dimension). + + :param vnames: (*list*) Variable names. + """ + self.arldata.LevelVarList.add(vnames) + + def getdatahead(self, proj, model, vertical, icx=0, mn=0): + """ + Get data head. + + :param proj: (*ProjectionInfo*) Projection information. + :param model: (*string*) Model name with 4 characters. + :param vertical: (*int*) Vertical coordinate system flag. 1-sigma (fraction); + 2-pressure (mb); 3-terrain (fraction); 4-hybrid (mb: offset.fraction) + :param icx: (*int*) Forecast hour (>99 the header forecast hr = 99) + :param mn: (*int*) Minutes associated with data time. + """ + return self.arldata.getDataHead(proj, model, vertical, icx, mn) + + def diff_origin_pack(self, data): + """ + Get difference between the original data and the packed data. + :param data: (*array*) The original data. + :return: (*array*) Difference. + """ + r = self.arldata.diffOriginPack(data._array) + return np.NDArray(r) + + def writeindexrec(self, t, datahead, ksums=None): + """ + Write index record. + + :param t: (*datatime*) The time of the data. + :param datahead: (*DataHeader') Data header of the record. + :param ksums: (*list*) Check sum list. + """ + t = miutil.jdate(t) + self.arldata.writeIndexRecord(t, datahead, ksums) + + def writedatarec(self, t, lidx, vname, fhour, grid, data): + """ + Write data record. + + :param t: (*datetime*) The time of the data. + :param lidx: (*int*) Level index. + :param vname: (*string*) Variable name. + :param fhour: (*int*) Forecasting hour. + :param grid: (*int*) Grid id to check if the data grid is bigger than 999. Header + record does not support grids of more than 999, therefore in those situations + the grid number is converted to character to represent the 1000s digit, + e.g. @(64)=<1000, A(65)=1000, B(66)=2000, etc. + :param data: (*array_like*) Data array. + + :returns: (*int*) Check sum of the record data. + """ + t = miutil.jdate(t) + ksum = self.arldata.writeGridData(t, lidx, vname, fhour, grid, data.asarray()) + return ksum \ No newline at end of file diff --git a/meteoinfo-lab/pylib/mipylib/numeric/core/fromnumeric$py.class b/meteoinfo-lab/pylib/mipylib/numeric/core/fromnumeric$py.class index c6222f24..842e057d 100644 Binary files a/meteoinfo-lab/pylib/mipylib/numeric/core/fromnumeric$py.class and b/meteoinfo-lab/pylib/mipylib/numeric/core/fromnumeric$py.class differ diff --git a/meteoinfo-lab/pylib/mipylib/numeric/core/fromnumeric.py b/meteoinfo-lab/pylib/mipylib/numeric/core/fromnumeric.py index 35572adf..3f5dc02f 100644 --- a/meteoinfo-lab/pylib/mipylib/numeric/core/fromnumeric.py +++ b/meteoinfo-lab/pylib/mipylib/numeric/core/fromnumeric.py @@ -5,7 +5,8 @@ from ._ndarray import NDArray from .dimarray import DimArray from org.meteoinfo.ndarray.math import ArrayUtil, ArrayMath -__all__ = ['cumprod', 'cumsum', 'ndim', 'nonzero', 'prod', 'ravel', 'searchsorted', 'sum'] +__all__ = ['cumprod', 'cumsum', 'ndim', 'nonzero', 'prod', 'ravel', 'searchsorted', 'sum', + 'where'] def ndim(a): @@ -80,6 +81,19 @@ def nonzero(a): return tuple(r) +def where(condition): + """ + Return elements, either from x or y, depending on condition. + + If only condition is given, return condition.nonzero(). + + :param condition: (*array_like*) Input array. + + :returns: (*tuple*) Indices of elements that are non-zero. + """ + return nonzero(condition) + + def searchsorted(a, v, side='left', sorter=None): """ Find indices where elements should be inserted to maintain order. diff --git a/meteoinfo-lab/pylib/mipylib/numeric/core/multiarray$py.class b/meteoinfo-lab/pylib/mipylib/numeric/core/multiarray$py.class index eaecf7a9..885788b8 100644 Binary files a/meteoinfo-lab/pylib/mipylib/numeric/core/multiarray$py.class and b/meteoinfo-lab/pylib/mipylib/numeric/core/multiarray$py.class differ diff --git a/meteoinfo-lab/pylib/mipylib/numeric/core/multiarray.py b/meteoinfo-lab/pylib/mipylib/numeric/core/multiarray.py index b1a28df2..69fd73ff 100644 --- a/meteoinfo-lab/pylib/mipylib/numeric/core/multiarray.py +++ b/meteoinfo-lab/pylib/mipylib/numeric/core/multiarray.py @@ -5,10 +5,9 @@ multiarray module from org.meteoinfo.ndarray.math import ArrayMath from ._ndarray import NDArray -from .fromnumeric import nonzero from ._exceptions import AxisError -__all__ = ['normalize_axis_index','where','bincount'] +__all__ = ['normalize_axis_index','bincount'] def normalize_axis_index(axis, ndim, msg_prefix=None): """ @@ -33,18 +32,6 @@ def normalize_axis_index(axis, ndim, msg_prefix=None): else: raise AxisError(axis, ndim, msg_prefix) -def where(condition): - """ - Return elements, either from x or y, depending on condition. - - If only condition is given, return condition.nonzero(). - - :param condition: (*array_like*) Input array. - - :returns: (*tuple*) Indices of elements that are non-zero. - """ - return nonzero(condition) - def bincount(x, weights=None, minlength=0): """ Count number of occurrences of each value in array of non-negative ints. diff --git a/meteoinfo-lab/pylib/mipylib/numeric/lib/format.py b/meteoinfo-lab/pylib/mipylib/numeric/lib/format.py index c0e82df0..cf875387 100644 --- a/meteoinfo-lab/pylib/mipylib/numeric/lib/format.py +++ b/meteoinfo-lab/pylib/mipylib/numeric/lib/format.py @@ -27,13 +27,16 @@ def _check_version(version): def magic(major, minor): """ Return the magic string for the given file format version. + Parameters ---------- major : int in [0, 255] minor : int in [0, 255] + Returns ------- magic : str + Raises ------ ValueError if the version cannot be formatted.