add avoidcoll argument in barbs, quiver and stationmodel functions

This commit is contained in:
wyq 2024-03-19 22:32:41 +08:00
parent 72fb07ad15
commit 4eefdbb7da
10 changed files with 112 additions and 56 deletions

View File

@ -22,6 +22,7 @@ import java.util.List;
import org.meteoinfo.chart.jogl.GLPlot; import org.meteoinfo.chart.jogl.GLPlot;
import org.meteoinfo.chart.geo.MapPlot; import org.meteoinfo.chart.geo.MapPlot;
import org.meteoinfo.chart.plot.AbstractPlot2D;
import org.meteoinfo.chart.plot.Plot; import org.meteoinfo.chart.plot.Plot;
import org.meteoinfo.common.PointF; import org.meteoinfo.common.PointF;
@ -520,8 +521,8 @@ public class Chart {
plot.setPlotShrink(this.getPlotShrink(g, plotArea, plot)); plot.setPlotShrink(this.getPlotShrink(g, plotArea, plot));
} }
} }
if (plot instanceof MapPlot) { if (plot instanceof AbstractPlot2D) {
((MapPlot) plot).setAntialias(this.antiAlias); ((AbstractPlot2D) plot).setAntiAlias(this.antiAlias);
} }
if (plot instanceof GLPlot) { if (plot instanceof GLPlot) {
Rectangle2D graphArea = plot.getPositionArea(); Rectangle2D graphArea = plot.getPositionArea();

View File

@ -9,6 +9,7 @@ import com.jogamp.opengl.util.gl2.GLUT;
import org.meteoinfo.chart.jogl.GLPlot; import org.meteoinfo.chart.jogl.GLPlot;
import org.meteoinfo.chart.jogl.Program; import org.meteoinfo.chart.jogl.Program;
import org.meteoinfo.chart.geo.MapPlot; import org.meteoinfo.chart.geo.MapPlot;
import org.meteoinfo.chart.plot.AbstractPlot2D;
import org.meteoinfo.chart.plot.Plot; import org.meteoinfo.chart.plot.Plot;
import org.meteoinfo.common.PointF; import org.meteoinfo.common.PointF;
@ -576,8 +577,8 @@ public class GLChart implements GLEventListener {
plot.setPlotShrink(this.getPlotShrink(g, plotArea, plot)); plot.setPlotShrink(this.getPlotShrink(g, plotArea, plot));
} }
} }
if (plot instanceof MapPlot) { if (plot instanceof AbstractPlot2D) {
((MapPlot) plot).setAntialias(this.antialias); ((AbstractPlot2D) plot).setAntiAlias(this.antialias);
} }
if (plot instanceof GLPlot) { if (plot instanceof GLPlot) {
Rectangle2D graphArea = plot.getPositionArea(); Rectangle2D graphArea = plot.getPositionArea();

View File

@ -54,7 +54,6 @@ public class MapPlot extends Plot2D implements IWebMapPanel {
// <editor-fold desc="Variables"> // <editor-fold desc="Variables">
private ProjectionInfo projInfo; private ProjectionInfo projInfo;
private boolean antialias;
protected TileLoadListener tileLoadListener = new TileLoadListener(this); protected TileLoadListener tileLoadListener = new TileLoadListener(this);
private IChartPanel parent; private IChartPanel parent;
private float[] lonLim; private float[] lonLim;
@ -81,7 +80,6 @@ public class MapPlot extends Plot2D implements IWebMapPanel {
super(); super();
this.projInfo = projInfo; this.projInfo = projInfo;
this.antialias = false;
this.aspectType = AspectType.EQUAL; this.aspectType = AspectType.EQUAL;
this.gridLine = new MapGridLine(projInfo); this.gridLine = new MapGridLine(projInfo);
this.gridLine.setTop(true); this.gridLine.setTop(true);
@ -140,24 +138,6 @@ public class MapPlot extends Plot2D implements IWebMapPanel {
return PlotType.XY2D; return PlotType.XY2D;
} }
/**
* Get if is antialias
*
* @return Boolean
*/
public boolean isAntialias() {
return this.antialias;
}
/**
* Set if is antialias
*
* @param value Boolean
*/
public void setAntialias(boolean value) {
this.antialias = value;
}
/** /**
* Get projection info * Get projection info
* *

View File

@ -1335,6 +1335,10 @@ public abstract class AbstractPlot2D extends Plot {
Object rendering = g.getRenderingHint(RenderingHints.KEY_ANTIALIASING); Object rendering = g.getRenderingHint(RenderingHints.KEY_ANTIALIASING);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
for (ChartLegend legend : this.legends) { for (ChartLegend legend : this.legends) {
if (this.antiAlias) {
legend.setAntiAlias(true);
}
if (legend.isColorbar()) { if (legend.isColorbar()) {
if (legend.getPlotOrientation() == PlotOrientation.VERTICAL) { if (legend.getPlotOrientation() == PlotOrientation.VERTICAL) {
legend.setHeight((int) (graphArea.getHeight() * legend.getShrink())); legend.setHeight((int) (graphArea.getHeight() * legend.getShrink()));

View File

@ -316,20 +316,73 @@ public class Plot2D extends AbstractPlot2D {
} }
ColorBreak cb = graphic.getLegend(); ColorBreak cb = graphic.getLegend();
for (int i = 0; i < graphic.getNumGraphics(); i++) {
Graphic gg = graphic.getGraphicN(i);
if (gg.getExtent().intersects(this.drawExtent)) {
if (!graphic.isSingleLegend()) {
cb = gg.getLegend();
}
drawGraphic(g, gg, cb, area);
}
}
if (graphic instanceof GraphicCollection) { if (graphic instanceof GraphicCollection) {
if (((GraphicCollection) graphic).isAvoidCollision() && graphic.getShapeType().isPoint()) {
List<Extent> extentList = new ArrayList<>();
Extent maxExtent = new Extent();
Extent ext = new Extent();
PointD point;
double[] xy;
float size;
for (int i = 0; i < graphic.getNumGraphics(); i++) {
Graphic gg = graphic.getGraphicN(i);
if (gg.getExtent().intersects(this.drawExtent)) {
if (!graphic.isSingleLegend()) {
cb = gg.getLegend();
}
PointShape shape = (PointShape) gg.getShape();
PointBreak pointBreak = (PointBreak) cb;
point = shape.getPoint();
xy = projToScreen(point.X, point.Y, area);
size = pointBreak.getSize() / 2;
ext.minX = xy[0] - size;
ext.maxX = xy[0] + size;
ext.minY = xy[1] - size;
ext.maxY = xy[1] + size;
if (extentList.isEmpty()) {
maxExtent = (Extent) ext.clone();
extentList.add((Extent) ext.clone());
drawGraphic(g, gg, cb, area);
} else if (!MIMath.isExtentCross(ext, maxExtent)) {
extentList.add((Extent) ext.clone());
maxExtent = MIMath.getLagerExtent(maxExtent, ext);
drawGraphic(g, gg, cb, area);
} else {
boolean ifDraw = true;
for (int j = 0; j < extentList.size(); j++) {
if (MIMath.isExtentCross(ext, extentList.get(j))) {
ifDraw = false;
break;
}
}
if (ifDraw) {
extentList.add((Extent) ext.clone());
maxExtent = MIMath.getLagerExtent(maxExtent, ext);
drawGraphic(g, gg, cb, area);
}
}
}
}
} else {
for (int i = 0; i < graphic.getNumGraphics(); i++) {
Graphic gg = graphic.getGraphicN(i);
if (gg.getExtent().intersects(this.drawExtent)) {
if (!graphic.isSingleLegend()) {
cb = gg.getLegend();
}
drawGraphic(g, gg, cb, area);
}
}
}
GraphicCollection gc = (GraphicCollection) graphic; GraphicCollection gc = (GraphicCollection) graphic;
if (gc.getLabelSet().isDrawLabels()) { if (gc.getLabelSet().isDrawLabels()) {
this.drawLabels(g, gc, area); this.drawLabels(g, gc, area);
} }
} else {
if (graphic.getExtent().intersects(this.drawExtent)) {
drawGraphic(g, graphic, cb, area);
}
} }
if (graphic.isClip()) { if (graphic.isClip()) {

View File

@ -258,7 +258,7 @@ 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;

View File

@ -579,7 +579,11 @@ public class GraphicCollection extends Graphic implements Iterator {
*/ */
@Override @Override
public ShapeTypes getShapeType() { public ShapeTypes getShapeType() {
return this.graphics.get(0).getShape().getShapeType(); if (this.graphics.isEmpty()) {
return null;
} else {
return this.graphics.get(0).getShape().getShapeType();
}
} }
private double getMinValue() { private double getMinValue() {

View File

@ -1,34 +1,34 @@
<?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\io\geotiff"> <Path OpenPath="D:\Working\MIScript\Jython\mis\plot_types\wind">
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\test"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\traj"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\dataframe"/>
<RecentFolder Folder="D:\MyProgram\java\MeteoInfoDev\MeteoInfo\meteoinfo-lab"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\funny"/> <RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\funny"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\plot"/> <RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\plot"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\io\burf"/> <RecentFolder Folder="D:\Working\MIScript\Jython\mis\io\burf"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\meteo"/> <RecentFolder Folder="D:\Working\MIScript\Jython\mis\meteo"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\meteo\wrf"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis"/> <RecentFolder Folder="D:\Working\MIScript\Jython\mis"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\chart"/> <RecentFolder Folder="D:\Working\MIScript\Jython\mis\chart"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\chart\legend"/> <RecentFolder Folder="D:\Working\MIScript\Jython\mis\chart\legend"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\io"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\io\geotiff"/> <RecentFolder Folder="D:\Working\MIScript\Jython\mis\io\geotiff"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\meteo\wrf"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\contour"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\io"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\io\awx"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\weather"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\wind"/>
</Path> </Path>
<File> <File>
<OpenedFiles> <OpenedFiles>
<OpenedFile File="D:\Working\MIScript\Jython\mis\plot_types\funny\flower_1.py"/>
<OpenedFile File="D:\Working\MIScript\Jython\mis\meteo\calc\frontogenesis.py"/> <OpenedFile File="D:\Working\MIScript\Jython\mis\meteo\calc\frontogenesis.py"/>
<OpenedFile File="D:\Working\MIScript\Jython\mis\io\geotiff\geotiff_dem_3.py"/> <OpenedFile File="D:\Working\MIScript\Jython\mis\io\awx\awx_fy2g_amv.py"/>
<OpenedFile File="D:\Working\MIScript\Jython\mis\io\geotiff\geotiff_dem_2.py"/> <OpenedFile File="D:\Working\MIScript\Jython\mis\plot_types\weather\stationmodel.py"/>
<OpenedFile File="D:\Working\MIScript\Jython\mis\plot_types\wind\quiverm_5.py"/>
</OpenedFiles> </OpenedFiles>
<RecentFiles> <RecentFiles>
<RecentFile File="D:\Working\MIScript\Jython\mis\plot_types\funny\flower_1.py"/>
<RecentFile File="D:\Working\MIScript\Jython\mis\meteo\calc\frontogenesis.py"/> <RecentFile File="D:\Working\MIScript\Jython\mis\meteo\calc\frontogenesis.py"/>
<RecentFile File="D:\Working\MIScript\Jython\mis\io\geotiff\geotiff_dem_3.py"/> <RecentFile File="D:\Working\MIScript\Jython\mis\io\awx\awx_fy2g_amv.py"/>
<RecentFile File="D:\Working\MIScript\Jython\mis\io\geotiff\geotiff_dem_2.py"/> <RecentFile File="D:\Working\MIScript\Jython\mis\plot_types\weather\stationmodel.py"/>
<RecentFile File="D:\Working\MIScript\Jython\mis\plot_types\wind\quiverm_5.py"/>
</RecentFiles> </RecentFiles>
</File> </File>
<Font> <Font>
@ -36,5 +36,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="1363,778"/> <Startup MainFormLocation="-7,-7" MainFormSize="1293,685"/>
</MeteoInfo> </MeteoInfo>

View File

@ -1270,9 +1270,9 @@ class MapAxes(Axes):
:param size: (*float*) Base size of the arrows. :param size: (*float*) Base size of the arrows.
:param proj: (*ProjectionInfo*) Map projection of the data. Default is None. :param proj: (*ProjectionInfo*) Map projection of the data. Default is None.
:param zorder: (*int*) Z-order of created layer for display. :param zorder: (*int*) Z-order of created layer for display.
:param select: (*boolean*) Set the return layer as selected layer or not. :param avoidcoll: (*boolean*) Avoid graphic collision or not.
:returns: (*VectoryLayer*) Created barbs VectoryLayer. :returns: (*graphics*) Created barbs graphics.
""" """
cmap = plotutil.getcolormap(**kwargs) cmap = plotutil.getcolormap(**kwargs)
fill_value = kwargs.pop('fill_value', -9999.0) fill_value = kwargs.pop('fill_value', -9999.0)
@ -1339,6 +1339,10 @@ class MapAxes(Axes):
if antialias is not None: if antialias is not None:
graphics.setAntiAlias(antialias) graphics.setAntiAlias(antialias)
avoidcoll = kwargs.pop('avoidcoll', None)
if avoidcoll is not None:
graphics.setAvoidCollision(avoidcoll)
visible = kwargs.pop('visible', True) visible = kwargs.pop('visible', True)
if visible: if visible:
zorder = kwargs.pop('zorder', None) zorder = kwargs.pop('zorder', None)
@ -1357,7 +1361,7 @@ class MapAxes(Axes):
:param u: (*array_like*) U component of the arrow vectors (wind field) or wind direction. :param u: (*array_like*) U component of the arrow vectors (wind field) or wind direction.
:param v: (*array_like*) V component of the arrow vectors (wind field) or wind speed. :param v: (*array_like*) V component of the arrow vectors (wind field) or wind speed.
:param z: (*array_like*) Optional, 2-D z value array. :param z: (*array_like*) Optional, 2-D z value array.
:param levs: (*array_like*) Optional. A list of floating point numbers indicating the level :param levels: (*array_like*) Optional. A list of floating point numbers indicating the level
barbs to draw, in increasing order. barbs to draw, in increasing order.
:param cmap: (*string*) Color map string. :param cmap: (*string*) Color map string.
:param fill_value: (*float*) Fill_value. Default is ``-9999.0``. :param fill_value: (*float*) Fill_value. Default is ``-9999.0``.
@ -1365,9 +1369,9 @@ class MapAxes(Axes):
:param size: (*float*) Base size of the arrows. Default is 10. :param size: (*float*) Base size of the arrows. Default is 10.
:param proj: (*ProjectionInfo*) Map projection of the data. Default is None. :param proj: (*ProjectionInfo*) Map projection of the data. Default is None.
:param zorder: (*int*) Z-order of created layer for display. :param zorder: (*int*) Z-order of created layer for display.
:param select: (*boolean*) Set the return layer as selected layer or not. :param avoidcoll: (*boolean*) Avoid graphic collision or not.
:returns: (*VectoryLayer*) Created barbs VectoryLayer. :returns: (*GraphicCollection*) Created barbs graphic collection.
""" """
cmap = plotutil.getcolormap(**kwargs) cmap = plotutil.getcolormap(**kwargs)
fill_value = kwargs.pop('fill_value', -9999.0) fill_value = kwargs.pop('fill_value', -9999.0)
@ -1431,6 +1435,10 @@ class MapAxes(Axes):
if antialias is not None: if antialias is not None:
graphics.setAntiAlias(antialias) graphics.setAntiAlias(antialias)
avoidcoll = kwargs.pop('avoidcoll', None)
if avoidcoll is not None:
graphics.setAvoidCollision(avoidcoll)
proj = kwargs.pop('proj', migeo.projinfo()) proj = kwargs.pop('proj', migeo.projinfo())
visible = kwargs.pop('visible', True) visible = kwargs.pop('visible', True)
if visible: if visible:
@ -1528,7 +1536,8 @@ class MapAxes(Axes):
:param surface: (*boolean*) Is surface data or not. Default is True. :param surface: (*boolean*) Is surface data or not. Default is True.
:param size: (*float*) Size of the station model symbols. Default is 12. :param size: (*float*) Size of the station model symbols. Default is 12.
:param proj: (*ProjectionInfo*) Map projection of the data. Default is None. :param proj: (*ProjectionInfo*) Map projection of the data. Default is None.
:param order: (*int*) Z-order of created layer for display. :param zorder: (*int*) Z-order of created layer for display.
:param avoidcoll: (*boolean*) Avoid graphic collision or not.
:returns: (*graphics*) Station model graphics. :returns: (*graphics*) Station model graphics.
""" """
@ -1545,6 +1554,10 @@ class MapAxes(Axes):
if antialias is not None: if antialias is not None:
graphics.setAntiAlias(antialias) graphics.setAntiAlias(antialias)
avoidcoll = kwargs.pop('avoidcoll', None)
if avoidcoll is not None:
graphics.setAvoidCollision(avoidcoll)
visible = kwargs.pop('visible', True) visible = kwargs.pop('visible', True)
if visible: if visible:
zorder = kwargs.pop('zorder', None) zorder = kwargs.pop('zorder', None)