mirror of
https://github.com/meteoinfo/MeteoInfo.git
synced 2025-12-08 20:36:05 +00:00
bugfix for surface griddata interpolation
This commit is contained in:
parent
792307b8cf
commit
a796e5fbc4
@ -29,12 +29,16 @@ public class DimArray {
|
||||
this.dimensions = new ArrayList<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
* @param array The array
|
||||
*/
|
||||
public DimArray(Array array) {
|
||||
this.array = array;
|
||||
this.dimensions = new ArrayList<>();
|
||||
int[] shape = array.getShape();
|
||||
for (int s : shape) {
|
||||
|
||||
this.dimensions.add(new Dimension(s));
|
||||
}
|
||||
}
|
||||
|
||||
@ -137,6 +141,88 @@ public class DimArray {
|
||||
return this.dimensions.get(dimIdx).getDimValue(vIdx);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get stagger dimension
|
||||
* @return Stagger dimension
|
||||
*/
|
||||
public Dimension getStaggerDim() {
|
||||
for (Dimension dim : this.dimensions) {
|
||||
if (dim.isStagger()) {
|
||||
return dim;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get stagger dimension index
|
||||
* @return Stagger dimension index
|
||||
*/
|
||||
public int getStaggerDimIndex() {
|
||||
int i = 0;
|
||||
for (Dimension dim : this.dimensions) {
|
||||
if (dim.isStagger()) {
|
||||
return i;
|
||||
}
|
||||
i += 1;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get X dimension
|
||||
* @return X dimension
|
||||
*/
|
||||
public Dimension getXDimension() {
|
||||
for (Dimension dim : this.dimensions) {
|
||||
if (dim.getDimType() == DimensionType.X) {
|
||||
return dim;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Y dimension
|
||||
* @return Y dimension
|
||||
*/
|
||||
public Dimension getYDimension() {
|
||||
for (Dimension dim : this.dimensions) {
|
||||
if (dim.getDimType() == DimensionType.Y) {
|
||||
return dim;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Z dimension
|
||||
* @return Z dimension
|
||||
*/
|
||||
public Dimension getZDimension() {
|
||||
for (Dimension dim : this.dimensions) {
|
||||
if (dim.getDimType() == DimensionType.Z) {
|
||||
return dim;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get time dimension
|
||||
* @return Time dimension
|
||||
*/
|
||||
public Dimension getTDimension() {
|
||||
for (Dimension dim : this.dimensions) {
|
||||
if (dim.getDimType() == DimensionType.T) {
|
||||
return dim;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Section
|
||||
* @param origin Origin
|
||||
|
||||
@ -40,6 +40,7 @@ public class Dimension {
|
||||
private boolean shared = true;
|
||||
private boolean reverse = false;
|
||||
private String unit = "null";
|
||||
private boolean stagger = false;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
@ -48,6 +49,14 @@ public class Dimension {
|
||||
this("null", 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
* @param len Length
|
||||
*/
|
||||
public Dimension(int len) {
|
||||
this("null", len);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
@ -79,7 +88,7 @@ public class Dimension {
|
||||
public Dimension(String name, Array dimValue, DimensionType dimType) {
|
||||
this.name = name;
|
||||
this.dimType = dimType;
|
||||
this.dimValue = dimValue;
|
||||
this.dimValue = dimValue.copyIfView();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -118,6 +127,19 @@ public class Dimension {
|
||||
this.dimType = dimType;
|
||||
dimValue = ArrayUtil.arrayRange1(min, len, delta);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
* @param dimension Other dimension
|
||||
*/
|
||||
public Dimension(Dimension dimension) {
|
||||
this.name = dimension.getName();
|
||||
this.dimId = dimension.getDimId();
|
||||
this.unit = dimension.getUnit();
|
||||
this.dimType = dimension.getDimType();
|
||||
this.stagger = dimension.isStagger();
|
||||
this.unlimited = dimension.isUnlimited();
|
||||
}
|
||||
// </editor-fold>
|
||||
// <editor-fold desc="Get Set Methods">
|
||||
/**
|
||||
@ -206,7 +228,7 @@ public class Dimension {
|
||||
* @param value Dimension values
|
||||
*/
|
||||
public void setDimValue(Array value) {
|
||||
this.dimValue = value;
|
||||
this.dimValue = value.copyIfView();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -325,6 +347,22 @@ public class Dimension {
|
||||
public void setUnit(String value) {
|
||||
this.unit = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get whether is stagger dimension
|
||||
* @return Whether is stagger dimension
|
||||
*/
|
||||
public boolean isStagger() {
|
||||
return this.stagger;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set whether is stagger dimension
|
||||
* @param value Whether is stagger dimension
|
||||
*/
|
||||
public void setStagger(boolean value) {
|
||||
this.stagger = value;
|
||||
}
|
||||
// </editor-fold>
|
||||
// <editor-fold desc="Methods">
|
||||
|
||||
@ -474,46 +512,38 @@ public class Dimension {
|
||||
* @return Extracted dimension
|
||||
*/
|
||||
public Dimension extract(int first, int last, int stride) {
|
||||
/*int n = (last - first) / stride + 1;
|
||||
int n = (last - first) / stride + 1;
|
||||
Dimension dim = new Dimension(this.getShortName(), n, this.dimType);
|
||||
dim.setDimId(this.dimId);
|
||||
dim.setUnit(this.unit);
|
||||
//dim.setReverse(this.reverse);
|
||||
if (this.dimValue.size() > last) {
|
||||
if (this.dimValue.getSize() > last) {
|
||||
List<Double> values = new ArrayList<>();
|
||||
if (first <= last) {
|
||||
if (stride > 0) {
|
||||
for (int i = first; i <= last; i += stride) {
|
||||
values.add(this.dimValue.get(i));
|
||||
values.add(this.dimValue.getDouble(i));
|
||||
}
|
||||
} else {
|
||||
for (int i = last; i >= first; i += stride) {
|
||||
values.add(this.dimValue.get(i));
|
||||
values.add(this.dimValue.getDouble(i));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (stride > 0) {
|
||||
for (int i = last; i <= first; i += stride) {
|
||||
values.add(this.dimValue.get(i));
|
||||
values.add(this.dimValue.getDouble(i));
|
||||
}
|
||||
} else {
|
||||
for (int i = first; i >= last; i += stride) {
|
||||
values.add(this.dimValue.get(i));
|
||||
values.add(this.dimValue.getDouble(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
dim.setValues(values);
|
||||
}
|
||||
|
||||
return dim;*/
|
||||
|
||||
try {
|
||||
Range range = new Range(first, last, stride);
|
||||
return extract(range);
|
||||
} catch (InvalidRangeException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
return dim;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -586,17 +616,16 @@ public class Dimension {
|
||||
* @return Index
|
||||
*/
|
||||
public int getValueIndex(double v) {
|
||||
return ArrayUtil.getDimIndex(this.dimValue, v);
|
||||
/*int idx = this.dimValue.indexOf(v);
|
||||
int idx = Arrays.asList(this.dimValue).indexOf(v);
|
||||
if (idx < 0) {
|
||||
idx = this.getLength() - 1;
|
||||
if (getDeltaValue() > 0) {
|
||||
for (int i = 0; i < this.getLength(); i++) {
|
||||
if (v <= this.dimValue.get(i)) {
|
||||
if (v <= this.dimValue.getDouble(i)) {
|
||||
if (i == 0)
|
||||
idx = 0;
|
||||
else {
|
||||
if (this.dimValue.get(i) - v > v - this.dimValue.get(i - 1))
|
||||
if (this.dimValue.getDouble(i) - v > v - this.dimValue.getDouble(i - 1))
|
||||
idx = i - 1;
|
||||
else
|
||||
idx = i;
|
||||
@ -606,11 +635,11 @@ public class Dimension {
|
||||
}
|
||||
} else {
|
||||
for (int i = 0; i < this.getLength(); i++) {
|
||||
if (v >= this.dimValue.get(i)) {
|
||||
if (v >= this.dimValue.getDouble(i)) {
|
||||
if (i == 0)
|
||||
idx = 0;
|
||||
else {
|
||||
if (this.dimValue.get(i - 1) - v > v - this.dimValue.get(i))
|
||||
if (this.dimValue.getDouble(i - 1) - v > v - this.dimValue.getDouble(i))
|
||||
idx = i;
|
||||
else
|
||||
idx = i - 1;
|
||||
@ -621,11 +650,7 @@ public class Dimension {
|
||||
}
|
||||
}
|
||||
|
||||
*//*if (this.reverse) {
|
||||
idx = this.getLength() - idx - 1;
|
||||
}*//*
|
||||
|
||||
return idx;*/
|
||||
return idx;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -648,6 +673,8 @@ public class Dimension {
|
||||
sb.append("Size: ").append(String.valueOf(this.getLength()));
|
||||
sb.append("\n");
|
||||
sb.append("Delta: ").append(String.valueOf(this.getDeltaValue()));
|
||||
sb.append("\n");
|
||||
sb.append("Unit: ").append(this.unit);
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
@ -20,8 +20,10 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.meteoinfo.common.util.JDateUtil;
|
||||
import org.meteoinfo.data.dimarray.DimArray;
|
||||
import org.meteoinfo.ndarray.Array;
|
||||
import org.meteoinfo.data.dimarray.Dimension;
|
||||
import org.meteoinfo.ndarray.InvalidRangeException;
|
||||
import org.meteoinfo.projection.KnownCoordinateSystems;
|
||||
import org.meteoinfo.projection.ProjectionInfo;
|
||||
|
||||
@ -520,6 +522,23 @@ import org.meteoinfo.projection.ProjectionInfo;
|
||||
*/
|
||||
public abstract Array read(String varName);
|
||||
|
||||
/**
|
||||
* Read dimension array data
|
||||
* @param varName Variable name
|
||||
* @return Dimension array
|
||||
*/
|
||||
public DimArray readDimArray(String varName) {
|
||||
Variable variable = this.getVariable(varName);
|
||||
if (variable == null) {
|
||||
System.out.println("The variable is not exist: " + varName);
|
||||
return null;
|
||||
}
|
||||
|
||||
Array array = read(varName);
|
||||
|
||||
return new DimArray(array, variable.getDimensions());
|
||||
}
|
||||
|
||||
/**
|
||||
* Read array data
|
||||
*
|
||||
@ -531,6 +550,32 @@ import org.meteoinfo.projection.ProjectionInfo;
|
||||
*/
|
||||
public abstract Array read(String varName, int[] origin, int[] size, int[] stride);
|
||||
|
||||
/**
|
||||
* Read dimension array data
|
||||
*
|
||||
* @param varName Variable name
|
||||
* @param origin Origin array
|
||||
* @param size Size array
|
||||
* @param stride Stride array
|
||||
* @return Dimension array
|
||||
*/
|
||||
public DimArray readDimArray(String varName, int[] origin, int[] size, int[] stride) {
|
||||
Variable variable = this.getVariable(varName);
|
||||
if (variable == null) {
|
||||
System.out.println("The variable is not exist: " + varName);
|
||||
return null;
|
||||
}
|
||||
|
||||
Array array = read(varName, origin, size, stride);
|
||||
try {
|
||||
List<Dimension> dimensions = variable.sectionDimensions(origin, size, stride);
|
||||
return new DimArray(array, dimensions);
|
||||
} catch (InvalidRangeException e) {
|
||||
e.printStackTrace();
|
||||
return new DimArray(array);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get global attributes
|
||||
* @return Global attributes
|
||||
|
||||
@ -14,6 +14,7 @@
|
||||
package org.meteoinfo.data.meteodata;
|
||||
|
||||
import org.meteoinfo.common.util.JDateUtil;
|
||||
import org.meteoinfo.data.dimarray.DimArray;
|
||||
import org.meteoinfo.data.dimarray.DimensionType;
|
||||
import org.meteoinfo.data.dimarray.Dimension;
|
||||
|
||||
@ -21,9 +22,7 @@ import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.meteoinfo.ndarray.DataType;
|
||||
import org.meteoinfo.ndarray.Range;
|
||||
import org.meteoinfo.ndarray.Section;
|
||||
import org.meteoinfo.ndarray.*;
|
||||
|
||||
/**
|
||||
*
|
||||
@ -31,9 +30,6 @@ import org.meteoinfo.ndarray.Section;
|
||||
*/
|
||||
public class Variable {
|
||||
// <editor-fold desc="Variables">
|
||||
/// <summary>
|
||||
/// Parameter number
|
||||
/// </summary>
|
||||
|
||||
public int Number;
|
||||
private String name;
|
||||
@ -42,21 +38,17 @@ public class Variable {
|
||||
protected int[] shape = new int[0];
|
||||
protected List<Dimension> dimensions = new ArrayList<>();
|
||||
protected List<Attribute> attributes = new ArrayList<>();
|
||||
private int _levelType;
|
||||
private List<Double> _levels;
|
||||
private int levelType;
|
||||
private List<Double> levels;
|
||||
private String units;
|
||||
private String _description;
|
||||
//private List<Dimension> _dimensions = new ArrayList<>();
|
||||
private String _hdfPath;
|
||||
private boolean _isStation = false;
|
||||
private boolean _isSwath = false;
|
||||
//private NetCDF4.NcType _ncType;
|
||||
//private List<Attribute> _attributes = new ArrayList<>();
|
||||
//private int _attNumber;
|
||||
private int _varId;
|
||||
private String description;
|
||||
private String hdfPath;
|
||||
private boolean isStation = false;
|
||||
private boolean isSwath = false;
|
||||
private int varId;
|
||||
private boolean dimVar = false;
|
||||
private List<Integer> _levelIdxs = new ArrayList<>();
|
||||
private List<Integer> _varInLevelIdxs = new ArrayList<>();
|
||||
private List<Integer> levelIdxs = new ArrayList<>();
|
||||
private List<Integer> varInLevelIdxs = new ArrayList<>();
|
||||
private double fill_value = -9999.0;
|
||||
private double scale_factor = 1;
|
||||
private double add_offset = 0;
|
||||
@ -70,9 +62,9 @@ public class Variable {
|
||||
this.name = "null";
|
||||
this.shortName = null;
|
||||
this.dataType = DataType.FLOAT;
|
||||
_levels = new ArrayList<>();
|
||||
levels = new ArrayList<>();
|
||||
units = "null";
|
||||
_description = "null";
|
||||
description = "null";
|
||||
}
|
||||
|
||||
/**
|
||||
@ -87,8 +79,8 @@ public class Variable {
|
||||
Number = aNum;
|
||||
this.name = aName;
|
||||
this.units = aUnit;
|
||||
_description = aDesc;
|
||||
_levels = new ArrayList<>();
|
||||
description = aDesc;
|
||||
levels = new ArrayList<>();
|
||||
}
|
||||
|
||||
// </editor-fold>
|
||||
@ -218,7 +210,7 @@ public class Variable {
|
||||
* @return Level type
|
||||
*/
|
||||
public int getLevelType() {
|
||||
return _levelType;
|
||||
return levelType;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -227,7 +219,7 @@ public class Variable {
|
||||
* @param value Level type
|
||||
*/
|
||||
public void setLevelType(int value) {
|
||||
_levelType = value;
|
||||
levelType = value;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -239,7 +231,7 @@ public class Variable {
|
||||
//return _levels;
|
||||
Dimension zDim = this.getZDimension();
|
||||
if (zDim == null) {
|
||||
return _levels;
|
||||
return levels;
|
||||
} else {
|
||||
return zDim.getDimValueList();
|
||||
}
|
||||
@ -251,7 +243,7 @@ public class Variable {
|
||||
* @param value Levels
|
||||
*/
|
||||
public void setLevels(List<Double> value) {
|
||||
_levels = value;
|
||||
levels = value;
|
||||
this.updateZDimension();
|
||||
}
|
||||
|
||||
@ -279,7 +271,7 @@ public class Variable {
|
||||
* @return Description
|
||||
*/
|
||||
public String getDescription() {
|
||||
return _description;
|
||||
return description;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -288,7 +280,7 @@ public class Variable {
|
||||
* @param value Description
|
||||
*/
|
||||
public void setDescription(String value) {
|
||||
_description = value;
|
||||
description = value;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -321,7 +313,7 @@ public class Variable {
|
||||
* @return HDF path
|
||||
*/
|
||||
public String getHDFPath() {
|
||||
return _hdfPath;
|
||||
return hdfPath;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -330,7 +322,7 @@ public class Variable {
|
||||
* @param value HDF path
|
||||
*/
|
||||
public void setHDFPath(String value) {
|
||||
_hdfPath = value;
|
||||
hdfPath = value;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -425,7 +417,7 @@ public class Variable {
|
||||
* @return Boolean
|
||||
*/
|
||||
public boolean isStation() {
|
||||
return _isStation;
|
||||
return isStation;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -434,7 +426,7 @@ public class Variable {
|
||||
* @param value Boolean
|
||||
*/
|
||||
public void setStation(boolean value) {
|
||||
_isStation = value;
|
||||
isStation = value;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -443,7 +435,7 @@ public class Variable {
|
||||
* @return Boolean
|
||||
*/
|
||||
public boolean isSwath() {
|
||||
return _isSwath;
|
||||
return isSwath;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -452,7 +444,7 @@ public class Variable {
|
||||
* @param value Boolean
|
||||
*/
|
||||
public void setSwath(boolean value) {
|
||||
_isSwath = value;
|
||||
isSwath = value;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -461,7 +453,7 @@ public class Variable {
|
||||
* @return Boolean
|
||||
*/
|
||||
public boolean isPlottable() {
|
||||
if (_isStation) {
|
||||
if (isStation) {
|
||||
return true;
|
||||
}
|
||||
if (this.getXDimension() == null) {
|
||||
@ -489,7 +481,7 @@ public class Variable {
|
||||
* @return Variable identifer
|
||||
*/
|
||||
public int getVarId() {
|
||||
return _varId;
|
||||
return varId;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -498,7 +490,7 @@ public class Variable {
|
||||
* @param value Variable identifer
|
||||
*/
|
||||
public void setVarId(int value) {
|
||||
_varId = value;
|
||||
varId = value;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -525,7 +517,7 @@ public class Variable {
|
||||
* @return Level index list
|
||||
*/
|
||||
public List<Integer> getLevelIdxs() {
|
||||
return _levelIdxs;
|
||||
return levelIdxs;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -534,7 +526,7 @@ public class Variable {
|
||||
* @param value Level index list
|
||||
*/
|
||||
public void setLevelIdxs(List<Integer> value) {
|
||||
_levelIdxs = value;
|
||||
levelIdxs = value;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -543,7 +535,7 @@ public class Variable {
|
||||
* @return Variable index
|
||||
*/
|
||||
public List<Integer> getVarInLevelIdxs() {
|
||||
return _varInLevelIdxs;
|
||||
return varInLevelIdxs;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -552,7 +544,7 @@ public class Variable {
|
||||
* @param value Variable index
|
||||
*/
|
||||
public void setVarInLevelIdxs(List<Integer> value) {
|
||||
_varInLevelIdxs = value;
|
||||
varInLevelIdxs = value;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -651,15 +643,13 @@ public class Variable {
|
||||
aPar.setName(this.getName());
|
||||
aPar.setShortName(this.getShortName());
|
||||
aPar.setUnits(units);
|
||||
aPar.setDescription(_description);
|
||||
aPar.setLevelType(_levelType);
|
||||
aPar.setDescription(description);
|
||||
aPar.setLevelType(levelType);
|
||||
|
||||
//aPar.getAttributes().addAll(_attributes);
|
||||
aPar.getDimensions().addAll(this.getDimensions());
|
||||
aPar.setDimVar(dimVar);
|
||||
aPar.getLevels().addAll(_levels);
|
||||
//aPar.NCType = _ncType;
|
||||
aPar.setVarId(_varId);
|
||||
aPar.getLevels().addAll(levels);
|
||||
aPar.setVarId(varId);
|
||||
|
||||
return aPar;
|
||||
}
|
||||
@ -677,7 +667,7 @@ public class Variable {
|
||||
if (Number != aVar.Number) {
|
||||
return false;
|
||||
}
|
||||
if (!_description.equals(aVar.getDescription())) {
|
||||
if (!description.equals(aVar.getDescription())) {
|
||||
return false;
|
||||
}
|
||||
if (!units.equals(aVar.getUnits())) {
|
||||
@ -700,13 +690,13 @@ public class Variable {
|
||||
if (Number != aVar.Number) {
|
||||
return false;
|
||||
}
|
||||
if (!_description.equals(aVar.getDescription())) {
|
||||
if (!description.equals(aVar.getDescription())) {
|
||||
return false;
|
||||
}
|
||||
if (!units.equals(aVar.getUnits())) {
|
||||
return false;
|
||||
}
|
||||
if (_levelType != aVar.getLevelType()) {
|
||||
if (levelType != aVar.getLevelType()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -719,8 +709,8 @@ public class Variable {
|
||||
* @param levelValue Level value
|
||||
*/
|
||||
public void addLevel(double levelValue) {
|
||||
if (!_levels.contains(levelValue)) {
|
||||
_levels.add(levelValue);
|
||||
if (!levels.contains(levelValue)) {
|
||||
levels.add(levelValue);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1221,13 +1211,35 @@ public class Variable {
|
||||
* Update z dimension from levels
|
||||
*/
|
||||
public void updateZDimension() {
|
||||
if (_levels.size() > 0) {
|
||||
if (levels.size() > 0) {
|
||||
Dimension zdim = new Dimension("null", 0, DimensionType.Z);
|
||||
zdim.setValues(_levels);
|
||||
zdim.setValues(levels);
|
||||
this.setZDimension(zdim);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Section dimensions
|
||||
* @param origin Origin
|
||||
* @param size Size
|
||||
* @param stride Stride
|
||||
* @return Section result dimensions
|
||||
* @throws InvalidRangeException
|
||||
*/
|
||||
public List<Dimension> sectionDimensions(int[] origin, int[] size, int[] stride) throws InvalidRangeException {
|
||||
Section section = new Section(origin, size, stride);
|
||||
List<Dimension> dims = new ArrayList<>();
|
||||
for (int i = 0; i < section.getRank(); i++) {
|
||||
Range range = section.getRange(i);
|
||||
if (range.length() > 1) {
|
||||
Dimension dim = this.dimensions.get(i).extract(range);
|
||||
dims.add(dim);
|
||||
}
|
||||
}
|
||||
|
||||
return dims;
|
||||
}
|
||||
|
||||
/**
|
||||
* To string
|
||||
* @return String
|
||||
|
||||
@ -6,6 +6,7 @@ import org.meteoinfo.common.util.JDateUtil;
|
||||
import org.meteoinfo.data.GridArray;
|
||||
import org.meteoinfo.data.GridData;
|
||||
import org.meteoinfo.data.StationData;
|
||||
import org.meteoinfo.data.dimarray.DimArray;
|
||||
import org.meteoinfo.data.dimarray.Dimension;
|
||||
import org.meteoinfo.data.dimarray.DimensionType;
|
||||
import org.meteoinfo.dataframe.Column;
|
||||
@ -509,6 +510,16 @@ public class MDFSDataInfo extends DataInfo implements IGridDataInfo, IStationDat
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public DimArray readDimArray(String varName) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DimArray readDimArray(String varName, int[] origin, int[] size, int[] stride) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Attribute> getGlobalAttributes() {
|
||||
return null;
|
||||
|
||||
@ -17,6 +17,7 @@ import org.meteoinfo.common.Extent;
|
||||
import org.meteoinfo.common.MIMath;
|
||||
import org.meteoinfo.common.util.JDateUtil;
|
||||
import org.meteoinfo.data.StationData;
|
||||
import org.meteoinfo.data.dimarray.DimArray;
|
||||
import org.meteoinfo.data.meteodata.DataInfo;
|
||||
import org.meteoinfo.ndarray.math.ArrayMath;
|
||||
import org.meteoinfo.data.dimarray.Dimension;
|
||||
|
||||
@ -22,6 +22,7 @@ import java.util.logging.Logger;
|
||||
import org.meteoinfo.common.Extent;
|
||||
import org.meteoinfo.common.util.JDateUtil;
|
||||
import org.meteoinfo.data.StationData;
|
||||
import org.meteoinfo.data.dimarray.DimArray;
|
||||
import org.meteoinfo.data.meteodata.DataInfo;
|
||||
import org.meteoinfo.data.dimarray.Dimension;
|
||||
import org.meteoinfo.data.dimarray.DimensionType;
|
||||
|
||||
@ -16,6 +16,7 @@ package org.meteoinfo.data.meteodata.micaps;
|
||||
import org.meteoinfo.common.Extent;
|
||||
import org.meteoinfo.common.util.JDateUtil;
|
||||
import org.meteoinfo.data.StationData;
|
||||
import org.meteoinfo.data.dimarray.DimArray;
|
||||
import org.meteoinfo.data.meteodata.DataInfo;
|
||||
import org.meteoinfo.data.dimarray.Dimension;
|
||||
import org.meteoinfo.data.dimarray.DimensionType;
|
||||
|
||||
@ -16,6 +16,7 @@ package org.meteoinfo.data.meteodata.micaps;
|
||||
import org.meteoinfo.common.MIMath;
|
||||
import org.meteoinfo.common.util.JDateUtil;
|
||||
import org.meteoinfo.data.GridData;
|
||||
import org.meteoinfo.data.dimarray.DimArray;
|
||||
import org.meteoinfo.data.meteodata.DataInfo;
|
||||
import org.meteoinfo.data.dimarray.Dimension;
|
||||
import org.meteoinfo.data.dimarray.DimensionType;
|
||||
|
||||
@ -23,6 +23,7 @@ import org.meteoinfo.common.DataConvert;
|
||||
import org.meteoinfo.common.util.JDateUtil;
|
||||
import org.meteoinfo.data.GridArray;
|
||||
import org.meteoinfo.data.GridData;
|
||||
import org.meteoinfo.data.dimarray.DimArray;
|
||||
import org.meteoinfo.data.meteodata.DataInfo;
|
||||
import org.meteoinfo.data.dimarray.Dimension;
|
||||
import org.meteoinfo.data.dimarray.DimensionType;
|
||||
|
||||
@ -22,6 +22,7 @@ import org.meteoinfo.common.util.GlobalUtil;
|
||||
import org.meteoinfo.common.util.JDateUtil;
|
||||
import org.meteoinfo.data.GridArray;
|
||||
import org.meteoinfo.data.GridData;
|
||||
import org.meteoinfo.data.dimarray.DimArray;
|
||||
import org.meteoinfo.data.meteodata.DataInfo;
|
||||
import org.meteoinfo.data.dimarray.Dimension;
|
||||
import org.meteoinfo.data.dimarray.DimensionType;
|
||||
|
||||
@ -18,6 +18,7 @@ import org.meteoinfo.common.MIMath;
|
||||
import org.meteoinfo.common.util.JDateUtil;
|
||||
import org.meteoinfo.data.GridData;
|
||||
import org.meteoinfo.data.StationData;
|
||||
import org.meteoinfo.data.dimarray.DimArray;
|
||||
import org.meteoinfo.data.meteodata.DataInfo;
|
||||
import org.meteoinfo.ndarray.math.ArrayMath;
|
||||
import org.meteoinfo.ndarray.math.ArrayUtil;
|
||||
@ -1453,6 +1454,7 @@ public class NetCDFDataInfo extends DataInfo implements IGridDataInfo, IStationD
|
||||
Dimension ysdim = findDimension("south_north_stag");
|
||||
if (xsdim != null && ysdim != null) {
|
||||
xsdim.setDimType(DimensionType.X);
|
||||
xsdim.setStagger(true);
|
||||
double[] nX = new double[xNum + 1];
|
||||
double norgX = orgX - dx * 0.5;
|
||||
for (i = 0; i <= xNum; i++) {
|
||||
@ -1461,6 +1463,7 @@ public class NetCDFDataInfo extends DataInfo implements IGridDataInfo, IStationD
|
||||
xsdim.setValues(nX);
|
||||
|
||||
ysdim.setDimType(DimensionType.Y);
|
||||
ysdim.setStagger(true);
|
||||
double[] nY = new double[yNum + 1];
|
||||
double norgY = orgY - dx * 0.5;
|
||||
for (i = 0; i <= yNum; i++) {
|
||||
@ -1497,6 +1500,7 @@ public class NetCDFDataInfo extends DataInfo implements IGridDataInfo, IStationD
|
||||
}
|
||||
}
|
||||
zDim.setDimType(DimensionType.Z);
|
||||
zDim.setStagger(true);
|
||||
//zDim.setDimName(_levelVar.getShortName());
|
||||
zDim.setValues(levels);
|
||||
zDim.setUnit("eta");
|
||||
|
||||
@ -17,6 +17,7 @@ import org.meteoinfo.common.Extent;
|
||||
import org.meteoinfo.common.MIMath;
|
||||
import org.meteoinfo.common.util.JDateUtil;
|
||||
import org.meteoinfo.data.StationData;
|
||||
import org.meteoinfo.data.dimarray.DimArray;
|
||||
import org.meteoinfo.data.meteodata.DataInfo;
|
||||
import org.meteoinfo.data.dimarray.Dimension;
|
||||
import org.meteoinfo.data.dimarray.DimensionType;
|
||||
@ -341,6 +342,16 @@ import org.meteoinfo.data.meteodata.Attribute;
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DimArray readDimArray(String varName) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DimArray readDimArray(String varName, int[] origin, int[] size, int[] stride) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public StationData getStationData(int timeIdx, String varName, int levelIdx) {
|
||||
StationData stationData = new StationData();
|
||||
|
||||
@ -0,0 +1,92 @@
|
||||
package org.meteoinfo.data.meteodata.util;
|
||||
|
||||
import org.meteoinfo.data.dimarray.DimArray;
|
||||
import org.meteoinfo.data.dimarray.Dimension;
|
||||
import org.meteoinfo.data.meteodata.DataInfo;
|
||||
import org.meteoinfo.ndarray.Array;
|
||||
import org.meteoinfo.ndarray.DataType;
|
||||
import org.meteoinfo.ndarray.InvalidRangeException;
|
||||
import org.meteoinfo.ndarray.Range;
|
||||
import org.meteoinfo.ndarray.math.ArrayMath;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class WRFUtil {
|
||||
/**
|
||||
* Un-Stagger a dimension array
|
||||
* @param array The dimension array
|
||||
* @param axis The axis
|
||||
* @return Un-Staggered dimension array
|
||||
*/
|
||||
public static DimArray deStagger(DimArray array, int axis) {
|
||||
try {
|
||||
Dimension sDim = array.getDimension(axis);
|
||||
Range range1 = new Range(0, sDim.getLength() - 2);
|
||||
Range range2 = new Range(1, sDim.getLength() - 1);
|
||||
Array sDimValue = sDim.getDimValue();
|
||||
Array sDimValue1 = Array.factory(DataType.DOUBLE, new int[]{sDim.getLength()});
|
||||
for (int i = 0; i < sDimValue1.getSize(); i++) {
|
||||
sDimValue1.setDouble(i, 0.5 * (sDimValue.getDouble(i) + sDimValue.getDouble(i + 1)));
|
||||
}
|
||||
Dimension sDim1 = new Dimension(sDim);
|
||||
sDim1.setDimValue(sDimValue1);
|
||||
sDim1.setStagger(false);
|
||||
|
||||
List<Range> rangeList1 = new ArrayList<>();
|
||||
List<Range> rangeList2 = new ArrayList<>();
|
||||
List<Dimension> dimensions = new ArrayList<>();
|
||||
for (int i = 0; i < array.getDimensions().size(); i++) {
|
||||
if (i == axis) {
|
||||
rangeList1.add(range1);
|
||||
rangeList2.add(range2);
|
||||
dimensions.add(sDim1);
|
||||
} else {
|
||||
Dimension dimension = array.getDimension(i);
|
||||
rangeList1.add(new Range(dimension.getLength()));
|
||||
rangeList2.add(new Range(dimension.getLength()));
|
||||
dimensions.add(dimension);
|
||||
}
|
||||
}
|
||||
Array array1 = array.getArray().section(rangeList1);
|
||||
Array array2 = array.getArray().section(rangeList2);
|
||||
Array r = ArrayMath.mul(ArrayMath.add(array1, array2), 0.5);
|
||||
|
||||
return new DimArray(r, dimensions);
|
||||
} catch (InvalidRangeException e) {
|
||||
e.printStackTrace();
|
||||
return array;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Un-Stagger a dimension array
|
||||
* @param array The dimension array
|
||||
* @return Un-Staggered dimension array
|
||||
*/
|
||||
public static DimArray deStagger(DimArray array) {
|
||||
int idx = array.getStaggerDimIndex();
|
||||
if (idx >= 0) {
|
||||
return deStagger(array, idx);
|
||||
} else {
|
||||
System.out.println("The dimension array has no stagger dimension!");
|
||||
return array;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get geopotential height array - meter
|
||||
* @param dataInfo The WRF data info
|
||||
* @return Geopotential height
|
||||
*/
|
||||
public static DimArray getGPM(DataInfo dataInfo) {
|
||||
DimArray ph = dataInfo.readDimArray("PH");
|
||||
ph = deStagger(ph);
|
||||
DimArray phb = dataInfo.readDimArray("PHB");
|
||||
phb = deStagger(phb);
|
||||
DimArray hgt = dataInfo.readDimArray("HGT");
|
||||
Array gpm = ArrayMath.sub(ArrayMath.div(ArrayMath.add(ph.getArray(), phb.getArray()), 9.81), hgt.getArray());
|
||||
|
||||
return new DimArray(gpm, ph.getDimensions());
|
||||
}
|
||||
}
|
||||
@ -2672,4 +2672,101 @@ public class GeoComputation {
|
||||
}
|
||||
|
||||
// </editor-fold>
|
||||
|
||||
// <editor-fold desc="Interpolation">
|
||||
/**
|
||||
* Interpolate with surface method
|
||||
*
|
||||
* @param x_s scatter X array
|
||||
* @param y_s scatter Y array
|
||||
* @param a scatter value array
|
||||
* @param X x coordinate
|
||||
* @param Y y coordinate
|
||||
* @return grid data
|
||||
*/
|
||||
public static Array interpolation_Surface(Array x_s, Array y_s, Array a, Array X, Array Y) {
|
||||
x_s = x_s.copyIfView();
|
||||
y_s = y_s.copyIfView();
|
||||
a = a.copyIfView();
|
||||
X = X.copyIfView();
|
||||
Y = Y.copyIfView();
|
||||
|
||||
int rowNum, colNum, xn, yn;
|
||||
int[] shape = x_s.getShape();
|
||||
colNum = shape[1];
|
||||
rowNum = shape[0];
|
||||
xn = (int) X.getSize();
|
||||
yn = (int) Y.getSize();
|
||||
Array r = Array.factory(DataType.DOUBLE, new int[]{yn, xn});
|
||||
for (int i = 0; i < r.getSize(); i++) {
|
||||
r.setDouble(i, Double.NaN);
|
||||
}
|
||||
|
||||
double x, y;
|
||||
double v, xll, xtl, xtr, xlr, yll, ytl, ytr, ylr;
|
||||
double dX = X.getDouble(1) - X.getDouble(0);
|
||||
double dY = Y.getDouble(1) - Y.getDouble(0);
|
||||
int minxi, maxxi, minyi, maxyi;
|
||||
for (int i = 0; i < rowNum - 1; i++) {
|
||||
for (int j = 0; j < colNum - 1; j++) {
|
||||
v = a.getDouble(i * colNum + j);
|
||||
if (Double.isNaN(v)) {
|
||||
continue;
|
||||
}
|
||||
xll = x_s.getDouble(i * colNum + j);
|
||||
xtl = x_s.getDouble((i + 1) * colNum + j);
|
||||
xtr = x_s.getDouble((i + 1) * colNum + j + 1);
|
||||
xlr = x_s.getDouble(i * colNum + j + 1);
|
||||
yll = y_s.getDouble(i * colNum + j);
|
||||
ytl = y_s.getDouble((i + 1) * colNum + j);
|
||||
ytr = y_s.getDouble((i + 1) * colNum + j + 1);
|
||||
ylr = y_s.getDouble(i * colNum + j + 1);
|
||||
if (Double.isNaN(xll) || Double.isNaN(xtl) || Double.isNaN(xtr) || Double.isNaN(xlr)
|
||||
|| Double.isNaN(yll) || Double.isNaN(ytl) || Double.isNaN(ytr) || Double.isNaN(ylr)) {
|
||||
continue;
|
||||
}
|
||||
PolygonShape ps = new PolygonShape();
|
||||
List<PointD> points = new ArrayList<>();
|
||||
points.add(new PointD(xll, yll));
|
||||
points.add(new PointD(xtl, ytl));
|
||||
points.add(new PointD(xtr, ytr));
|
||||
points.add(new PointD(xlr, ylr));
|
||||
points.add((PointD) points.get(0).clone());
|
||||
ps.setPoints(points);
|
||||
minxi = (int) ((ps.getExtent().minX - X.getDouble(0)) / dX);
|
||||
maxxi = (int) ((ps.getExtent().maxX - X.getDouble(0)) / dX);
|
||||
minyi = (int) ((ps.getExtent().minY - Y.getDouble(0)) / dY);
|
||||
maxyi = (int) ((ps.getExtent().maxY - Y.getDouble(0)) / dY);
|
||||
maxxi += 1;
|
||||
maxyi += 1;
|
||||
if (maxxi < 0 || minxi >= xn) {
|
||||
continue;
|
||||
}
|
||||
if (maxyi < 0 || minyi >= yn) {
|
||||
continue;
|
||||
}
|
||||
if (minxi < 0) {
|
||||
minxi = 0;
|
||||
}
|
||||
if (maxxi >= xn) {
|
||||
maxxi = xn - 1;
|
||||
}
|
||||
if (maxyi >= yn) {
|
||||
maxyi = yn - 1;
|
||||
}
|
||||
for (int m = minyi; m <= maxyi; m++) {
|
||||
y = Y.getDouble(m);
|
||||
for (int n = minxi; n <= maxxi; n++) {
|
||||
x = X.getDouble(n);
|
||||
if (GeoComputation.pointInPolygon(ps, x, y)) {
|
||||
r.setDouble(m * xn + n, v);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
// </editor-fold>
|
||||
}
|
||||
|
||||
@ -1,32 +1,32 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<MeteoInfo File="milconfig.xml" Type="configurefile">
|
||||
<Path OpenPath="D:\Working\MIScript\Jython\mis\meteo\calc">
|
||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\grads"/>
|
||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\io"/>
|
||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\io\dataconvert"/>
|
||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\others"/>
|
||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\common_math\linalg"/>
|
||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\LaSW"/>
|
||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\common_math\fitting"/>
|
||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\ascii"/>
|
||||
<RecentFolder Folder="D:\Temp\working\acidrain"/>
|
||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis"/>
|
||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\common_math"/>
|
||||
<Path OpenPath="D:\Working\MIScript\Jython\mis\satellite\smap">
|
||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\common_math\interpolate"/>
|
||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\meteo\wrf"/>
|
||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\meteo"/>
|
||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\meteo\calc"/>
|
||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types"/>
|
||||
<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\LaSW"/>
|
||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\volume"/>
|
||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\meteo\wrf"/>
|
||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\chart"/>
|
||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\chart\subplot"/>
|
||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\hdf"/>
|
||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis"/>
|
||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\satellite"/>
|
||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\satellite\smap"/>
|
||||
</Path>
|
||||
<File>
|
||||
<OpenedFiles>
|
||||
<OpenedFile File="D:\Working\MIScript\Jython\mis\LaSW\typhoon_map_volume.py"/>
|
||||
<OpenedFile File="D:\Working\MIScript\Jython\mis\meteo\wrf\wrf_destagger_1.py"/>
|
||||
<OpenedFile File="D:\Working\MIScript\Jython\mis\meteo\calc\isentropic_analysis.py"/>
|
||||
<OpenedFile File="D:\Working\MIScript\Jython\mis\meteo\wrf\wrf_eta2height.py"/>
|
||||
<OpenedFile File="D:\Working\MIScript\Jython\mis\satellite\smap\pro_SMAP_L4_with_MI.py"/>
|
||||
</OpenedFiles>
|
||||
<RecentFiles>
|
||||
<RecentFile File="D:\Working\MIScript\Jython\mis\LaSW\typhoon_map_volume.py"/>
|
||||
<RecentFile File="D:\Working\MIScript\Jython\mis\meteo\wrf\wrf_destagger_1.py"/>
|
||||
<RecentFile File="D:\Working\MIScript\Jython\mis\meteo\calc\isentropic_analysis.py"/>
|
||||
<RecentFile File="D:\Working\MIScript\Jython\mis\meteo\wrf\wrf_eta2height.py"/>
|
||||
<RecentFile File="D:\Working\MIScript\Jython\mis\satellite\smap\pro_SMAP_L4_with_MI.py"/>
|
||||
</RecentFiles>
|
||||
</File>
|
||||
<Font>
|
||||
@ -34,5 +34,5 @@
|
||||
</Font>
|
||||
<LookFeel DockWindowDecorated="true" LafDecorated="true" Name="FlatDarkLaf"/>
|
||||
<Figure DoubleBuffering="true"/>
|
||||
<Startup MainFormLocation="-7,-7" MainFormSize="1293,685"/>
|
||||
<Startup MainFormLocation="-7,0" MainFormSize="1435,830"/>
|
||||
</MeteoInfo>
|
||||
|
||||
Binary file not shown.
@ -15,8 +15,8 @@ __all__ = [
|
||||
]
|
||||
|
||||
def destagger(var, stagger_dim):
|
||||
'''
|
||||
Return the variable on the unstaggered grid.
|
||||
"""
|
||||
Return the variable data array on the unstaggered grid.
|
||||
|
||||
This function destaggers the variable by taking the average of the
|
||||
values located on either side of the grid box.
|
||||
@ -26,8 +26,8 @@ def destagger(var, stagger_dim):
|
||||
Negative values can be used to choose dimensions referenced
|
||||
from the right hand side (-1 is the rightmost dimension).
|
||||
|
||||
:returns: (*array*) The destaggered variable.
|
||||
'''
|
||||
:returns: (*array*) The destaggered variable data array.
|
||||
"""
|
||||
var_shape = var.shape
|
||||
num_dims = var.ndim
|
||||
stagger_dim_size = var_shape[stagger_dim]
|
||||
|
||||
Binary file not shown.
@ -9,7 +9,7 @@
|
||||
from org.meteoinfo.math.interpolate import InterpUtil, RectLinearInterpolator, RectNearestInterpolator, \
|
||||
RectNearestInterpolator3D, RectLinearInterpolator3D
|
||||
from org.meteoinfo.ndarray.math import ArrayUtil
|
||||
from org.meteoinfo.geometry.geoprocess import GeometryUtil
|
||||
from org.meteoinfo.geometry.geoprocess import GeometryUtil, GeoComputation
|
||||
|
||||
from ..core import NDArray
|
||||
from ..core import numeric as np
|
||||
@ -513,7 +513,7 @@ def griddata(points, values, xi=None, **kwargs):
|
||||
r = InterpUtil.interpolation_Inside_Count(x_s.aslist(), y_s.aslist(), values, x_g.aslist(), y_g.aslist(), True, centerpoint)
|
||||
return NDArray(r[0]), x_g, y_g, NDArray(r[1])
|
||||
elif method == 'surface':
|
||||
r = InterpUtil.interpolation_Surface(x_s.asarray(), y_s.asarray(), values, x_g.asarray(), y_g.asarray())
|
||||
r = GeoComputation.interpolation_Surface(x_s.asarray(), y_s.asarray(), values, x_g.asarray(), y_g.asarray())
|
||||
elif method == 'kriging':
|
||||
beta = kwargs.pop('beta', 1.5)
|
||||
r = InterpUtil.gridDataKriging(x_s.asarray(), y_s.asarray(), values, x_g.asarray(), y_g.asarray(), beta)
|
||||
|
||||
Binary file not shown.
@ -631,16 +631,13 @@ class Figure(ChartPanel):
|
||||
y -= hspace
|
||||
for j in range(ncols):
|
||||
if axestype == '3d':
|
||||
ax = Axes3D()
|
||||
self.__set_axes3d(ax, **kwargs)
|
||||
ax = Axes3D(**kwargs)
|
||||
elif axestype == 'map':
|
||||
ax = MapAxes()
|
||||
self.__set_axesm(ax, **kwargs)
|
||||
ax = MapAxes(**kwargs)
|
||||
elif axestype == 'polar':
|
||||
ax = PolarAxes()
|
||||
ax = PolarAxes(**kwargs)
|
||||
else:
|
||||
ax = Axes(**kwargs)
|
||||
#self.__set_axes(ax, **kwargs)
|
||||
ax.axes.isSubPlot = True
|
||||
if not iswspace and not ishspace:
|
||||
x = left + w * j
|
||||
|
||||
@ -952,7 +952,7 @@ public class FrmMeteoData extends javax.swing.JDialog {
|
||||
this.jComboBox_Level.setSelectedIndex(0);
|
||||
} else {
|
||||
for (i = 0; i < ldim.getLength(); i++) {
|
||||
this.jComboBox_Level.addItem(String.valueOf(ldim.getDimValue().get(i)));
|
||||
this.jComboBox_Level.addItem(String.valueOf(ldim.getDimValue().getDouble(i)));
|
||||
}
|
||||
if (this.jComboBox_Level.getItemCount() > _meteoDataInfo.getLevelIndex()) {
|
||||
this.jComboBox_Level.setSelectedIndex(_meteoDataInfo.getLevelIndex());
|
||||
@ -965,7 +965,7 @@ public class FrmMeteoData extends javax.swing.JDialog {
|
||||
} else {
|
||||
DefaultComboBoxModel comboBoxModel = new DefaultComboBoxModel();
|
||||
for (i = 0; i < var.getZDimension().getLength(); i++) {
|
||||
comboBoxModel.addElement(String.valueOf(var.getZDimension().getDimValue().get(i)));
|
||||
comboBoxModel.addElement(String.valueOf(var.getZDimension().getDimValue().getDouble(i)));
|
||||
}
|
||||
this.jComboBox_Level.setModel(comboBoxModel);
|
||||
if (this.jComboBox_Level.getItemCount() > _meteoDataInfo.getLevelIndex()) {
|
||||
|
||||
@ -1079,7 +1079,7 @@ public class FrmOneDim extends javax.swing.JFrame {
|
||||
this.jComboBox_Level1.setSelectedIndex(0);
|
||||
} else {
|
||||
for (i = 0; i < var.getLevelNum(); i++) {
|
||||
this.jComboBox_Level1.addItem(String.valueOf(zDim.getDimValue().get(i)));
|
||||
this.jComboBox_Level1.addItem(String.valueOf(zDim.getDimValue().getDouble(i)));
|
||||
}
|
||||
if ((levelIdx > -1) && (this.jComboBox_Level1.getItemCount() > levelIdx)) {
|
||||
this.jComboBox_Level1.setSelectedIndex(levelIdx);
|
||||
@ -1103,13 +1103,13 @@ public class FrmOneDim extends javax.swing.JFrame {
|
||||
//Set lon/lat
|
||||
this.jComboBox_Lon1.removeAllItems();
|
||||
for (i = 0; i < (_meteoDataInfo.getDataInfo()).getXDimension().getLength(); i++) {
|
||||
this.jComboBox_Lon1.addItem(String.valueOf((_meteoDataInfo.getDataInfo()).getXDimension().getDimValue().get(i)));
|
||||
this.jComboBox_Lon1.addItem(String.valueOf((_meteoDataInfo.getDataInfo()).getXDimension().getDimValue().getDouble(i)));
|
||||
}
|
||||
this.jComboBox_Lon1.setSelectedIndex(0);
|
||||
|
||||
this.jComboBox_Lat1.removeAllItems();
|
||||
for (i = 0; i < (_meteoDataInfo.getDataInfo()).getYDimension().getLength(); i++) {
|
||||
this.jComboBox_Lat1.addItem(String.valueOf((_meteoDataInfo.getDataInfo()).getYDimension().getDimValue().get(i)));
|
||||
this.jComboBox_Lat1.addItem(String.valueOf((_meteoDataInfo.getDataInfo()).getYDimension().getDimValue().getDouble(i)));
|
||||
}
|
||||
this.jComboBox_Lat1.setSelectedIndex(0);
|
||||
|
||||
|
||||
@ -1514,7 +1514,7 @@ public class FrmSectionPlot extends javax.swing.JFrame {
|
||||
this.jComboBox_Level1.setSelectedIndex(0);
|
||||
} else {
|
||||
for (i = 0; i < var.getLevelNum(); i++) {
|
||||
this.jComboBox_Level1.addItem(String.valueOf(zDim.getDimValue().get(i)));
|
||||
this.jComboBox_Level1.addItem(String.valueOf(zDim.getDimValue().getDouble(i)));
|
||||
}
|
||||
if ((levelIdx > -1) && (this.jComboBox_Level1.getItemCount() > levelIdx)) {
|
||||
this.jComboBox_Level1.setSelectedIndex(levelIdx);
|
||||
@ -1538,13 +1538,13 @@ public class FrmSectionPlot extends javax.swing.JFrame {
|
||||
//Set lon/lat
|
||||
this.jComboBox_Lon1.removeAllItems();
|
||||
for (i = 0; i < (_meteoDataInfo.getDataInfo()).getXDimension().getLength(); i++) {
|
||||
this.jComboBox_Lon1.addItem(String.valueOf((_meteoDataInfo.getDataInfo()).getXDimension().getDimValue().get(i)));
|
||||
this.jComboBox_Lon1.addItem(String.valueOf((_meteoDataInfo.getDataInfo()).getXDimension().getDimValue().getDouble(i)));
|
||||
}
|
||||
this.jComboBox_Lon1.setSelectedIndex(0);
|
||||
|
||||
this.jComboBox_Lat1.removeAllItems();
|
||||
for (i = 0; i < (_meteoDataInfo.getDataInfo()).getYDimension().getLength(); i++) {
|
||||
this.jComboBox_Lat1.addItem(String.valueOf((_meteoDataInfo.getDataInfo()).getYDimension().getDimValue().get(i)));
|
||||
this.jComboBox_Lat1.addItem(String.valueOf((_meteoDataInfo.getDataInfo()).getYDimension().getDimValue().getDouble(i)));
|
||||
}
|
||||
this.jComboBox_Lat1.setSelectedIndex(0);
|
||||
|
||||
|
||||
@ -1708,101 +1708,6 @@ public class InterpUtil {
|
||||
return rdata;
|
||||
}
|
||||
|
||||
// /**
|
||||
// * Interpolate with surface method
|
||||
// *
|
||||
// * @param x_s scatter X array
|
||||
// * @param y_s scatter Y array
|
||||
// * @param a scatter value array
|
||||
// * @param X x coordinate
|
||||
// * @param Y y coordinate
|
||||
// * @return grid data
|
||||
// */
|
||||
// public static Array interpolation_Surface(Array x_s, Array y_s, Array a, Array X, Array Y) {
|
||||
// x_s = x_s.copyIfView();
|
||||
// y_s = y_s.copyIfView();
|
||||
// a = a.copyIfView();
|
||||
// X = X.copyIfView();
|
||||
// Y = Y.copyIfView();
|
||||
//
|
||||
// int rowNum, colNum, xn, yn;
|
||||
// int[] shape = x_s.getShape();
|
||||
// colNum = shape[1];
|
||||
// rowNum = shape[0];
|
||||
// xn = (int) X.getSize();
|
||||
// yn = (int) Y.getSize();
|
||||
// Array r = Array.factory(DataType.DOUBLE, new int[]{yn, xn});
|
||||
// for (int i = 0; i < r.getSize(); i++) {
|
||||
// r.setDouble(i, Double.NaN);
|
||||
// }
|
||||
//
|
||||
// double x, y;
|
||||
// double v, xll, xtl, xtr, xlr, yll, ytl, ytr, ylr;
|
||||
// double dX = X.getDouble(1) - X.getDouble(0);
|
||||
// double dY = Y.getDouble(1) - Y.getDouble(0);
|
||||
// int minxi, maxxi, minyi, maxyi;
|
||||
// for (int i = 0; i < rowNum - 1; i++) {
|
||||
// for (int j = 0; j < colNum - 1; j++) {
|
||||
// v = a.getDouble(i * colNum + j);
|
||||
// if (Double.isNaN(v)) {
|
||||
// continue;
|
||||
// }
|
||||
// xll = x_s.getDouble(i * colNum + j);
|
||||
// xtl = x_s.getDouble((i + 1) * colNum + j);
|
||||
// xtr = x_s.getDouble((i + 1) * colNum + j + 1);
|
||||
// xlr = x_s.getDouble(i * colNum + j + 1);
|
||||
// yll = y_s.getDouble(i * colNum + j);
|
||||
// ytl = y_s.getDouble((i + 1) * colNum + j);
|
||||
// ytr = y_s.getDouble((i + 1) * colNum + j + 1);
|
||||
// ylr = y_s.getDouble(i * colNum + j + 1);
|
||||
// if (Double.isNaN(xll) || Double.isNaN(xtl) || Double.isNaN(xtr) || Double.isNaN(xlr)
|
||||
// || Double.isNaN(yll) || Double.isNaN(ytl) || Double.isNaN(ytr) || Double.isNaN(ylr)) {
|
||||
// continue;
|
||||
// }
|
||||
// PolygonShape ps = new PolygonShape();
|
||||
// List<PointD> points = new ArrayList<>();
|
||||
// points.add(new PointD(xll, yll));
|
||||
// points.add(new PointD(xtl, ytl));
|
||||
// points.add(new PointD(xtr, ytr));
|
||||
// points.add(new PointD(xlr, ylr));
|
||||
// points.add((PointD) points.get(0).clone());
|
||||
// ps.setPoints(points);
|
||||
// minxi = (int) ((ps.getExtent().minX - X.getDouble(0)) / dX);
|
||||
// maxxi = (int) ((ps.getExtent().maxX - X.getDouble(0)) / dX);
|
||||
// minyi = (int) ((ps.getExtent().minY - Y.getDouble(0)) / dY);
|
||||
// maxyi = (int) ((ps.getExtent().maxY - Y.getDouble(0)) / dY);
|
||||
// maxxi += 1;
|
||||
// maxyi += 1;
|
||||
// if (maxxi < 0 || minxi >= xn) {
|
||||
// continue;
|
||||
// }
|
||||
// if (maxyi < 0 || minyi >= yn) {
|
||||
// continue;
|
||||
// }
|
||||
// if (minxi < 0) {
|
||||
// minxi = 0;
|
||||
// }
|
||||
// if (maxxi >= xn) {
|
||||
// maxxi = xn - 1;
|
||||
// }
|
||||
// if (maxyi >= yn) {
|
||||
// maxyi = yn - 1;
|
||||
// }
|
||||
// for (int m = minyi; m <= maxyi; m++) {
|
||||
// y = Y.getDouble(m);
|
||||
// for (int n = minxi; n <= maxxi; n++) {
|
||||
// x = X.getDouble(n);
|
||||
// if (GeoComputation.pointInPolygon(ps, x, y)) {
|
||||
// r.setDouble(m * xn + n, v);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// return r;
|
||||
// }
|
||||
|
||||
/**
|
||||
* Interpolation with IDW radius method
|
||||
*
|
||||
|
||||
@ -99,7 +99,7 @@ public final class Range {
|
||||
/**
|
||||
* Create a range starting at zero, with unit stride.
|
||||
*
|
||||
* @param length number of elements in the Rnage
|
||||
* @param length number of elements in the Range
|
||||
*/
|
||||
public Range(int length) {
|
||||
this.name = null;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user