From 74363fd57c848d2de93c8372c2ba9ccaed1319c9 Mon Sep 17 00:00:00 2001 From: wyq Date: Thu, 4 Apr 2024 17:25:57 +0800 Subject: [PATCH] add visible property in Graphic class --- .../meteoinfo/chart/geo/MapGridLine3D.java | 3 +- .../java/org/meteoinfo/chart/geo/MapPlot.java | 44 +-- .../chart/graphic/GeoGraphicCollection.java | 57 +++- .../org/meteoinfo/chart/jogl/EarthGLPlot.java | 5 + .../java/org/meteoinfo/chart/plot/Plot2D.java | 22 +- .../org/meteoinfo/common/util/GlobalUtil.java | 2 +- .../geo/mapdata/ShapeFileManage.java | 275 +++++++++++++----- .../meteoinfo/geometry/graphic/Artist.java | 17 ++ .../geometry/graphic/GraphicCollection.java | 13 + meteoinfo-lab/milconfig.xml | 48 ++- meteoinfo-lab/pom.xml | 7 +- meteoinfo-lab/pylib/mipylib/meteolib/_eof.py | 4 + .../mipylib/numeric/linalg/linalg$py.class | Bin 29847 -> 29856 bytes .../pylib/mipylib/numeric/linalg/linalg.py | 2 +- .../pylib/mipylib/plotlib/_mapaxes$py.class | Bin 89015 -> 88926 bytes .../pylib/mipylib/plotlib/_mapaxes.py | 7 +- .../pylib/mipylib/plotlib/graphic/lines.py | 12 + .../meteoinfo/projection/ProjectionUtil.java | 8 +- .../org/meteoinfo/table/AttributeTable.java | 2 +- pom.xml | 2 +- 20 files changed, 384 insertions(+), 146 deletions(-) diff --git a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/geo/MapGridLine3D.java b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/geo/MapGridLine3D.java index ad12d1a3..0b531c16 100644 --- a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/geo/MapGridLine3D.java +++ b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/geo/MapGridLine3D.java @@ -21,6 +21,7 @@ public class MapGridLine3D extends MapGridLine { */ public MapGridLine3D() { super(); + this.extent = new Extent3D(-100, 100, -100, 100, 0, 100); } /** @@ -28,7 +29,7 @@ public class MapGridLine3D extends MapGridLine { * @param projInfo Projection * @param extent Extent */ - public MapGridLine3D(ProjectionInfo projInfo, Extent extent) { + public MapGridLine3D(ProjectionInfo projInfo, Extent3D extent) { super(true); this.projInfo = projInfo; this.setExtent(extent); diff --git a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/geo/MapPlot.java b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/geo/MapPlot.java index 67558c2f..255e54f8 100644 --- a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/geo/MapPlot.java +++ b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/geo/MapPlot.java @@ -489,30 +489,32 @@ public class MapPlot extends Plot2D implements IWebMapPanel { int barIdx = 0; for (int m = 0; m < this.graphics.getNumGraphics(); m++) { Graphic graphic = this.graphics.get(m); - if (graphic instanceof WebMapImage) { - this.drawWebMapImage(g, (WebMapImage) graphic, area); - continue; - } - - ColorBreak cb = graphic.getLegend(); - ShapeTypes shapeType = graphic.getGraphicN(0).getShape().getShapeType(); - switch(shapeType){ - case BAR: - this.drawBars(g, (GraphicCollection) graphic, barIdx, area); - barIdx += 1; + if (graphic.isVisible()) { + if (graphic instanceof WebMapImage) { + this.drawWebMapImage(g, (WebMapImage) graphic, area); continue; - case STATION_MODEL: - this.drawStationModel(g, (GraphicCollection) graphic, area); - continue; - } + } - if (graphic.getExtent().intersects(this.drawExtent)) { - drawGraphics(g, graphic, area); - } + ColorBreak cb = graphic.getLegend(); + ShapeTypes shapeType = graphic.getGraphicN(0).getShape().getShapeType(); + switch (shapeType) { + case BAR: + this.drawBars(g, (GraphicCollection) graphic, barIdx, area); + barIdx += 1; + continue; + case STATION_MODEL: + this.drawStationModel(g, (GraphicCollection) graphic, area); + continue; + } - if (this.isLonLatMap() && graphic instanceof GeoGraphicCollection) { - if (this.drawExtent.maxX > 180) { - drawGraphics(g, ((GeoGraphicCollection) graphic).xShiftCopy(360), area); + if (graphic.getExtent().intersects(this.drawExtent)) { + drawGraphics(g, graphic, area); + } + + if (this.isLonLatMap() && graphic instanceof GeoGraphicCollection) { + if (this.drawExtent.maxX > 180) { + drawGraphics(g, ((GeoGraphicCollection) graphic).xShiftCopy(360), area); + } } } } diff --git a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/graphic/GeoGraphicCollection.java b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/graphic/GeoGraphicCollection.java index 7bc40813..aeee2dbb 100644 --- a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/graphic/GeoGraphicCollection.java +++ b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/graphic/GeoGraphicCollection.java @@ -7,13 +7,13 @@ import org.meteoinfo.common.PointD; import org.meteoinfo.geometry.graphic.Graphic; import org.meteoinfo.geometry.graphic.GraphicCollection; import org.meteoinfo.geometry.legend.*; -import org.meteoinfo.geometry.shape.PointShape; -import org.meteoinfo.geometry.shape.PolylineShape; +import org.meteoinfo.geometry.shape.*; import org.meteoinfo.geometry.shape.Shape; -import org.meteoinfo.geometry.shape.ShapeTypes; import org.meteoinfo.ndarray.DataType; import org.meteoinfo.projection.ProjectionInfo; import org.meteoinfo.table.AttributeTable; +import org.meteoinfo.table.DataRow; +import org.meteoinfo.table.DataTable; import org.meteoinfo.table.Field; import javax.swing.*; @@ -38,6 +38,57 @@ public class GeoGraphicCollection extends GraphicCollection { this.projInfo = ProjectionInfo.LONG_LAT; } + /** + * Factory method create GeoGraphicCollection from GraphicsCollection + * @param graphics The GraphicCollection object + * @return GeoGraphicCollection object + */ + public static GeoGraphicCollection factory(GraphicCollection graphics) { + GeoGraphicCollection geoGraphics = new GeoGraphicCollection(); + geoGraphics.graphics = graphics.getGraphics(); + geoGraphics.extent = graphics.getExtent(); + geoGraphics.setSingleLegend(graphics.isSingleLegend()); + geoGraphics.setLabelSet(graphics.getLabelSet()); + geoGraphics.setLabelPoints(graphics.getLabelPoints()); + geoGraphics.setLegendScheme(graphics.getLegendScheme()); + geoGraphics.setLegendBreak(graphics.getLegendBreak()); + geoGraphics.setAntiAlias(graphics.isAntiAlias()); + + AttributeTable attrTable = new AttributeTable(); + ShapeTypes shapeType = graphics.getShapeType(); + switch (shapeType) { + case POLYGON: + case POLYGON_Z: + attrTable.addField(new Field("data_Low", DataType.DOUBLE)); + attrTable.addField(new Field("data_High", DataType.DOUBLE)); + break; + default: + attrTable.addField(new Field("data", DataType.DOUBLE)); + break; + } + DataTable dataTable = attrTable.getTable(); + for (Graphic graphic : geoGraphics.graphics) { + try { + DataRow dataRow = dataTable.addRow(); + switch (shapeType) { + case POLYGON: + case POLYGON_Z: + dataRow.setValue("data_Low", ((PolygonShape) graphic.getShape()).lowValue); + dataRow.setValue("data_High", ((PolygonShape) graphic.getShape()).highValue); + break; + default: + dataRow.setValue("data", graphic.getShape().getValue()); + break; + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + geoGraphics.setAttributeTable(attrTable); + + return geoGraphics; + } + /** * Get attribute table * @return Attribute table diff --git a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/jogl/EarthGLPlot.java b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/jogl/EarthGLPlot.java index f8844eec..7797a38b 100644 --- a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/jogl/EarthGLPlot.java +++ b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/jogl/EarthGLPlot.java @@ -521,7 +521,12 @@ public class EarthGLPlot extends GLPlot { @Override protected void drawPolygonShape(GL2 gl, Graphic graphic) { + //gl.glDisable(GL2.GL_DEPTH_TEST); + //gl.glEnable(GL2.GL_CULL_FACE); + //gl.glFrontFace(GL2.GL_CW); super.drawPolygonShape(gl, graphic); + //gl.glEnable(GL2.GL_DEPTH_TEST); + //gl.glDisable(GL2.GL_CULL_FACE); } // diff --git a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/plot/Plot2D.java b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/plot/Plot2D.java index 33e5c355..208d11e7 100644 --- a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/plot/Plot2D.java +++ b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/plot/Plot2D.java @@ -285,17 +285,19 @@ public class Plot2D extends AbstractPlot2D { int barIdx = 0; for (int m = 0; m < this.graphics.getNumGraphics(); m++) { Graphic graphic = this.graphics.get(m); - ColorBreak cb = graphic.getLegend(); - ShapeTypes shapeType = graphic.getGraphicN(0).getShape().getShapeType(); - switch(shapeType){ - case BAR: - this.drawBars(g, (GraphicCollection) graphic, barIdx, area); - barIdx += 1; - continue; - } + if (graphic.isVisible()) { + ColorBreak cb = graphic.getLegend(); + ShapeTypes shapeType = graphic.getGraphicN(0).getShape().getShapeType(); + switch (shapeType) { + case BAR: + this.drawBars(g, (GraphicCollection) graphic, barIdx, area); + barIdx += 1; + continue; + } - if (graphic.getExtent().intersects(this.drawExtent)) { - drawGraphics(g, graphic, area); + if (graphic.getExtent().intersects(this.drawExtent)) { + drawGraphics(g, graphic, area); + } } } } 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 aa3c2bc5..dc3a3b76 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.8.2"; + version = "3.8.3"; } return version; } diff --git a/meteoinfo-geo/src/main/java/org/meteoinfo/geo/mapdata/ShapeFileManage.java b/meteoinfo-geo/src/main/java/org/meteoinfo/geo/mapdata/ShapeFileManage.java index bd4a421a..a2fd56b5 100644 --- a/meteoinfo-geo/src/main/java/org/meteoinfo/geo/mapdata/ShapeFileManage.java +++ b/meteoinfo-geo/src/main/java/org/meteoinfo/geo/mapdata/ShapeFileManage.java @@ -13,16 +13,19 @@ */ package org.meteoinfo.geo.mapdata; + import org.meteoinfo.chart.graphic.GeoGraphicCollection; import org.meteoinfo.common.Extent; import org.meteoinfo.common.PointD; import org.meteoinfo.common.io.EndianDataOutputStream; import org.meteoinfo.geo.layer.LayerDrawType; import org.meteoinfo.geo.layer.VectorLayer; import org.meteoinfo.geo.legend.LegendManage; + import org.meteoinfo.geometry.graphic.GraphicCollection; import org.meteoinfo.geometry.shape.Shape; import org.meteoinfo.geometry.shape.*; import org.meteoinfo.projection.ProjectionInfo; import org.meteoinfo.table.AttributeTable; + import org.w3c.dom.Attr; import java.awt.*; import java.io.*; @@ -714,28 +717,10 @@ public class ShapeFileManage { * @param shpfilepath Shape file path * @param aLayer Vector layer * @return Boolean - * @throws IOException*/ + * @throws IOException + */ public static boolean saveShapeFile(String shpfilepath, VectorLayer aLayer) throws IOException { - String shxfilepath = shpfilepath.replace(shpfilepath.substring(shpfilepath.lastIndexOf(".")), ".shx"); - String dbffilepath = shpfilepath.replace(shpfilepath.substring(shpfilepath.lastIndexOf(".")), ".dbf"); - String projFilePath = shpfilepath.replace(shpfilepath.substring(shpfilepath.lastIndexOf(".")), ".prj"); - - switch (aLayer.getShapeType()) { - case POINT: - case POINT_Z: - case POLYLINE: - case POLYLINE_Z: - case POLYGON: - case POLYGON_Z: - writeShxFile(shxfilepath, aLayer); - writeShpFile(shpfilepath, aLayer); - writeDbfFile(dbffilepath, aLayer); - writeProjFile(projFilePath, aLayer); - return true; - - default: - return false; - } + return saveShapeFile(shpfilepath, aLayer, null); } /** @@ -743,8 +728,8 @@ public class ShapeFileManage { * @param shpfilepath Shape file path * @param aLayer Vector layer * @param encoding Encoding - * @return Boolean - * @throws IOException*/ + * @throws IOException + */ public static boolean saveShapeFile(String shpfilepath, VectorLayer aLayer, String encoding) throws IOException { String shxfilepath = shpfilepath.replace(shpfilepath.substring(shpfilepath.lastIndexOf(".")), ".shx"); String dbffilepath = shpfilepath.replace(shpfilepath.substring(shpfilepath.lastIndexOf(".")), ".dbf"); @@ -759,15 +744,83 @@ public class ShapeFileManage { case POLYGON_Z: writeShxFile(shxfilepath, aLayer); writeShpFile(shpfilepath, aLayer); - writeDbfFile(dbffilepath, aLayer, encoding); + if (encoding == null) { + writeDbfFile(dbffilepath, aLayer); + } else { + writeDbfFile(dbffilepath, aLayer, encoding); + } writeProjFile(projFilePath, aLayer); return true; - default: return false; } } + /** + * Save shape file + * @param shpFilePath Shape file path + * @param graphics Graphics + * @throws IOException + */ + public static boolean saveShapeFile(String shpFilePath, GraphicCollection graphics) throws IOException { + return saveShapeFile(shpFilePath, GeoGraphicCollection.factory(graphics), null); + } + + /** + * Save shape file + * @param shpFilePath Shape file path + * @param graphics Graphics + * @param encoding Encoding + * @throws IOException + */ + public static boolean saveShapeFile(String shpFilePath, GraphicCollection graphics, String encoding) throws IOException { + return saveShapeFile(shpFilePath, GeoGraphicCollection.factory(graphics), encoding); + } + + /** + * Save shape file + * @param shpFilePath Shape file path + * @param geoGraphics GeoGraphics + * @param encoding Encoding + * @throws IOException + */ + public static boolean saveShapeFile(String shpFilePath, GeoGraphicCollection geoGraphics) throws IOException { + return saveShapeFile(shpFilePath, geoGraphics, null); + } + + /** + * Save shape file + * @param shpFilePath Shape file path + * @param geoGraphics GeoGraphics + * @param encoding Encoding + * @throws IOException + */ + public static boolean saveShapeFile(String shpFilePath, GeoGraphicCollection geoGraphics, String encoding) throws IOException { + String shxFilePath = shpFilePath.replace(shpFilePath.substring(shpFilePath.lastIndexOf(".")), ".shx"); + String dbfFilePath = shpFilePath.replace(shpFilePath.substring(shpFilePath.lastIndexOf(".")), ".dbf"); + String projFilePath = shpFilePath.replace(shpFilePath.substring(shpFilePath.lastIndexOf(".")), ".prj"); + + switch (geoGraphics.getShapeType()) { + case POINT: + case POINT_Z: + case POLYLINE: + case POLYLINE_Z: + case POLYGON: + case POLYGON_Z: + writeShxFile(shxFilePath, geoGraphics); + writeShpFile(shpFilePath, geoGraphics); + if (encoding == null) { + writeDbfFile(dbfFilePath, geoGraphics.getAttributeTable()); + } else { + writeDbfFile(dbfFilePath, geoGraphics.getAttributeTable(), encoding); + } + writeProjFile(projFilePath, geoGraphics.getProjInfo()); + return true; + default: + return false; + } + } + private static void writeShpFile(String shpfilepath, VectorLayer aLayer) throws FileNotFoundException, IOException { File shpFile = new File(shpfilepath); EndianDataOutputStream bw = new EndianDataOutputStream(new BufferedOutputStream(new FileOutputStream(shpFile))); @@ -789,6 +842,27 @@ public class ShapeFileManage { bw.close(); } + private static void writeShpFile(String shpFilePath, GraphicCollection graphics) throws FileNotFoundException, IOException { + File shpFile = new File(shpFilePath); + EndianDataOutputStream bw = new EndianDataOutputStream(new BufferedOutputStream(new FileOutputStream(shpFile))); + + //Write header + int FileLength = getShpFileLength(graphics); + writeHeader(bw, graphics, FileLength); + + //Write records + int RecordNumber; + + for (int i = 0; i < graphics.getNumGraphics(); i++) { + Shape aShape = graphics.getShapes().get(i); + RecordNumber = i + 1; + writeRecord(bw, RecordNumber, aShape, graphics.getShapeType()); + } + + //Close + bw.close(); + } + private static int getShpFileLength(VectorLayer aLayer) { int fileLength = 50; @@ -801,6 +875,18 @@ public class ShapeFileManage { return fileLength; } + private static int getShpFileLength(GraphicCollection graphics) { + int fileLength = 50; + + for (int i = 0; i < graphics.getNumGraphics(); i++) { + Shape aShape = graphics.getShapes().get(i); + int cLen = getContentLength(aShape, graphics.getShapeType()); + fileLength += 4 + cLen; + } + + return fileLength; + } + private static int getContentLength(Shape aShape, ShapeTypes aST) { int contentLength = 0; switch (aST) { @@ -933,32 +1019,40 @@ public class ShapeFileManage { } } - private static void writeHeader(EndianDataOutputStream bw, VectorLayer aLayer, int FileLength) throws IOException { - int i; - int FileCode = 9994; - //FileCode = swapByteOrder(FileCode); - int Unused = 0; - //Unused = swapByteOrder(Unused); - //FileLength = swapByteOrder(FileLength); - int Version = 1000; - int aShapeType = aLayer.getShapeType().getValue(); - - bw.writeIntBE(FileCode); - for (i = 0; i < 5; i++) { - bw.writeIntBE(Unused); - } - bw.writeIntBE(FileLength); - bw.writeIntLE(Version); - bw.writeIntLE(aShapeType); - bw.writeDoubleLE(aLayer.getExtent().minX); - bw.writeDoubleLE(aLayer.getExtent().minY); - bw.writeDoubleLE(aLayer.getExtent().maxX); - bw.writeDoubleLE(aLayer.getExtent().maxY); - for (i = 0; i < 4; i++) { - bw.writeDoubleLE(0.0); - } + private static void writeHeader(EndianDataOutputStream bw, VectorLayer aLayer, int fileLength) throws IOException { + writeHeader(bw, aLayer.getShapeType(), aLayer.getExtent(), fileLength); } + private static void writeHeader(EndianDataOutputStream bw, GraphicCollection graphics, int fileLength) throws IOException { + writeHeader(bw, graphics.getShapeType(), graphics.getExtent(), fileLength); + } + + private static void writeHeader(EndianDataOutputStream bw, ShapeTypes shapeType, Extent extent, int fileLength) throws IOException { + int i; + int FileCode = 9994; + //FileCode = swapByteOrder(FileCode); + int Unused = 0; + //Unused = swapByteOrder(Unused); + //FileLength = swapByteOrder(FileLength); + int Version = 1000; + int aShapeType = shapeType.getValue(); + + bw.writeIntBE(FileCode); + for (i = 0; i < 5; i++) { + bw.writeIntBE(Unused); + } + bw.writeIntBE(fileLength); + bw.writeIntLE(Version); + bw.writeIntLE(aShapeType); + bw.writeDoubleLE(extent.minX); + bw.writeDoubleLE(extent.minY); + bw.writeDoubleLE(extent.maxX); + bw.writeDoubleLE(extent.maxY); + for (i = 0; i < 4; i++) { + bw.writeDoubleLE(0.0); + } + } + private static void writeShxFile(String shxfilepath, VectorLayer aLayer) throws IOException { File shxFile = new File(shxfilepath); EndianDataOutputStream bw = new EndianDataOutputStream(new BufferedOutputStream(new FileOutputStream(shxFile))); @@ -985,35 +1079,72 @@ public class ShapeFileManage { bw.close(); } - private static void writeDbfFile(String dbffilepath, VectorLayer aLayer) { - aLayer.getAttributeTable().saveAs(dbffilepath, true); + private static void writeShxFile(String shxFilePath, GraphicCollection graphics) throws IOException { + File shxFile = new File(shxFilePath); + EndianDataOutputStream bw = new EndianDataOutputStream(new BufferedOutputStream(new FileOutputStream(shxFile))); + + //Write header + int FileLength = graphics.getNumGraphics() * 4 + 50; + writeHeader(bw, graphics, FileLength); + + //Write content + int OffSet, ContentLength; + OffSet = 50; + + for (int i = 0; i < graphics.getNumGraphics(); i++) { + Shape aShape = graphics.getShapes().get(i); + ContentLength = getContentLength(aShape, graphics.getShapeType()); + + bw.writeIntBE(OffSet); + bw.writeIntBE(ContentLength); + + OffSet = OffSet + 4 + ContentLength; + } + + //Close + bw.close(); + } + + private static void writeDbfFile(String dbfFilePath, VectorLayer aLayer) { + writeDbfFile(dbfFilePath, aLayer.getAttributeTable()); } - private static void writeDbfFile(String dbffilepath, VectorLayer aLayer, String encoding) { - AttributeTable attTable = aLayer.getAttributeTable(); - attTable.setEncoding(encoding); - attTable.saveAs(dbffilepath, true); + private static void writeDbfFile(String dbfFilePath, VectorLayer aLayer, String encoding) { + writeDbfFile(dbfFilePath, aLayer.getAttributeTable(), encoding); } - private static void writeProjFile(String projFilePath, VectorLayer aLayer) { - BufferedWriter sw = null; - try { - String esriString = aLayer.getProjInfo().toEsriString(); - sw = new BufferedWriter(new FileWriter(new File(projFilePath))); - sw.write(esriString); - sw.flush(); - sw.close(); - } catch (IOException ex) { - Logger.getLogger(ShapeFileManage.class.getName()).log(Level.SEVERE, null, ex); - } finally { - try { - sw.close(); - } catch (IOException ex) { - Logger.getLogger(ShapeFileManage.class.getName()).log(Level.SEVERE, null, ex); - } - } + private static void writeDbfFile(String dbfFilePath, AttributeTable attrTable) { + attrTable.saveAs(dbfFilePath, true); + } + + private static void writeDbfFile(String dbfFilePath, AttributeTable attrTable, String encoding) { + attrTable.setEncoding(encoding); + attrTable.saveAs(dbfFilePath, true); + } + + private static void writeProjFile(String projFilePath, VectorLayer layer) { + writeProjFile(projFilePath, layer.getProjInfo()); } + private static void writeProjFile(String projFilePath, ProjectionInfo projectionInfo) { + BufferedWriter sw = null; + try { + String esriString = projectionInfo.toEsriString(); + sw = new BufferedWriter(new FileWriter(new File(projFilePath))); + sw.write(esriString); + sw.flush(); + sw.close(); + } catch (IOException ex) { + Logger.getLogger(ShapeFileManage.class.getName()).log(Level.SEVERE, null, ex); + } finally { + try { + sw.close(); + } catch (IOException ex) { + Logger.getLogger(ShapeFileManage.class.getName()).log(Level.SEVERE, null, ex); + } + } + } + /** * Swaps the byte order of an int32 * diff --git a/meteoinfo-geometry/src/main/java/org/meteoinfo/geometry/graphic/Artist.java b/meteoinfo-geometry/src/main/java/org/meteoinfo/geometry/graphic/Artist.java index 039e1ec1..da19e255 100644 --- a/meteoinfo-geometry/src/main/java/org/meteoinfo/geometry/graphic/Artist.java +++ b/meteoinfo-geometry/src/main/java/org/meteoinfo/geometry/graphic/Artist.java @@ -3,6 +3,7 @@ package org.meteoinfo.geometry.graphic; public class Artist { protected boolean antiAlias = false; + protected boolean visible = true; /** * Return antiAlias @@ -19,4 +20,20 @@ public class Artist { public void setAntiAlias(boolean value) { this.antiAlias = value; } + + /** + * Return visible + * @return Visible + */ + public boolean isVisible() { + return this.visible; + } + + /** + * Set visible + * @param value Visible + */ + public void setVisible(boolean value) { + this.visible = value; + } } diff --git a/meteoinfo-geometry/src/main/java/org/meteoinfo/geometry/graphic/GraphicCollection.java b/meteoinfo-geometry/src/main/java/org/meteoinfo/geometry/graphic/GraphicCollection.java index 4ebcb520..2c7d9872 100644 --- a/meteoinfo-geometry/src/main/java/org/meteoinfo/geometry/graphic/GraphicCollection.java +++ b/meteoinfo-geometry/src/main/java/org/meteoinfo/geometry/graphic/GraphicCollection.java @@ -71,6 +71,19 @@ public class GraphicCollection extends Graphic implements Iterator { } } + /** + * Get shape by index + * @param index The index + * @return Shape + */ + public Shape getShape(int index) { + if (this.graphics.isEmpty()) { + return null; + } else { + return this.graphics.get(index).getShape(); + } + } + /** * Get graphic list * diff --git a/meteoinfo-lab/milconfig.xml b/meteoinfo-lab/milconfig.xml index 6fd07f0d..531680dd 100644 --- a/meteoinfo-lab/milconfig.xml +++ b/meteoinfo-lab/milconfig.xml @@ -1,38 +1,32 @@ - - - - - - + + + + + + - - - - - + + - - - + + + + + + - - - - - - + + + - - - - - - + + + @@ -40,5 +34,5 @@
- + diff --git a/meteoinfo-lab/pom.xml b/meteoinfo-lab/pom.xml index 520f870e..bde8a17f 100644 --- a/meteoinfo-lab/pom.xml +++ b/meteoinfo-lab/pom.xml @@ -49,10 +49,15 @@ docking-frames-core 2.0.0 - + + + org.slf4j + slf4j-nop + 1.7.25 diff --git a/meteoinfo-lab/pylib/mipylib/meteolib/_eof.py b/meteoinfo-lab/pylib/mipylib/meteolib/_eof.py index b8333d1d..bc6b092b 100644 --- a/meteoinfo-lab/pylib/mipylib/meteolib/_eof.py +++ b/meteoinfo-lab/pylib/mipylib/meteolib/_eof.py @@ -1,3 +1,7 @@ +""" +For EOF analysis. The code were ported from Python eofs library - https://github.com/ajdawson/eofs +""" + import mipylib.numeric as np import warnings diff --git a/meteoinfo-lab/pylib/mipylib/numeric/linalg/linalg$py.class b/meteoinfo-lab/pylib/mipylib/numeric/linalg/linalg$py.class index 396519958e191dd827a4b2c787792b165bceb7d8..9a72c268d0cff2d347794e46df0280b9cf88f8a2 100644 GIT binary patch delta 328 zcmbRKl5xRH#tl}?{MI+oi!S z)mD)Ld_rD381#a-Gx+&w3kB$IV~}9<(-sik#=ya{mq86E7PO5aOgEl6K3K?0cN0U# z4u(7{7HuJ~$&wzKjA4_TJ&b|mc8^vbh$3yF%Ru#;Jv<{BC7>e0jH+NGSmJ}Vh0Xw( zlXrTV0X2Q_S`8%Ucu!^Y+HB;rnU~RT^0UZqj6s|4Mor*i^xK@5dWD_Qd$Mz`BTzwW Ht`Iu_xb9(d delta 320 zcmZ4Rl5zS=#tl}?lf9X>R6H5HxENFzycrqTOGY)Y_qk`W?n|0$?qe-F$QdY7Bzv3(Pwjc>J@fI&&fWyjz9%{xkBs!fpB2r diff --git a/meteoinfo-lab/pylib/mipylib/numeric/linalg/linalg.py b/meteoinfo-lab/pylib/mipylib/numeric/linalg/linalg.py index 19f245e8..41117bf7 100644 --- a/meteoinfo-lab/pylib/mipylib/numeric/linalg/linalg.py +++ b/meteoinfo-lab/pylib/mipylib/numeric/linalg/linalg.py @@ -13,7 +13,7 @@ from org.meteoinfo.math.stats import StatsUtil from .. import core as np __all__ = ['solve', 'cholesky', 'cond', 'det', 'lu', 'qr', 'svd', 'eig', 'inv', 'lstsq', 'slogdet', - 'solve_triangular', 'norm', 'pinv'] + 'solve_triangular', 'norm', 'pinv', 'LinAlgError'] class LinAlgError(Exception): diff --git a/meteoinfo-lab/pylib/mipylib/plotlib/_mapaxes$py.class b/meteoinfo-lab/pylib/mipylib/plotlib/_mapaxes$py.class index ae19d051c2699c577a73a221f2171aeb16623a2d..ff7ef93d08b82ae9d5fda3ac44aa7178bc54f170 100644 GIT binary patch delta 16514 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 Y#IARf6Wc?~s5U#w+-udM5wu shapes = projectClipShape(aGraphic.getShape(), fromProj, toProj); if (shapes != null && shapes.size() > 0) { aGraphic.setShape(shapes.get(0)); - newGCollection.add(aGraphic); + ((GraphicCollection) newGCollection).add(aGraphic); } } - newGCollection.setLegendScheme(((GraphicCollection) graphic).getLegendScheme()); - newGCollection.setSingleLegend(((GraphicCollection) graphic).isSingleLegend()); + ((GraphicCollection) newGCollection).setLegendScheme(((GraphicCollection) graphic).getLegendScheme()); + ((GraphicCollection) newGCollection).setSingleLegend(((GraphicCollection) graphic).isSingleLegend()); newGCollection.setAntiAlias(graphic.isAntiAlias()); return newGCollection; diff --git a/meteoinfo-table/src/main/java/org/meteoinfo/table/AttributeTable.java b/meteoinfo-table/src/main/java/org/meteoinfo/table/AttributeTable.java index 3f4462fe..9f77fb24 100644 --- a/meteoinfo-table/src/main/java/org/meteoinfo/table/AttributeTable.java +++ b/meteoinfo-table/src/main/java/org/meteoinfo/table/AttributeTable.java @@ -549,7 +549,7 @@ public final class AttributeTable implements Cloneable { * Save this table to the specified file name * * @param fileName The file name to be saved - * @param overwrite If over write the file if it exists + * @param overwrite If overwrite the file if it exists */ public void saveAs(String fileName, boolean overwrite) { if (_file == null) { diff --git a/pom.xml b/pom.xml index 74ef2412..7d09ea4a 100644 --- a/pom.xml +++ b/pom.xml @@ -35,7 +35,7 @@ UTF-8 1.8 - 3.8.2 + 3.8.3 8 8 8