From 37849a4f468189ad99455da89d6261cfbfc3cfe5 Mon Sep 17 00:00:00 2001 From: wyq Date: Fri, 21 Jul 2023 17:06:02 +0800 Subject: [PATCH] bugfix for MapPlot parent type --- .../main/java/org/meteoinfo/chart/Chart.java | 4 +- .../java/org/meteoinfo/chart/ChartPanel.java | 35 +++--- .../org/meteoinfo/chart/GLChartPanel.java | 1 + .../java/org/meteoinfo/chart/IChartPanel.java | 4 + .../org/meteoinfo/chart/form/ChartForm.java | 2 +- .../meteoinfo/chart/jogl/GLChartPanel.java | 6 + .../org/meteoinfo/chart/plot/MapPlot.java | 4 +- .../meteoinfo/console/jython/JythonUtil.java | 32 +++-- .../data/meteodata/MeteoDataType.java | 1 + .../meteodata/radar/CMARadarBaseDataInfo.java | 76 ++++++++++-- .../data/meteodata/radar/RadialRecord.java | 41 +----- .../data/meteodata/radar/Transform.java | 69 +++++++++++ .../geo/analysis/GeoComputation.java | 46 +++---- meteoinfo-lab/milconfig.xml | 14 ++- meteoinfo-lab/pom.xml | 16 ++- .../pylib/mipylib/dataset/arldatafile.py | 11 +- .../pylib/mipylib/dataset/bufrdatafile.py | 117 ++++++++++++++++++ .../pylib/mipylib/dataset/midata$py.class | Bin 56582 -> 57066 bytes meteoinfo-lab/pylib/mipylib/dataset/midata.py | 16 ++- .../pylib/mipylib/dataset/radardatafile.py | 30 +++++ .../mipylib/numeric/core/numeric$py.class | Bin 153563 -> 153562 bytes .../pylib/mipylib/numeric/core/numeric.py | 6 +- .../mipylib/numeric/lib/function_base.py | 51 +++++++- .../pylib/mipylib/plotlib/_glfigure$py.class | Bin 41618 -> 41763 bytes .../pylib/mipylib/plotlib/_glfigure.py | 11 +- .../org/meteoinfo/lab/gui/FigureDockable.java | 2 +- 26 files changed, 452 insertions(+), 143 deletions(-) create mode 100644 meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/radar/Transform.java create mode 100644 meteoinfo-lab/pylib/mipylib/dataset/bufrdatafile.py create mode 100644 meteoinfo-lab/pylib/mipylib/dataset/radardatafile.py diff --git a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/Chart.java b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/Chart.java index 5ecb795b..c75c800b 100644 --- a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/Chart.java +++ b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/Chart.java @@ -877,9 +877,9 @@ public class Chart { * @param plot Plot */ public void addPlot(Plot plot) { - /*if (plot instanceof MapPlot) { + if (plot instanceof MapPlot) { ((MapPlot) plot).setParent(parent); - }*/ + } this.plots.add(plot); } 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 6b24049f..c3c999fd 100644 --- a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/ChartPanel.java +++ b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/ChartPanel.java @@ -582,29 +582,26 @@ public class ChartPanel extends JPanel implements IChartPanel{ if (this.chart != null) { Graphics2D g = this.mapBitmap.createGraphics(); - Rectangle2D chartArea; - if (this.chartSize == null) { - chartArea = new Rectangle2D.Double(0.0, 0.0, this.mapBitmap.getWidth(), this.mapBitmap.getHeight()); - } else { - chartArea = new Rectangle2D.Double(0.0, 0.0, this.chartSize.width, this.chartSize.height); - } + Rectangle2D chartArea = new Rectangle2D.Double(0.0, 0.0, width, height); this.chart.draw(g, chartArea); } this.repaint(); } public void paintGraphics(Graphics2D g) { - if (this.chart != null) { - Rectangle2D chartArea; - if (this.chartSize == null) { - chartArea = new Rectangle2D.Double(0.0, 0.0, this.getWidth(), this.getHeight()); - } else { - chartArea = new Rectangle2D.Double(0.0, 0.0, this.chartSize.width, this.chartSize.height); - } - this.chart.draw(g, chartArea); + int width, height; + if (this.chartSize != null) { + height = this.chartSize.height; + width = this.chartSize.width; + } else { + width = this.getWidth(); + height = this.getHeight(); } + + paintGraphics(g, width, height); } + @Override public void paintGraphics(Graphics2D g, int width, int height) { if (this.chart != null) { Rectangle2D chartArea; @@ -614,11 +611,13 @@ public class ChartPanel extends JPanel implements IChartPanel{ } void onComponentResized(ComponentEvent e) { - if (!loading) { - if (this.getWidth() > 0 && this.getHeight() > 0) { - if (this.chart != null) { - //this.paintGraphics(); + if (this.getWidth() > 0 && this.getHeight() > 0) { + if (this.chart != null) { + if (this.chart.hasWebMap()) { this.repaintNew(); + } else { + if (!loading) + this.repaintNew(); } } } 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 f6438b2a..ded8966f 100644 --- a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/GLChartPanel.java +++ b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/GLChartPanel.java @@ -618,6 +618,7 @@ public class GLChartPanel extends GLJPanel implements IChartPanel{ } } + @Override public void paintGraphics(Graphics2D g, int width, int height) { if (this.chart != null) { Rectangle2D chartArea; diff --git a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/IChartPanel.java b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/IChartPanel.java index ef559094..479305d2 100644 --- a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/IChartPanel.java +++ b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/IChartPanel.java @@ -5,6 +5,8 @@ */ package org.meteoinfo.chart; +import java.awt.*; + /** * * @author yaqiang @@ -43,4 +45,6 @@ public interface IChartPanel { * Paint graphics */ public abstract void paintGraphics(); + + public abstract void paintGraphics(Graphics2D g, int width, int height); } diff --git a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/form/ChartForm.java b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/form/ChartForm.java index c384c3b7..c55cc3b3 100644 --- a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/form/ChartForm.java +++ b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/form/ChartForm.java @@ -8,7 +8,7 @@ package org.meteoinfo.chart.form; import org.meteoinfo.chart.ChartPanel; import org.meteoinfo.chart.IChartPanel; import org.meteoinfo.chart.MouseMode; -import org.meteoinfo.chart.jogl.GLChartPanel; +import org.meteoinfo.chart.GLChartPanel; import javax.imageio.ImageIO; import java.awt.*; diff --git a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/jogl/GLChartPanel.java b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/jogl/GLChartPanel.java index ead2d264..af9423d8 100644 --- a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/jogl/GLChartPanel.java +++ b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/jogl/GLChartPanel.java @@ -28,6 +28,7 @@ import javax.imageio.stream.ImageOutputStream; import javax.swing.*; import java.awt.*; import java.awt.event.*; +import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; @@ -806,6 +807,11 @@ public class GLChartPanel extends GLJPanel implements IChartPanel { this.repaint(); } + @Override + public void paintGraphics(Graphics2D g, int width, int height) { + + } + /** * Override repaint method */ diff --git a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/plot/MapPlot.java b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/plot/MapPlot.java index 38b019cd..0a2d05cb 100644 --- a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/plot/MapPlot.java +++ b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/plot/MapPlot.java @@ -56,7 +56,7 @@ public class MapPlot extends AbstractPlot2D implements IWebMapPanel { private boolean antialias; private MapLayer selectedLayer; protected TileLoadListener tileLoadListener = new TileLoadListener(this); - private GLChartPanel parent; + private IChartPanel parent; private float[] lonLim; private float[] latLim; private Graphic boundary; @@ -127,7 +127,7 @@ public class MapPlot extends AbstractPlot2D implements IWebMapPanel { * * @param value ChartPanel */ - public void setParent(GLChartPanel value) { + public void setParent(IChartPanel value) { this.parent = value; } diff --git a/meteoinfo-console/src/main/java/org/meteoinfo/console/jython/JythonUtil.java b/meteoinfo-console/src/main/java/org/meteoinfo/console/jython/JythonUtil.java index 175e73ef..448488ba 100644 --- a/meteoinfo-console/src/main/java/org/meteoinfo/console/jython/JythonUtil.java +++ b/meteoinfo-console/src/main/java/org/meteoinfo/console/jython/JythonUtil.java @@ -1,5 +1,6 @@ package org.meteoinfo.console.jython; +import org.checkerframework.checker.units.qual.C; import org.meteoinfo.ndarray.Array; import org.meteoinfo.ndarray.Complex; import org.meteoinfo.ndarray.DataType; @@ -27,15 +28,7 @@ public class JythonUtil { * @return ArrayComplex */ public static Array toComplexArray(List data) { - if (data.get(0) instanceof PyComplex) { - Array a = Array.factory(DataType.COMPLEX, new int[]{data.size()}); - PyComplex pd; - for (int i = 0; i < data.size(); i++) { - pd = (PyComplex)data.get(i); - a.setObject(i, new Complex(pd.real, pd.imag)); - } - return a; - } else if (data.get(0) instanceof List) { + if (data.get(0) instanceof List) { int ndim = data.size(); int len = ((List) data.get(0)).size(); Array a = Array.factory(DataType.COMPLEX, new int[]{ndim, len}); @@ -43,13 +36,28 @@ public class JythonUtil { for (int i = 0; i < ndim; i++) { List d = (List) data.get(i); for (int j = 0; j < len; j++) { - pd = (PyComplex) d.get(j); - a.setObject(i * len + j, new Complex(pd.real, pd.imag)); + if (d.get(j) instanceof PyComplex) { + pd = (PyComplex) d.get(j); + a.setComplex(i * len + j, new Complex(pd.real, pd.imag)); + } else { + a.setComplex(i * len + j, new Complex((double) d.get(j), 0)); + } + } + } + return a; + } else { + Array a = Array.factory(DataType.COMPLEX, new int[]{data.size()}); + PyComplex pd; + for (int i = 0; i < data.size(); i++) { + if (data.get(i) instanceof PyComplex) { + pd = (PyComplex) data.get(i); + a.setComplex(i, new Complex(pd.real, pd.imag)); + } else { + a.setComplex(i, new Complex((double) data.get(i), 0)); } } return a; } - return null; } } diff --git a/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/MeteoDataType.java b/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/MeteoDataType.java index b687ae3a..4feec290 100644 --- a/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/MeteoDataType.java +++ b/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/MeteoDataType.java @@ -51,6 +51,7 @@ public enum MeteoDataType { MM5IM, GEOTIFF, BIL, + RADAR, NULL; /** 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 34682973..7b857f51 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 @@ -6,10 +6,7 @@ import org.meteoinfo.data.GridArray; import org.meteoinfo.data.GridData; import org.meteoinfo.data.dimarray.Dimension; import org.meteoinfo.data.dimarray.DimensionType; -import org.meteoinfo.data.meteodata.Attribute; -import org.meteoinfo.data.meteodata.DataInfo; -import org.meteoinfo.data.meteodata.IGridDataInfo; -import org.meteoinfo.data.meteodata.Variable; +import org.meteoinfo.data.meteodata.*; import org.meteoinfo.ndarray.*; import org.meteoinfo.ndarray.math.ArrayMath; import org.meteoinfo.ndarray.math.ArrayUtil; @@ -17,6 +14,8 @@ import org.meteoinfo.ndarray.math.ArrayUtil; import java.awt.image.ImagingOpException; import java.io.*; import java.nio.ByteOrder; +import java.nio.file.Files; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -30,14 +29,22 @@ public class CMARadarBaseDataInfo extends DataInfo implements IGridDataInfo { private SiteConfig siteConfig; private TaskConfig taskConfig; private List cutConfigs; - private Map productMap = Stream.of(new Object[][]{{1,"dBT"}, {2,"dBZ"}, + private List radialHeaders; + private final Map productMap = Stream.of(new Object[][]{{1,"dBT"}, {2,"dBZ"}, {3,"V"}, {4,"W"}, {5,"SQI"}, {6,"CPA"}, {7,"ZDR"}, {8,"LDR"}, {9,"CC"}, {10,"PhiDP"}, {11,"KDP"}, {12,"CP"}, {13,"Flag"}, {14,"HCL"}, {15,"CF"}, {16,"SNRH"}, {17,"SNRV"}, {18,"Flag"}, {19,"Flag"}, {20,"Flag"}, {21,"Flag"}, {22,"Flag"}, {23,"Flag"}, {24,"Flag"}, {25,"Flag"}, {26,"Flag"}, {27,"Flag"}, {28,"Flag"}, {29,"Flag"}, {30,"Flag"}, {31,"Flag"}, {32,"Zc"}, {33,"Vc"}, {34,"Wc"}, {35,"ZDRc"}, {0,"Flag"} }).collect(Collectors.toMap(data -> (Integer) data[0], data -> (String) data[1])); - private Map recordMap = new HashMap<>(); + private final Map recordMap = new HashMap<>(); + + /** + * Constructor + */ + public CMARadarBaseDataInfo() { + this.meteoDataType = MeteoDataType.RADAR; + } /** * Get generic header @@ -71,6 +78,14 @@ public class CMARadarBaseDataInfo extends DataInfo implements IGridDataInfo { return this.cutConfigs; } + /** + * Get radial header list + * @return Radial header list + */ + public List getRadialHeaders() { + return this.radialHeaders; + } + /** * Get record map * @return Record map @@ -155,7 +170,7 @@ public class CMARadarBaseDataInfo extends DataInfo implements IGridDataInfo { try { byte[] bytes = new byte[4]; if (fileName.endsWith("bz2")) { - BZip2CompressorInputStream inputStream = new BZip2CompressorInputStream(new FileInputStream(fileName)); + BZip2CompressorInputStream inputStream = new BZip2CompressorInputStream(Files.newInputStream(Paths.get(fileName))); inputStream.read(bytes); } else { RandomAccessFile raf = new RandomAccessFile(fileName, "r"); @@ -178,7 +193,7 @@ public class CMARadarBaseDataInfo extends DataInfo implements IGridDataInfo { this.fileName = fileName; if (fileName.endsWith(".bz2")) { try { - BZip2CompressorInputStream inputStream = new BZip2CompressorInputStream(new FileInputStream(fileName)); + BZip2CompressorInputStream inputStream = new BZip2CompressorInputStream(Files.newInputStream(Paths.get(fileName))); readDataInfo(inputStream); } catch (IOException e) { throw new RuntimeException(e); @@ -212,7 +227,7 @@ public class CMARadarBaseDataInfo extends DataInfo implements IGridDataInfo { for (int i = 0; i < taskConfig.cutNumber; i++) { cutConfigs.add(new CutConfig(raf)); } - List radialHeaders = new ArrayList<>(); + radialHeaders = new ArrayList<>(); while (raf.length() - raf.getFilePointer() > RadialHeader.length) { RadialHeader radialHeader = new RadialHeader(raf); for (int i = 0; i < radialHeader.momentNumber; i++) { @@ -280,7 +295,7 @@ public class CMARadarBaseDataInfo extends DataInfo implements IGridDataInfo { for (int i = 0; i < taskConfig.cutNumber; i++) { cutConfigs.add(new CutConfig(raf)); } - List radialHeaders = new ArrayList<>(); + radialHeaders = new ArrayList<>(); byte[] rhBytes = new byte[RadialHeader.length]; while (raf.read(rhBytes) != -1) { RadialHeader radialHeader = new RadialHeader(rhBytes); @@ -329,6 +344,47 @@ public class CMARadarBaseDataInfo extends DataInfo implements IGridDataInfo { } } + /** + * Get product names + * @return product names + */ + public List getProducts() { + List products = new ArrayList<>(); + for (String product : this.recordMap.keySet()) { + products.add(product); + } + + return products; + } + + /** + * Get scan elevations + * @return Scan elevations + */ + public List getElevations() { + List elevations = new ArrayList<>(); + for (CutConfig cutConfig : this.cutConfigs) { + if (!elevations.contains(cutConfig.elevation)) + elevations.add(cutConfig.elevation); + } + + return elevations; + } + + /** + * Get scan elevations + * @return Scan elevations + */ + public List getElevations(String product) { + RadialRecord radialRecord = this.recordMap.get(product); + List elevations = new ArrayList<>(); + for (List elist : radialRecord.elevation) { + elevations.add(elist.get(0)); + } + + return elevations; + } + @Override public Array read(String varName) { Variable var = this.getVariable(varName); diff --git a/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/radar/RadialRecord.java b/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/radar/RadialRecord.java index 5b8fc939..42fc9c9a 100644 --- a/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/radar/RadialRecord.java +++ b/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/radar/RadialRecord.java @@ -23,7 +23,7 @@ public class RadialRecord { public List> elevation = new ArrayList<>(); public List> azimuth = new ArrayList<>(); public List distance = new ArrayList<>(); - private List> data = new ArrayList<>(); + private final List> data = new ArrayList<>(); /** * Constructor @@ -114,43 +114,6 @@ public class RadialRecord { return this.data.get(scanIdx); } - /** - * Convert antenna coordinate to cartesian coordinate - * @param r Distances to the center of the radar gates (bins) in meters - * @param a Azimuth angle of the radar in radians - * @param e Elevation angle of the radar in radians - * @return Cartesian coordinate in meters from the radar - */ - public double[] antennaToCartesian(float r, float a, float e) { - double R = 6371.0 * 1000.0 * 4.0 / 3.0; // effective radius of earth in meters. - - double z = Math.pow(r * r + R * R + 2.0 * r * R * Math.sin(e), 0.5) - R; - double s = R * Math.asin(r * Math.cos(e) / (R + z)); // arc length in m. - double x = s * Math.sin(a); - double y = s * Math.cos(a); - - return new double[]{x, y, z}; - } - - /** - * Convert antenna coordinate to cartesian coordinate - * @param r Distances to the center of the radar gates (bins) in meters - * @param a Azimuth angle of the radar in radians - * @param e Elevation angle of the radar in radians - * @param h Altitude of the instrument, above sea level, units:m - * @return Cartesian coordinate in meters from the radar - */ - public double[] antennaToCartesian(float r, float a, float e, float h) { - double R = 6371.0 * 1000.0 * 4.0 / 3.0; // effective radius of earth in meters. - - double z = Math.pow(Math.pow(r * Math.cos(e), 2) + Math.pow(R + h + r * Math.sin(e), 2), 0.5) - R; - double s = R * Math.asin(r * Math.cos(e) / (R + z)); // arc length in m. - double x = s * Math.sin(a); - double y = s * Math.cos(a); - - return new double[]{x, y, z}; - } - /** * Get XYZ data array * @param scanIdx The scan index @@ -171,7 +134,7 @@ public class RadialRecord { a = (float) Math.toRadians(azi.get(i)); e = (float) Math.toRadians(ele.get(i)); for (int j = 0; j < nx; j++) { - xyz = antennaToCartesian(dis.getFloat(j), a, e); + xyz = Transform.antennaToCartesian(dis.getFloat(j), a, e); index.set(0, i, j); r.setFloat(index, (float) xyz[0]); index.set(1, i, j); diff --git a/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/radar/Transform.java b/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/radar/Transform.java new file mode 100644 index 00000000..caa8cf76 --- /dev/null +++ b/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/radar/Transform.java @@ -0,0 +1,69 @@ +package org.meteoinfo.data.meteodata.radar; + +import org.meteoinfo.ndarray.math.ArrayMath; + +public class Transform { + + static double R = 6371.0 * 1000.0 * 4.0 / 3.0; // effective radius of earth in meters. + + /** + * Convert antenna coordinate to cartesian coordinate + * @param r Distances to the center of the radar gates (bins) in meters + * @param a Azimuth angle of the radar in radians + * @param e Elevation angle of the radar in radians + * @return Cartesian coordinate in meters from the radar + */ + public static double[] antennaToCartesian(float r, float a, float e) { + double z = Math.pow(r * r + R * R + 2.0 * r * R * Math.sin(e), 0.5) - R; + double s = R * Math.asin(r * Math.cos(e) / (R + z)); // arc length in m. + double x = s * Math.sin(a); + double y = s * Math.cos(a); + + return new double[]{x, y, z}; + } + + /** + * Convert antenna coordinate to cartesian coordinate + * @param r Distances to the center of the radar gates (bins) in meters + * @param a Azimuth angle of the radar in radians + * @param e Elevation angle of the radar in radians + * @param h Altitude of the instrument, above sea level, units:m + * @return Cartesian coordinate in meters from the radar + */ + public static double[] antennaToCartesian(float r, float a, float e, float h) { + double R = 6371.0 * 1000.0 * 4.0 / 3.0; // effective radius of earth in meters. + + double z = Math.pow(Math.pow(r * Math.cos(e), 2) + Math.pow(R + h + r * Math.sin(e), 2), 0.5) - R; + double s = R * Math.asin(r * Math.cos(e) / (R + z)); // arc length in m. + double x = s * Math.sin(a); + double y = s * Math.cos(a); + + return new double[]{x, y, z}; + } + + private static double azimuth(float x, float y) { + double az = Math.PI / 2 - Math.atan2(x + y, 1); + if (az < 0) { + az = 2 * Math.PI + az; + } + return Math.toDegrees(az); + } + + /** + * Convert cartesian coordinate to antenna coordinate + * @param x x coordinate in meters + * @param y y coordinate in meters + * @param z z coordinate in meters + * @param h Altitude of the instrument, above sea level, units:m + * @return Antenna coordinate from the radar + */ + public static double[] cartesianToAntenna(float x, float y, float z, float h) { + double ranges = Math.sqrt(Math.pow(R + h, 2) + Math.pow(R + z, 2) - 2 * (R + h) * (R + z) * + Math.cos(Math.sqrt(x * x + y * y) / R)); + double elevation = Math.acos((R + z) * Math.sin(Math.sqrt(x * x + y * y) / R) / ranges) * + 180. / Math.PI; + double azimuth = azimuth(x, y); + + return new double[]{azimuth, ranges, elevation}; + } +} diff --git a/meteoinfo-geo/src/main/java/org/meteoinfo/geo/analysis/GeoComputation.java b/meteoinfo-geo/src/main/java/org/meteoinfo/geo/analysis/GeoComputation.java index 3e97e4dd..650a9827 100644 --- a/meteoinfo-geo/src/main/java/org/meteoinfo/geo/analysis/GeoComputation.java +++ b/meteoinfo-geo/src/main/java/org/meteoinfo/geo/analysis/GeoComputation.java @@ -196,31 +196,33 @@ public class GeoComputation extends org.meteoinfo.geometry.geoprocess.GeoComputa } q1 = q2; } - GridLabel aGL = new GridLabel(); - aGL.setBorder(true); - aGL.setLongitude(isVertical); - aGL.setCoord(IPoint); - if (MIMath.doubleEquals(q1.X, borderList.get(j).Point.X)) { - if (MIMath.doubleEquals(q1.X, clipExtent.minX)) { - aGL.setLabDirection(Direction.Weast); + if (j < borderList.size()) { + GridLabel aGL = new GridLabel(); + aGL.setBorder(true); + aGL.setLongitude(isVertical); + aGL.setCoord(IPoint); + if (MIMath.doubleEquals(q1.X, borderList.get(j).Point.X)) { + if (MIMath.doubleEquals(q1.X, clipExtent.minX)) { + aGL.setLabDirection(Direction.Weast); + } else { + aGL.setLabDirection(Direction.East); + } } else { - aGL.setLabDirection(Direction.East); + if (MIMath.doubleEquals(q1.Y, clipExtent.minY)) { + aGL.setLabDirection(Direction.South); + } else { + aGL.setLabDirection(Direction.North); + } } - } else { - if (MIMath.doubleEquals(q1.Y, clipExtent.minY)) { - aGL.setLabDirection(Direction.South); - } else { - aGL.setLabDirection(Direction.North); - } - } - if (isVertical) { - if (aGL.getLabDirection() == Direction.South || aGL.getLabDirection() == Direction.North) { - gridLabels.add(aGL); - } - } else { - if (aGL.getLabDirection() == Direction.East || aGL.getLabDirection() == Direction.Weast) { - gridLabels.add(aGL); + if (isVertical) { + if (aGL.getLabDirection() == Direction.South || aGL.getLabDirection() == Direction.North) { + gridLabels.add(aGL); + } + } else { + if (aGL.getLabDirection() == Direction.East || aGL.getLabDirection() == Direction.Weast) { + gridLabels.add(aGL); + } } } diff --git a/meteoinfo-lab/milconfig.xml b/meteoinfo-lab/milconfig.xml index 446b21f2..e7420f4f 100644 --- a/meteoinfo-lab/milconfig.xml +++ b/meteoinfo-lab/milconfig.xml @@ -1,7 +1,6 @@ - @@ -14,6 +13,7 @@ + @@ -22,15 +22,17 @@ - - + + + - - + + + @@ -38,5 +40,5 @@
- + diff --git a/meteoinfo-lab/pom.xml b/meteoinfo-lab/pom.xml index 2542faef..a88d94e1 100644 --- a/meteoinfo-lab/pom.xml +++ b/meteoinfo-lab/pom.xml @@ -29,12 +29,16 @@ docking-frames-core 2.0.0 - + + org.slf4j + slf4j-api + 2.0.5 + + + org.slf4j + slf4j-simple + 2.0.5 + 1.8 diff --git a/meteoinfo-lab/pylib/mipylib/dataset/arldatafile.py b/meteoinfo-lab/pylib/mipylib/dataset/arldatafile.py index 0b0c7fa2..d231f242 100644 --- a/meteoinfo-lab/pylib/mipylib/dataset/arldatafile.py +++ b/meteoinfo-lab/pylib/mipylib/dataset/arldatafile.py @@ -5,16 +5,7 @@ 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() + super(ARLDataFile, self).__init__(dataset, access) self.arldata = arldata # Write ARL data diff --git a/meteoinfo-lab/pylib/mipylib/dataset/bufrdatafile.py b/meteoinfo-lab/pylib/mipylib/dataset/bufrdatafile.py new file mode 100644 index 00000000..75143c40 --- /dev/null +++ b/meteoinfo-lab/pylib/mipylib/dataset/bufrdatafile.py @@ -0,0 +1,117 @@ + +from .dimdatafile import DimDataFile + + +class BUFRDataFile(DimDataFile): + + def __init__(self, dataset=None, access='r', bufrdata=None): + super(BUFRDataFile, self).__init__(dataset, access) + self.bufrdata = bufrdata + + def write_indicator(self, bufrlen, edition=3): + """ + Write indicator section with arbitrary length. + + :param bufrlen: (*int*) The total length of the message. + :param edition: (*int*) Bruf edition. + + :returns: (*int*) Indicator section length. + """ + return self.bufrdata.writeIndicatorSection(bufrlen, edition) + + def rewrite_indicator(self, bufrlen, edition=3): + """ + Write indicator section with correct length. + + :param bufrlen: (*int*) The total length of the message. + :param edition: (*int*) Bruf edition. + """ + self.bufrdata.reWriteIndicatorSection(bufrlen, edition) + + def write_identification(self, **kwargs): + """ + Write identification section. + + :param length: (*int*) Section length + :param master_table: (*int*) Master table + :param subcenter_id: (*int*) Subcenter id + :param center_id: (*int*) Center id + :param update: (*int*) Update sequency + :param optional: (*int*) Optional + :param category: (*int*) Category + :param sub_category: (*int*) Sub category + :param master_table_version: (*int*) Master table version + :param local_table_version: (*int*) Local table version + :param year: (*int*) Year + :param month: (*int*) Month + :param day: (*int*) Day + :param hour: (*int*) Hour + :param minute: (*int*) Minute + + :returns: (*int*) Section length + """ + length = kwargs.pop('length', 18) + master_table = kwargs.pop('master_table', 0) + subcenter_id = kwargs.pop('subcenter_id', 0) + center_id = kwargs.pop('center_id', 74) + update = kwargs.pop('update', 0) + optional = kwargs.pop('optional', 0) + category = kwargs.pop('category', 7) + sub_category = kwargs.pop('sub_category', 0) + master_table_version = kwargs.pop('master_table_version', 11) + local_table_version = kwargs.pop('local_table_version', 1) + year = kwargs.pop('year', 2016) + month = kwargs.pop('month', 1) + day = kwargs.pop('day', 1) + hour = kwargs.pop('hour', 0) + minute = kwargs.pop('minute', 0) + return self.bufrdata.writeIdentificationSection(length, master_table, subcenter_id, center_id, \ + update, optional, category, sub_category, master_table_version, \ + local_table_version, year, month, day, hour, minute) + + def write_datadescription(self, n, datatype, descriptors): + """ + Write data description section + + :param n: (*int*) Numer of dataset. + :param datatype: (*int*) Data type. + :param descriptors: (*list*) Data descriptors. + """ + return self.bufrdata.writeDataDescriptionSection(n, datatype, descriptors) + + def write_datahead(self, len): + """ + Write data header with arbitrary data length. + + :param len: (*int*) Data section length. + + :returns: (*int*) Data section head length - always 4. + """ + return self.bufrdata.writeDataSectionHead(len) + + def rewrite_datahead(self, len): + """ + Write data header with correct data length. + + :param len: (*int*) Data section length. + """ + self.bufrdata.reWriteDataSectionHead(len) + + def write_data(self, value, nbits=None): + """ + Write data. + + :param value: (*int*) Value. + :param nbits: (*int*) Bit number. + + :returns: (*int*) Data value length. + """ + return self.bufrdata.write(value, nbits) + + def write_end(self): + """ + Write end section ('7777'). + + :returns: (*int*) End section length - always 4. + """ + return self.bufrdata.writeEndSection() \ No newline at end of file diff --git a/meteoinfo-lab/pylib/mipylib/dataset/midata$py.class b/meteoinfo-lab/pylib/mipylib/dataset/midata$py.class index ce41f947db5e235875b72dbd6c9e08c32fd67b05..8d5461ff8b1242c8a8bef24f1d36882057b757ba 100644 GIT binary patch literal 57066 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 G?*4z&ha=Dc diff --git a/meteoinfo-lab/pylib/mipylib/dataset/midata.py b/meteoinfo-lab/pylib/mipylib/dataset/midata.py index 69f59c5a..3c62d7d3 100644 --- a/meteoinfo-lab/pylib/mipylib/dataset/midata.py +++ b/meteoinfo-lab/pylib/mipylib/dataset/midata.py @@ -8,7 +8,7 @@ import os import datetime -from org.meteoinfo.data.meteodata import MeteoDataInfo +from org.meteoinfo.data.meteodata import MeteoDataInfo, MeteoDataType from org.meteoinfo.ndarray import DataType from org.meteoinfo.data.dimarray import Dimension, DimensionType from org.meteoinfo.data.meteodata.arl import ARLDataInfo @@ -24,6 +24,9 @@ import mipylib.miutil as miutil from mipylib.numeric.core import NDArray, DimArray, PyTableData from dimdatafile import DimDataFile, DimDataFiles +from arldatafile import ARLDataFile +from bufrdatafile import BUFRDataFile +from radardatafile import RadarDataFile import mipylib.migl as migl __all__ = [ @@ -113,13 +116,16 @@ def addfile(fname, access='r', dtype='netcdf', keepopen=False, **kwargs): meteodata = MeteoDataInfo() meteodata.openData(fname, keepopen) - datafile = DimDataFile(meteodata, access=access) + if meteodata.getDataInfo().getDataType() == MeteoDataType.RADAR: + datafile = RadarDataFile(meteodata, access=access) + else: + datafile = DimDataFile(meteodata, access=access) return datafile elif access == 'c': if dtype == 'arl': arldata = ARLDataInfo() arldata.createDataFile(fname) - datafile = DimDataFile(arldata=arldata) + datafile = ARLDataFile(arldata=arldata) elif dtype == 'bufr': bufrdata = BufrDataInfo() if os.path.exists(fname): @@ -127,9 +133,9 @@ def addfile(fname, access='r', dtype='netcdf', keepopen=False, **kwargs): os.remove(fname) except: info=sys.exc_info() - print info[0],":",info[1] + print(info[0],":",info[1]) bufrdata.createDataFile(fname) - datafile = DimDataFile(bufrdata=bufrdata) + datafile = BUFRDataFile(bufrdata=bufrdata) else: version = kwargs.pop('version', 'netcdf3') if version == 'netcdf3': diff --git a/meteoinfo-lab/pylib/mipylib/dataset/radardatafile.py b/meteoinfo-lab/pylib/mipylib/dataset/radardatafile.py new file mode 100644 index 00000000..ada413f2 --- /dev/null +++ b/meteoinfo-lab/pylib/mipylib/dataset/radardatafile.py @@ -0,0 +1,30 @@ + +from .dimdatafile import DimDataFile + + +class RadarDataFile(DimDataFile): + + def __init__(self, dataset=None, access='r'): + super(RadarDataFile, self).__init__(dataset, access) + self.datainfo = dataset.getDataInfo() + + def get_products(self): + """ + Get product names. + + :return: Product names. + """ + return list(self.datainfo.getProducts()) + + def get_elevations(self, product=None): + """ + Get scan elevation angles. + + :param product: (*Str*) Product name. Default is None. + + :return: Scan elevation angles. + """ + if product is None: + return list(self.datainfo.getElevations()) + else: + return list(self.datainfo.getElevations(product)) diff --git a/meteoinfo-lab/pylib/mipylib/numeric/core/numeric$py.class b/meteoinfo-lab/pylib/mipylib/numeric/core/numeric$py.class index 86f678c0f0faf08de489a1e5d360880fd44ac1f2..3563e52aaff9fa8e770ebb67e66eee7ed7a1d881 100644 GIT binary patch delta 39583 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 X9`S;)X0AD#1819a%zO@%n{)pU$P)!1 diff --git a/meteoinfo-lab/pylib/mipylib/numeric/core/numeric.py b/meteoinfo-lab/pylib/mipylib/numeric/core/numeric.py index 51f1e002..5160b9eb 100644 --- a/meteoinfo-lab/pylib/mipylib/numeric/core/numeric.py +++ b/meteoinfo-lab/pylib/mipylib/numeric/core/numeric.py @@ -104,11 +104,11 @@ def array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0): if len(object) > 0: if isinstance(object[0], datetime.datetime): object = miutil.dates2nums(object) - elif isinstance(object[0], PyComplex): - a = NDArray(JythonUtil.toComplexArray(object)) elif isinstance(object[0], (list, tuple)): - if isinstance(object[0][0], PyComplex): + if miutil.iscomplex(object[0]): a = NDArray(JythonUtil.toComplexArray(object)) + elif miutil.iscomplex(object): + a = NDArray(JythonUtil.toComplexArray(object)) if isinstance(dtype, basestring): dtype = _dtype.DataType(dtype) diff --git a/meteoinfo-lab/pylib/mipylib/numeric/lib/function_base.py b/meteoinfo-lab/pylib/mipylib/numeric/lib/function_base.py index 30c2aba1..f48b9383 100644 --- a/meteoinfo-lab/pylib/mipylib/numeric/lib/function_base.py +++ b/meteoinfo-lab/pylib/mipylib/numeric/lib/function_base.py @@ -1,9 +1,10 @@ from ..core import numeric as _nx +from ..core import dtype from ..core._ndarray import NDArray from ..core.fromnumeric import (ravel, nonzero) from org.meteoinfo.ndarray.math import ArrayMath -__all__ = ['extract', 'place', 'grid_edge'] +__all__ = ['angle','extract', 'place', 'grid_edge'] def extract(condition, arr): @@ -112,3 +113,51 @@ def grid_edge(x, y): yy[xn + yn + xn:] = y[::-1] return xx, yy + +def angle(z, deg=False): + """ + Return the angle of the complex argument. + + Parameters + ---------- + z : array_like + A complex number or sequence of complex numbers. + deg : bool, optional + Return angle in degrees if True, radians if False (default). + + Returns + ------- + angle : ndarray or scalar + The counterclockwise angle from the positive real axis on the complex + plane in the range ``(-pi, pi]``, with dtype as double. + + See Also + -------- + arctan2 + absolute + + Notes + ----- + Although the angle of the complex number 0 is undefined, ``angle(0)`` + returns the value 0. + + Examples + -------- + >>> np.angle([1.0, 1.0j, 1+1j]) # in radians + array([ 0. , 1.57079633, 0.78539816]) # may vary + >>> np.angle(1+1j, deg=True) # in degrees + 45.0 + + """ + z = _nx.asanyarray(z) + if z.dtype == dtype.complex: + zimag = z.imag + zreal = z.real + else: + zimag = 0 + zreal = z + + a = _nx.arctan2(zimag, zreal) + if deg: + a *= 180 / _nx.pi + return a diff --git a/meteoinfo-lab/pylib/mipylib/plotlib/_glfigure$py.class b/meteoinfo-lab/pylib/mipylib/plotlib/_glfigure$py.class index d42a0daec10bcd93d052511ebf11bb5028275919..cfb40b9a838d5961b90ae3a2e42b4c5cf75319d7 100644 GIT binary patch literal 41763 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 diff --git a/meteoinfo-lab/pylib/mipylib/plotlib/_glfigure.py b/meteoinfo-lab/pylib/mipylib/plotlib/_glfigure.py index 9f974ba8..d02f792f 100644 --- a/meteoinfo-lab/pylib/mipylib/plotlib/_glfigure.py +++ b/meteoinfo-lab/pylib/mipylib/plotlib/_glfigure.py @@ -14,7 +14,7 @@ from ._mapaxes import MapAxes from ._axes3d import Axes3D from ._axes3dgl import Axes3DGL -from java.awt import Font +from java.awt import Font, GraphicsEnvironment __all__ = ['GLFigure'] @@ -478,10 +478,11 @@ class GLFigure(GLChartPanel): self.axes.append(ax) self.getChart().addPlot(ax._axes) self.getChart().setCurrentPlot(self.getChart().getPlots().size()) - if isinstance(ax, Axes3DGL): - self.set_mousemode("rotate") - else: - self.set_mousemode("pan") + if not GraphicsEnvironment.getLocalGraphicsEnvironment().isHeadless(): + if isinstance(ax, Axes3DGL): + self.set_mousemode("rotate") + else: + self.set_mousemode("pan") def remove_axes(self, ax=None): """ diff --git a/meteoinfo-lab/src/main/java/org/meteoinfo/lab/gui/FigureDockable.java b/meteoinfo-lab/src/main/java/org/meteoinfo/lab/gui/FigureDockable.java index 610a6cce..ff4d6faf 100644 --- a/meteoinfo-lab/src/main/java/org/meteoinfo/lab/gui/FigureDockable.java +++ b/meteoinfo-lab/src/main/java/org/meteoinfo/lab/gui/FigureDockable.java @@ -352,7 +352,7 @@ public class FigureDockable extends DefaultSingleCDockable { * * @param cp ChartPanel */ - public void setCurrentFigure(GLChartPanel cp) { + public void setCurrentFigure(JPanel cp) { if (this.tabbedPanel.getTabCount() > 0) { JScrollPane sp = new JScrollPane(cp); this.tabbedPanel.setComponentAt(this.tabbedPanel.getSelectedIndex(), sp);