add collections module

This commit is contained in:
wyq 2024-04-22 09:24:51 +08:00
parent b3b0e24d4f
commit 445c6879db
27 changed files with 397 additions and 193 deletions

View File

@ -24,7 +24,8 @@ public class VolumeGraphic extends GraphicCollection3D {
final int width; final int width;
final int height; final int height;
final int depth; final int depth;
final byte[] data; private Array data;
final byte[] byteData;
private byte[] normals; private byte[] normals;
final float[] scale = new float[]{1, 1, 1}; final float[] scale = new float[]{1, 1, 1};
private byte[] colors; private byte[] colors;
@ -53,7 +54,7 @@ public class VolumeGraphic extends GraphicCollection3D {
this.height = height; this.height = height;
this.depth = depth; this.depth = depth;
this.data = data; this.byteData = data;
//this.buffer = Buffers.newDirectByteBuffer(this.data); //this.buffer = Buffers.newDirectByteBuffer(this.data);
this.colors = colors; this.colors = colors;
@ -75,17 +76,18 @@ public class VolumeGraphic extends GraphicCollection3D {
this.transferFunction.setColorMap(colorMap); this.transferFunction.setColorMap(colorMap);
value = value.copyIfView(); value = value.copyIfView();
this.data = value;
int[] shape = value.getShape(); int[] shape = value.getShape();
this.depth = shape[0]; this.depth = shape[0];
this.height = shape[1]; this.height = shape[1];
this.width = shape[2]; this.width = shape[2];
this.data = new byte[width * height * depth]; this.byteData = new byte[width * height * depth];
double range = vMax - vMin; double range = vMax - vMin;
for (int i = 0; i < value.getSize(); i++) { for (int i = 0; i < value.getSize(); i++) {
if (Double.isNaN(value.getDouble(i))) { if (Double.isNaN(value.getDouble(i))) {
data[i] = 0; byteData[i] = 0;
} else { } else {
data[i] = (byte) ((int) ((value.getDouble(i) - vMin) / range * 255)); byteData[i] = (byte) ((int) ((value.getDouble(i) - vMin) / range * 255));
} }
} }
//buffer = Buffers.newDirectByteBuffer(data); //buffer = Buffers.newDirectByteBuffer(data);
@ -114,16 +116,17 @@ public class VolumeGraphic extends GraphicCollection3D {
*/ */
public VolumeGraphic(Array value, ColorMap colorMap, Normalize norm) { public VolumeGraphic(Array value, ColorMap colorMap, Normalize norm) {
value = value.copyIfView(); value = value.copyIfView();
this.data = value;
int[] shape = value.getShape(); int[] shape = value.getShape();
this.depth = shape[0]; this.depth = shape[0];
this.height = shape[1]; this.height = shape[1];
this.width = shape[2]; this.width = shape[2];
this.data = new byte[width * height * depth]; this.byteData = new byte[width * height * depth];
for (int i = 0; i < value.getSize(); i++) { for (int i = 0; i < value.getSize(); i++) {
if (Double.isNaN(value.getDouble(i))) { if (Double.isNaN(value.getDouble(i))) {
data[i] = 0; byteData[i] = 0;
} else { } else {
data[i] = (byte) ((int) (norm.apply(value.getDouble(i)).floatValue() * 255)); byteData[i] = (byte) ((int) (norm.apply(value.getDouble(i)).floatValue() * 255));
} }
} }
//buffer = Buffers.newDirectByteBuffer(data); //buffer = Buffers.newDirectByteBuffer(data);
@ -138,18 +141,19 @@ public class VolumeGraphic extends GraphicCollection3D {
*/ */
public VolumeGraphic(Array value, LegendScheme ls) { public VolumeGraphic(Array value, LegendScheme ls) {
value = value.copyIfView(); value = value.copyIfView();
this.data = value;
int[] shape = value.getShape(); int[] shape = value.getShape();
this.depth = shape[0]; this.depth = shape[0];
this.height = shape[1]; this.height = shape[1];
this.width = shape[2]; this.width = shape[2];
this.data = new byte[width * height * depth]; this.byteData = new byte[width * height * depth];
List<Color> oColors = ls.getColors(); List<Color> oColors = ls.getColors();
int n = oColors.size(); int n = oColors.size();
for (int i = 0; i < value.getSize(); i++) { for (int i = 0; i < value.getSize(); i++) {
if (Double.isNaN(value.getDouble(i))) { if (Double.isNaN(value.getDouble(i))) {
data[i] = 0; byteData[i] = 0;
} else { } else {
data[i] = (byte) ((int) (ls.legendBreakIndex(value.getDouble(i)) * 255.0 / n)); byteData[i] = (byte) ((int) (ls.legendBreakIndex(value.getDouble(i)) * 255.0 / n));
} }
} }
//buffer = Buffers.newDirectByteBuffer(data); //buffer = Buffers.newDirectByteBuffer(data);
@ -307,6 +311,14 @@ public class VolumeGraphic extends GraphicCollection3D {
} }
} }
/**
* Get data array
* @return Data array
*/
public Array getData() {
return this.data;
}
/** /**
* Get width * Get width
* @return Width * @return Width
@ -335,8 +347,8 @@ public class VolumeGraphic extends GraphicCollection3D {
* Get data array * Get data array
* @return Data array * @return Data array
*/ */
public byte[] getData() { public byte[] getByteData() {
return this.data; return this.byteData;
} }
/** /**
@ -613,16 +625,16 @@ public class VolumeGraphic extends GraphicCollection3D {
* Calculate normals * Calculate normals
*/ */
public void calculateNormals() { public void calculateNormals() {
this.normals = new byte[this.data.length * 3]; this.normals = new byte[this.byteData.length * 3];
int xn, yn, zn, i1, i2; int xn, yn, zn, i1, i2;
int n = this.data.length; int n = this.byteData.length;
for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
i1 = i - 1; i1 = i - 1;
i2 = i + 1; i2 = i + 1;
if (i1 < 0 || i2 >= n) if (i1 < 0 || i2 >= n)
xn = 0; xn = 0;
else else
xn = data[i1] - data[i2]; xn = byteData[i1] - byteData[i2];
normals[i * 3] = (byte) (xn + 128); normals[i * 3] = (byte) (xn + 128);
i1 = i - width; i1 = i - width;
@ -630,7 +642,7 @@ public class VolumeGraphic extends GraphicCollection3D {
if (i1 < 0 || i2 >= n) if (i1 < 0 || i2 >= n)
yn = 0; yn = 0;
else else
yn = data[i1] - data[i2]; yn = byteData[i1] - byteData[i2];
normals[i * 3 + 1] = (byte) (yn + 128); normals[i * 3 + 1] = (byte) (yn + 128);
i1 = i - (width * height); i1 = i - (width * height);
@ -638,7 +650,7 @@ public class VolumeGraphic extends GraphicCollection3D {
if (i1 < 0 || i2 >= n) if (i1 < 0 || i2 >= n)
zn = 0; zn = 0;
else else
zn = data[i1] - data[i2]; zn = byteData[i1] - byteData[i2];
normals[i * 3 + 2] = (byte) (zn + 128); normals[i * 3 + 2] = (byte) (zn + 128);
} }
} }

View File

@ -2930,7 +2930,7 @@ public class GLPlot extends Plot {
PointBreak pb = (PointBreak) graphic.getGraphicN(0).getLegend(); PointBreak pb = (PointBreak) graphic.getGraphicN(0).getLegend();
gl.glPointSize(pb.getSize() * this.dpiScale); gl.glPointSize(pb.getSize() * this.dpiScale);
gl.glBegin(GL2.GL_POINTS); gl.glBegin(GL2.GL_POINTS);
for (Graphic gg : graphic.getGraphics()) { for (Graphic gg : ((GraphicCollection) graphic).getGraphics()) {
PointZShape shape = (PointZShape) gg.getShape(); PointZShape shape = (PointZShape) gg.getShape();
pb = (PointBreak) gg.getLegend(); pb = (PointBreak) gg.getLegend();
float[] rgba = pb.getColor().getRGBComponents(null); float[] rgba = pb.getColor().getRGBComponents(null);
@ -2966,7 +2966,7 @@ public class GLPlot extends Plot {
} }
private void drawSpheres(GL2 gl, Graphic graphic) { private void drawSpheres(GL2 gl, Graphic graphic) {
for (Graphic gg : graphic.getGraphics()) { for (Graphic gg : ((GraphicCollection) graphic).getGraphics()) {
drawSphere(gl, gg); drawSphere(gl, gg);
} }
} }
@ -3083,7 +3083,7 @@ public class GLPlot extends Plot {
0, // border 0, // border
GL_LUMINANCE, // format GL_LUMINANCE, // format
GL_UNSIGNED_BYTE, // type GL_UNSIGNED_BYTE, // type
Buffers.newDirectByteBuffer(volume.getData()).rewind() // pixel Buffers.newDirectByteBuffer(volume.getByteData()).rewind() // pixel
); );
// 1st attribute buffer : vertices // 1st attribute buffer : vertices

View File

@ -1,7 +1,6 @@
package org.meteoinfo.chart.render.jogl; package org.meteoinfo.chart.render.jogl;
import com.jogamp.common.nio.Buffers; import com.jogamp.common.nio.Buffers;
import com.jogamp.opengl.GL;
import com.jogamp.opengl.GL2; import com.jogamp.opengl.GL2;
import com.jogamp.opengl.util.GLBuffers; import com.jogamp.opengl.util.GLBuffers;
import org.meteoinfo.chart.graphic.VolumeGraphic; import org.meteoinfo.chart.graphic.VolumeGraphic;
@ -178,7 +177,7 @@ public class VolumeRender extends JOGLGraphicRender {
0, // border 0, // border
GL_LUMINANCE, // format GL_LUMINANCE, // format
GL_UNSIGNED_BYTE, // type GL_UNSIGNED_BYTE, // type
((Buffer) Buffers.newDirectByteBuffer(volume.getData())).rewind() // pixel ((Buffer) Buffers.newDirectByteBuffer(volume.getByteData())).rewind() // pixel
); );
//Normals 3D texture //Normals 3D texture

View File

@ -67,7 +67,7 @@ import java.util.zip.ZipInputStream;
public static String getVersion(){ public static String getVersion(){
String version = GlobalUtil.class.getPackage().getImplementationVersion(); String version = GlobalUtil.class.getPackage().getImplementationVersion();
if (version == null || version.equals("")) { if (version == null || version.equals("")) {
version = "3.8.5"; version = "3.8.6";
} }
return version; return version;
} }

View File

@ -275,14 +275,13 @@ public class JDateUtil {
TemporalAmount pe; TemporalAmount pe;
switch (p) { switch (p) {
case "H": case "h":
pe = Duration.ofHours(n); pe = Duration.ofHours(n);
break; break;
case "T": case "min":
case "Min":
pe = Duration.ofMinutes(n); pe = Duration.ofMinutes(n);
break; break;
case "S": case "s":
pe = Duration.ofSeconds(n); pe = Duration.ofSeconds(n);
break; break;
case "D": case "D":

View File

@ -225,75 +225,6 @@ public class CMARadarBaseDataInfo extends DataInfo implements IGridDataInfo {
} }
} }
void readDataInfo(RandomAccessFile raf) {
try {
genericHeader = new GenericHeader(raf);
siteConfig = new SiteConfig(raf);
//Add global attributes
this.addAttribute(new Attribute("StationCode", siteConfig.siteCode));
this.addAttribute(new Attribute("StationName", siteConfig.siteName));
this.addAttribute(new Attribute("StationLatitude", siteConfig.latitude));
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("featureType", "RADIAL"));
this.addAttribute(new Attribute("DataType", "Radial"));
//Read radial data
taskConfig = new TaskConfig(raf);
cutConfigs = new ArrayList<>();
for (int i = 0; i < taskConfig.cutNumber; i++) {
cutConfigs.add(new CutConfig(raf));
}
radialHeaders = new ArrayList<>();
while (raf.length() - raf.getFilePointer() > RadialHeader.length) {
RadialHeader radialHeader = new RadialHeader(raf);
for (int i = 0; i < radialHeader.momentNumber; i++) {
MomentHeader momentHeader = new MomentHeader(raf);
String product = this.productMap.get(momentHeader.dataType);
RadialRecord record;
if (this.recordMap.containsKey(product)) {
record = this.recordMap.get(product);
} else {
record = new RadialRecord(product);
record.setBinLength(momentHeader.binLength);
record.scale = momentHeader.scale;
record.offset = momentHeader.offset;
this.recordMap.put(product, record);
}
if (radialHeader.radialNumber == 1) {
record.elevation.add(new ArrayList<>());
record.azimuth.add(new ArrayList<>());
record.distance.add(ArrayUtil.arrayRange1(0, momentHeader.dataLength / momentHeader.binLength,
cutConfigs.get(0).logResolution));
record.newScanData();
}
record.elevation.get(record.elevation.size() - 1).add(radialHeader.elevation);
record.azimuth.get(record.azimuth.size() - 1).add(radialHeader.azimuth);
byte[] bytes = new byte[momentHeader.dataLength];
raf.read(bytes);
record.addDataBytes(bytes);
}
radialHeaders.add(radialHeader);
}
raf.close();
//Add dimensions and variables
Dimension xyzDim = new Dimension(DimensionType.OTHER);
xyzDim.setShortName("xyz");
xyzDim.setDimValue(Array.factory(DataType.INT, new int[]{3}, new int[]{1,2,3}));
this.addDimension(xyzDim);
for (String product : this.recordMap.keySet()) {
this.recordMap.get(product).makeVariables(this, xyzDim);
}
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
void readDataInfo(InputStream raf) { void readDataInfo(InputStream raf) {
try { try {
genericHeader = new GenericHeader(raf); genericHeader = new GenericHeader(raf);
@ -310,8 +241,12 @@ public class CMARadarBaseDataInfo extends DataInfo implements IGridDataInfo {
this.addAttribute(new Attribute("featureType", "RADIAL")); this.addAttribute(new Attribute("featureType", "RADIAL"));
this.addAttribute(new Attribute("DataType", "Radial")); this.addAttribute(new Attribute("DataType", "Radial"));
//Read radial data //Read task configuration
taskConfig = new TaskConfig(raf); taskConfig = new TaskConfig(raf);
this.addAttribute(new Attribute("TaskName", taskConfig.taskName));
this.addAttribute(new Attribute("TaskDescription", taskConfig.taskDescription));
//Read radial data
cutConfigs = new ArrayList<>(); cutConfigs = new ArrayList<>();
for (int i = 0; i < taskConfig.cutNumber; i++) { for (int i = 0; i < taskConfig.cutNumber; i++) {
cutConfigs.add(new CutConfig(raf)); cutConfigs.add(new CutConfig(raf));

View File

@ -6,6 +6,7 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.RandomAccessFile; import java.io.RandomAccessFile;
import java.nio.ByteOrder; import java.nio.ByteOrder;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime; import java.time.LocalDateTime;
public class TaskConfig { public class TaskConfig {
@ -28,52 +29,6 @@ public class TaskConfig {
public float LDRCalibration; public float LDRCalibration;
public byte[] reserves; public byte[] reserves;
/**
* Constructor
* @param raf RandomAccessFile object
*/
public TaskConfig(RandomAccessFile raf) throws IOException {
byte[] bytes = new byte[32];
raf.read(bytes);
taskName = new String(bytes).trim();
bytes = new byte[128];
raf.read(bytes);
taskDescription = new String(bytes).trim();
bytes = new byte[4];
raf.read(bytes);
polarizationType = DataConvert.bytes2Int(bytes, ByteOrder.LITTLE_ENDIAN);
raf.read(bytes);
scanType = DataConvert.bytes2Int(bytes, ByteOrder.LITTLE_ENDIAN);
raf.read(bytes);
pulseWidth = DataConvert.bytes2Int(bytes, ByteOrder.LITTLE_ENDIAN);
raf.read(bytes);
int seconds = DataConvert.bytes2Int(bytes, ByteOrder.LITTLE_ENDIAN);
LocalDateTime dt = LocalDateTime.of(1970, 1, 1, 0, 0);
scanStartTime = dt.plusSeconds(seconds);
raf.read(bytes);
cutNumber = DataConvert.bytes2Int(bytes, ByteOrder.LITTLE_ENDIAN);
raf.read(bytes);
horizontalNoise = DataConvert.bytes2Float(bytes, ByteOrder.LITTLE_ENDIAN);
raf.read(bytes);
verticalNoise = DataConvert.bytes2Float(bytes, ByteOrder.LITTLE_ENDIAN);
raf.read(bytes);
horizontalCalibration = DataConvert.bytes2Float(bytes, ByteOrder.LITTLE_ENDIAN);
raf.read(bytes);
verticalCalibration = DataConvert.bytes2Float(bytes, ByteOrder.LITTLE_ENDIAN);
raf.read(bytes);
horizontalNoiseTemperature = DataConvert.bytes2Float(bytes, ByteOrder.LITTLE_ENDIAN);
raf.read(bytes);
verticalNoiseTemperature = DataConvert.bytes2Float(bytes, ByteOrder.LITTLE_ENDIAN);
raf.read(bytes);
ZDRCalibration = DataConvert.bytes2Float(bytes, ByteOrder.LITTLE_ENDIAN);
raf.read(bytes);
PHIDRCalibration = DataConvert.bytes2Float(bytes, ByteOrder.LITTLE_ENDIAN);
raf.read(bytes);
LDRCalibration = DataConvert.bytes2Float(bytes, ByteOrder.LITTLE_ENDIAN);
reserves = new byte[40];
raf.read(reserves);
}
/** /**
* Constructor * Constructor
* @param raf InputStream object * @param raf InputStream object

View File

@ -15,6 +15,7 @@ package org.meteoinfo.geo.legend;
import com.l2fprod.common.beans.BaseBeanInfo; import com.l2fprod.common.beans.BaseBeanInfo;
import org.meteoinfo.common.colors.ColorUtil; import org.meteoinfo.common.colors.ColorUtil;
import org.meteoinfo.geometry.graphic.Graphic;
import org.meteoinfo.geometry.legend.Constants; import org.meteoinfo.geometry.legend.Constants;
import org.meteoinfo.geometry.legend.LegendScheme; import org.meteoinfo.geometry.legend.LegendScheme;
import org.meteoinfo.geometry.legend.LineStyles; import org.meteoinfo.geometry.legend.LineStyles;
@ -1649,7 +1650,7 @@ public class MapFrame extends ItemNode {
_mapView.exportMaskOutElement(m_Doc, mapFrame); _mapView.exportMaskOutElement(m_Doc, mapFrame);
_mapView.exportProjectionElement(m_Doc, mapFrame); _mapView.exportProjectionElement(m_Doc, mapFrame);
addGroupLayerElement(m_Doc, mapFrame, projectFilePath); addGroupLayerElement(m_Doc, mapFrame, projectFilePath);
_mapView.exportGraphics(m_Doc, mapFrame, _mapView.getGraphicCollection().getGraphics()); _mapView.exportGraphics(m_Doc, mapFrame, (List<Graphic>) _mapView.getGraphicCollection().getGraphics());
parent.appendChild(mapFrame); parent.appendChild(mapFrame);
} }

View File

@ -8960,7 +8960,7 @@ public class MapView extends JPanel implements IWebMapPanel {
* Remove selected graphics * Remove selected graphics
*/ */
public void removeSelectedGraphics() { public void removeSelectedGraphics() {
UndoableEdit edit = (new MapViewUndoRedo()).new RemoveGraphicsEdit(this, _selectedGraphics.getGraphics()); UndoableEdit edit = (new MapViewUndoRedo()).new RemoveGraphicsEdit(this, (List<Graphic>)_selectedGraphics.getGraphics());
this.fireUndoEditEvent(edit); this.fireUndoEditEvent(edit);
for (Graphic aGraphic : _selectedGraphics.getGraphics()) { for (Graphic aGraphic : _selectedGraphics.getGraphics()) {
removeGraphic(aGraphic); removeGraphic(aGraphic);
@ -9669,7 +9669,7 @@ public class MapView extends JPanel implements IWebMapPanel {
//Load label graphics //Load label graphics
GraphicCollection gc = loadGraphicCollection((Element) aVLayer); GraphicCollection gc = loadGraphicCollection((Element) aVLayer);
aLayer.setLabelPoints(gc.getGraphics()); aLayer.setLabelPoints((List<Graphic>) gc.getGraphics());
//Load chart set //Load chart set
NodeList chartNodes = ((Element) aVLayer).getElementsByTagName("ChartSet"); NodeList chartNodes = ((Element) aVLayer).getElementsByTagName("ChartSet");

View File

@ -274,12 +274,12 @@ package org.meteoinfo.geometry.graphic;
/** /**
* Get graphic list * Get graphic list
* @return Graphic list * @return Graphic list
*/ *//*
public List<Graphic> getGraphics() { public List<Graphic> getGraphics() {
List<Graphic> gs = new ArrayList<>(); List<Graphic> gs = new ArrayList<>();
gs.add(this); gs.add(this);
return gs; return gs;
} }*/
private void updateResizeAbility() { private void updateResizeAbility() {
if (shape != null && legend != null) { if (shape != null && legend != null) {

View File

@ -34,7 +34,7 @@ import java.util.NoSuchElementException;
public class GraphicCollection extends Graphic implements Iterator { public class GraphicCollection extends Graphic implements Iterator {
// <editor-fold desc="Variables"> // <editor-fold desc="Variables">
protected List<Graphic> graphics = new ArrayList<>(); protected List<? extends Graphic> graphics = new ArrayList<>();
protected Extent extent = new Extent(); protected Extent extent = new Extent();
protected boolean singleLegend = true; protected boolean singleLegend = true;
protected int index; protected int index;
@ -89,8 +89,7 @@ public class GraphicCollection extends Graphic implements Iterator {
* *
* @return Graphic list * @return Graphic list
*/ */
@Override public List<? extends Graphic> getGraphics() {
public List<Graphic> getGraphics() {
return this.graphics; return this.graphics;
} }
@ -276,7 +275,7 @@ public class GraphicCollection extends Graphic implements Iterator {
* @return Boolean * @return Boolean
*/ */
public boolean add(Graphic aGraphic) { public boolean add(Graphic aGraphic) {
boolean istrue = this.graphics.add(aGraphic); boolean istrue = ((List<Graphic>) this.graphics).add(aGraphic);
//Update extent //Update extent
if (this.graphics.size() == 1) { if (this.graphics.size() == 1) {
@ -295,7 +294,7 @@ public class GraphicCollection extends Graphic implements Iterator {
* @param aGraphic The graphic * @param aGraphic The graphic
*/ */
public void add(int index, Graphic aGraphic) { public void add(int index, Graphic aGraphic) {
this.graphics.add(index, aGraphic); ((List<Graphic>) this.graphics).add(index, aGraphic);
//Update extent //Update extent
if (this.graphics.size() == 1) { if (this.graphics.size() == 1) {
@ -380,7 +379,7 @@ public class GraphicCollection extends Graphic implements Iterator {
* @param graphic The graphic * @param graphic The graphic
*/ */
public void setGraphicN(int idx, Graphic graphic) { public void setGraphicN(int idx, Graphic graphic) {
this.graphics.set(idx, graphic); ((List<Graphic>) this.graphics).set(idx, graphic);
} }
/** /**
@ -422,7 +421,7 @@ public class GraphicCollection extends Graphic implements Iterator {
* @param gs Graphic list * @param gs Graphic list
*/ */
public void addAll(List<Graphic> gs) { public void addAll(List<Graphic> gs) {
this.graphics.addAll(gs); ((List<Graphic>) this.graphics).addAll(gs);
// Update extent // Update extent
int i = 0; int i = 0;
@ -453,7 +452,7 @@ public class GraphicCollection extends Graphic implements Iterator {
extent = MIMath.getLagerExtent(extent, graphic.getExtent()); extent = MIMath.getLagerExtent(extent, graphic.getExtent());
} }
for (int i = 0; i < graphic.getNumGraphics(); i++) { for (int i = 0; i < graphic.getNumGraphics(); i++) {
this.graphics.add(graphic.getGraphicN(i)); ((List<Graphic>) this.graphics).add(graphic.getGraphicN(i));
} }
} else { } else {
this.add(graphic); this.add(graphic);

View File

@ -132,6 +132,14 @@ public class Line2DGraphic extends Graphic {
this.curve = value; this.curve = value;
} }
/**
* Get x data
* @return X data
*/
public Array getXData() {
return this.xData;
}
/** /**
* Set x data * Set x data
* @param xData X data * @param xData X data
@ -141,6 +149,14 @@ public class Line2DGraphic extends Graphic {
updateShape(); updateShape();
} }
/**
* Get y data
* @return Y data
*/
public Array getYData() {
return this.yData;
}
/** /**
* Set y data * Set y data
* @param yData Y data * @param yData Y data
@ -150,6 +166,14 @@ public class Line2DGraphic extends Graphic {
updateShape(); updateShape();
} }
/**
* Get data
* @return Data
*/
public Array getData() {
return this.cData;
}
/** /**
* Set data * Set data
* @param xData X data * @param xData X data

View File

@ -0,0 +1,55 @@
package org.meteoinfo.geometry.graphic;
import org.meteoinfo.geometry.legend.PointBreak;
import org.meteoinfo.geometry.shape.PointShape;
public class Point2DGraphic extends Graphic {
double x, y;
/**
* Constructor
* @param pointShape Point shape
* @param pointBreak Point break
*/
public Point2DGraphic(PointShape pointShape, PointBreak pointBreak) {
this.shape = pointShape;
this.legend = pointBreak;
this.x = pointShape.getPoint().X;
this.y = pointShape.getPoint().Y;
}
/**
* Get x
* @return X
*/
public double getX() {
return this.x;
}
/**
* Set x
* @param value X
*/
public void setX(double value) {
this.x = value;
((PointShape) this.shape).getPoint().X = value;
}
/**
* Get y
* @return Y
*/
public double getY() {
return this.y;
}
/**
* Set y
* @param value Y
*/
public void setY(double value) {
this.y = value;
((PointShape) this.shape).getPoint().Y = value;
}
}

View File

@ -0,0 +1,149 @@
package org.meteoinfo.geometry.graphic;
import org.meteoinfo.common.PointD;
import org.meteoinfo.geometry.legend.ColorBreak;
import org.meteoinfo.geometry.legend.LegendScheme;
import org.meteoinfo.geometry.legend.LegendType;
import org.meteoinfo.geometry.legend.PointBreak;
import org.meteoinfo.geometry.shape.PointShape;
import org.meteoinfo.geometry.shape.PolylineShape;
import org.meteoinfo.geometry.shape.Shape;
import org.meteoinfo.ndarray.Array;
import org.meteoinfo.ndarray.IndexIterator;
import java.util.ArrayList;
import java.util.List;
public class Point2DGraphicCollection extends GraphicCollection {
private Array xData;
private Array yData;
private Array cData;
/**
* Constructor
*/
public Point2DGraphicCollection() {
super();
this.graphics = new ArrayList<Point2DGraphic>();
this.legend = new PointBreak();
}
/**
* Constructor
* @param graphics Graphics
*/
public Point2DGraphicCollection(List<Point2DGraphic> graphics) {
this();
this.graphics = graphics;
}
/**
* Constructor
* @param xData X data
* @param yData Y data
* @param pointBreak Point break
*/
public Point2DGraphicCollection(Array xData, Array yData, PointBreak pointBreak) {
this();
this.xData = xData;
this.yData = yData;
this.legend = pointBreak;
this.updateGraphics(pointBreak);
}
/**
* Constructor
* @param xData X data
* @param yData Y data
* @param cData Color data
* @param ls Legend scheme
*/
public Point2DGraphicCollection(Array xData, Array yData, Array cData, LegendScheme ls) {
this();
this.xData = xData;
this.yData = yData;
this.cData = cData;
this.legendScheme = ls;
this.updateGraphics(ls);
}
/**
* Get x data
* @return X data
*/
public Array getXData() {
return this.xData;
}
/**
* Get y data
* @return Y data
*/
public Array getYData() {
return this.yData;
}
/**
* Set data
* @return Data
*/
public Array getData() {
return this.cData;
}
protected void updateGraphics() {
updateGraphics((PointBreak) this.legend);
}
protected void updateGraphics(PointBreak pointBreak) {
this.graphics = new ArrayList<>();
List<PointD> points = new ArrayList<>();
IndexIterator xIter = this.xData.getIndexIterator();
IndexIterator yIter = this.yData.getIndexIterator();
double x, y;
while (xIter.hasNext()) {
x = xIter.getDoubleNext();
y = yIter.getDoubleNext();
if (Double.isNaN(x) || Double.isNaN(y)) {
continue;
}
PointShape shape = new PointShape(new PointD(x, y));
this.add(new Point2DGraphic(shape, pointBreak));
}
}
protected void updateGraphics(LegendScheme ls) {
this.graphics = new ArrayList<Graphic>();
PointShape ps;
double z;
ColorBreak cb;
IndexIterator xIter = this.xData.getIndexIterator();
IndexIterator yIter = this.yData.getIndexIterator();
IndexIterator zIter = this.cData.getIndexIterator();
if (ls.getLegendType() == LegendType.UNIQUE_VALUE && this.xData.getSize() == ls.getBreakNum()) {
int i = 0;
while (xIter.hasNext()) {
ps = new PointShape();
ps.setPoint(new PointD(xIter.getDoubleNext(), yIter.getDoubleNext()));
z = zIter.getDoubleNext();
ps.setValue(z);
cb = ls.getLegendBreak(i);
this.add(new Graphic(ps, cb));
i += 1;
}
} else {
while (xIter.hasNext()) {
ps = new PointShape();
ps.setPoint(new PointD(xIter.getDoubleNext(), yIter.getDoubleNext()));
z = zIter.getDoubleNext();
ps.setValue(z);
cb = ls.findLegendBreak(z);
if (cb != null) {
this.add(new Graphic(ps, cb));
}
}
}
this.setSingleLegend(false);
this.setLegendScheme(ls);
}
}

View File

@ -1,32 +1,32 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<MeteoInfo File="milconfig.xml" Type="configurefile"> <MeteoInfo File="milconfig.xml" Type="configurefile">
<Path OpenPath="D:\Working\MIScript\Jython\mis\array"> <Path OpenPath="D:\Working\MIScript\Jython\mis\plot_types\scatter">
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\plot"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\polar"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\scatter"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\step"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\taylor"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\violinplot"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\weather"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\wind"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\meteo"/> <RecentFolder Folder="D:\Working\MIScript\Jython\mis\meteo"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\common_math\fitting"/> <RecentFolder Folder="D:\Working\MIScript\Jython\mis\common_math\fitting"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\common_math"/> <RecentFolder Folder="D:\Working\MIScript\Jython\mis\common_math"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\common_math\linalg"/> <RecentFolder Folder="D:\Working\MIScript\Jython\mis\common_math\linalg"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\array"/> <RecentFolder Folder="D:\Working\MIScript\Jython\mis\array"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\io"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\io\netcdf"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\io\radar"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\volume"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\dataframe"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\scatter"/>
</Path> </Path>
<File> <File>
<OpenedFiles> <OpenedFiles>
<OpenedFile File="D:\Working\MIScript\Jython\mis\map\geoshow\geoshow_2.py"/> <OpenedFile File="D:\Working\MIScript\Jython\mis\map\geoshow\geoshow_2.py"/>
<OpenedFile File="D:\Working\MIScript\Jython\mis\common_math\polynomial\polyder_1.py"/> <OpenedFile File="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\volume\plot_cuace_3d_volume.py"/>
<OpenedFile File="D:\Working\MIScript\Jython\mis\array\convolve_1.py"/> <OpenedFile File="D:\Working\MIScript\Jython\mis\plot_types\scatter\scatterm_grid.py"/>
</OpenedFiles> </OpenedFiles>
<RecentFiles> <RecentFiles>
<RecentFile File="D:\Working\MIScript\Jython\mis\map\geoshow\geoshow_2.py"/> <RecentFile File="D:\Working\MIScript\Jython\mis\map\geoshow\geoshow_2.py"/>
<RecentFile File="D:\Working\MIScript\Jython\mis\common_math\polynomial\polyder_1.py"/> <RecentFile File="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\volume\plot_cuace_3d_volume.py"/>
<RecentFile File="D:\Working\MIScript\Jython\mis\array\convolve_1.py"/> <RecentFile File="D:\Working\MIScript\Jython\mis\plot_types\scatter\scatterm_grid.py"/>
</RecentFiles> </RecentFiles>
</File> </File>
<Font> <Font>
@ -34,5 +34,5 @@
</Font> </Font>
<LookFeel DockWindowDecorated="true" LafDecorated="true" Name="FlatDarkLaf"/> <LookFeel DockWindowDecorated="true" LafDecorated="true" Name="FlatDarkLaf"/>
<Figure DoubleBuffering="true"/> <Figure DoubleBuffering="true"/>
<Startup MainFormLocation="-7,0" MainFormSize="1400,825"/> <Startup MainFormLocation="-7,-7" MainFormSize="1293,685"/>
</MeteoInfo> </MeteoInfo>

View File

@ -11,7 +11,6 @@
<properties> <properties>
<maven.compiler.source>8</maven.compiler.source> <maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target> <maven.compiler.target>8</maven.compiler.target>
<flatlaf.version>3.3</flatlaf.version>
</properties> </properties>
<dependencies> <dependencies>
<dependency> <dependency>
@ -29,16 +28,6 @@
<artifactId>meteoinfo-console</artifactId> <artifactId>meteoinfo-console</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<dependency>
<groupId>com.formdev</groupId>
<artifactId>flatlaf</artifactId>
<version>${flatlaf.version}</version>
</dependency>
<dependency>
<groupId>com.formdev</groupId>
<artifactId>flatlaf-extras</artifactId>
<version>${flatlaf.version}</version>
</dependency>
<dependency> <dependency>
<groupId>de.sciss</groupId> <groupId>de.sciss</groupId>
<artifactId>docking-frames-common</artifactId> <artifactId>docking-frames-common</artifactId>

View File

@ -1084,7 +1084,7 @@ class DataFrame(object):
def to_csv(self, filepath, delimiter=',', format=None, date_format=None, \ def to_csv(self, filepath, delimiter=',', format=None, date_format=None, \
float_format=None, index=True): float_format=None, index=True):
""" """
Save the data to an csv file. Save the data to a csv file.
:param filepath: (*string*) The output file path. :param filepath: (*string*) The output file path.
:param delimiter: (*string*) Field delimiter character. Default is ``,``. :param delimiter: (*string*) Field delimiter character. Default is ``,``.

View File

@ -285,7 +285,7 @@ def date_range(start=None, end=None, periods=None, freq='D'):
:param start: (*string or datetime*) Start date time. :param start: (*string or datetime*) Start date time.
:param end: (*string or datetime*) End date time. :param end: (*string or datetime*) End date time.
:param periods: (*int*) Periods number. :param periods: (*int*) Periods number.
:param freq: (*string*) Date time frequent value [ Y | M | D | H | m | S ]. :param freq: (*string*) Date time frequent value [ Y | M | D | h | min | s ].
:returns: (*DateTimeIndex*) DateTimeIndex :returns: (*DateTimeIndex*) DateTimeIndex
""" """

View File

@ -27,6 +27,7 @@ from org.meteoinfo.data.mapdata.webmap import WebMapProvider, DefaultTileFactory
from java.awt import Font, Color from java.awt import Font, Color
from ._axes import Axes from ._axes import Axes
from .graphic import Point2DCollection
import mipylib.numeric as np import mipylib.numeric as np
from mipylib.numeric.core import NDArray, DimArray from mipylib.numeric.core import NDArray, DimArray
from mipylib.geolib.milayer import MILayer from mipylib.geolib.milayer import MILayer
@ -838,9 +839,11 @@ class MapAxes(Axes):
proj = kwargs.pop('proj', migeo.projinfo()) proj = kwargs.pop('proj', migeo.projinfo())
# Create graphics # Create graphics
if a.ndim == 0: if a.ndim == 0:
graphics = GraphicFactory.createPoints(x._array, y._array, ls.getLegendBreak(0)) #graphics = GraphicFactory.createPoints(x._array, y._array, ls.getLegendBreak(0))
graphics = Point2DCollection(x._array, y._array, legend=ls.getLegendBreaks(0))
else: else:
graphics = GraphicFactory.createPoints(x._array, y._array, a._array, ls) #graphics = GraphicFactory.createPoints(x._array, y._array, a._array, ls)
graphics = Point2DCollection(x._array, y._array, a._array, ls)
antialias = kwargs.pop('antialias', None) antialias = kwargs.pop('antialias', None)
if antialias is not None: if antialias is not None:

View File

@ -1,7 +1,9 @@
from .artist import * from .artist import *
from .lines import * from .lines import *
from .patches import * from .patches import *
from .collections import *
__all__ = lines.__all__ __all__ = lines.__all__
__all__ += patches.__all__ __all__ += patches.__all__
__all__ += artist.__all__ __all__ += artist.__all__
__all__ += collections.__all__

View File

@ -0,0 +1,84 @@
from org.meteoinfo.geometry.graphic import GraphicCollection, Point2DGraphicCollection
from java.awt import Font
from .. import plotutil
from ... import miutil
from artist import Artist
import mipylib.numeric as np
__all__ = ['Point2DCollection']
class Collection(Artist):
def __init__(self):
"""
Class init.
:param graphics: (*GraphicCollection*) Graphics
"""
Artist.__init__(self)
def addlabels(self, **kwargs):
"""
Add labels
:param fontname: (*string*) Font name. Default is ``Arial``.
:param fontsize: (*string*) Font size. Default is ``14``.
:param bold: (*boolean*) Font bold or not. Default is ``False``.
:param color: (*color*) Label color. Default is ``None`` with black color.
:param xoffset: (*int*) X coordinate offset. Default is ``0``.
:param yoffset: (*int*) Y coordinate offset. Default is ``0``.
:param avoidcoll: (*boolean*) Avoid labels collision or not. Default is ``True``.
:param decimals: (*int*) Number of decimals of labels.
"""
labelset = self.getLabelSet()
fontname = kwargs.pop('fontname', 'Arial')
fontsize = kwargs.pop('fontsize', 14)
bold = kwargs.pop('bold', False)
if bold:
font = Font(fontname, Font.BOLD, fontsize)
else:
font = Font(fontname, Font.PLAIN, fontsize)
labelset.setLabelFont(font)
color = kwargs.pop('color', None)
if not color is None:
color = miutil.getcolor(color)
labelset.setLabelColor(color)
xoffset = kwargs.pop('xoffset', 0)
labelset.setXOffset(xoffset)
yoffset = kwargs.pop('yoffset', 0)
labelset.setYOffset(yoffset)
avoidcoll = kwargs.pop('avoidcoll', True)
labelset.setAvoidCollision(avoidcoll)
decimals = kwargs.pop('decimals', None)
if not decimals is None:
labelset.setAutoDecimal(False)
labelset.setDecimalDigits(decimals)
self.addLabels()
class Point2DCollection(Collection, Point2DGraphicCollection):
def __init__(self, xdata, ydata, cdata=None, legend=None, **kwargs):
"""
Class init
:param xdata: (*Array*) X data array.
:param ydata: (*Array*) Y data array.
:param cdata: (*Array*) Color data array.
:param legend: (*Legend*) Point legend.
"""
Collection.__init__(self)
if legend is None:
legend = plotutil.getlegendbreak('point', **kwargs)[0]
self._x = np.asarray(xdata)
self._y = np.asarray(ydata)
self._cdata = np.asarray(cdata)
if cdata is None:
Point2DGraphicCollection.__init__(self, self._x._array, self._y._array, legend)
else:
Point2DGraphicCollection.__init__(self, self._x._array, self._y._array, self._cdata._array, legend)

View File

@ -624,9 +624,7 @@ def getlegendscheme(args, min, max, **kwargs):
ls = kwargs.pop('symbolspec', None) ls = kwargs.pop('symbolspec', None)
if ls is None: if ls is None:
extend = kwargs.pop('extend', None) extend = kwargs.pop('extend', None)
if extend is None: if extend is not None:
extend = ExtendType.NONE
else:
extend = ExtendType.valueOf(extend.upper()) extend = ExtendType.valueOf(extend.upper())
cmap = getcolormap(**kwargs) cmap = getcolormap(**kwargs)
level_arg = kwargs.pop('levels', None) level_arg = kwargs.pop('levels', None)

View File

@ -35,7 +35,7 @@
<properties> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version> <java.version>1.8</java.version>
<revision>3.8.5</revision> <revision>3.8.6</revision>
<maven.compiler.source>8</maven.compiler.source> <maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target> <maven.compiler.target>8</maven.compiler.target>
<maven.compiler.release>8</maven.compiler.release> <maven.compiler.release>8</maven.compiler.release>