package org.geotools.coverage.io.range;
import java.awt.image.SampleModel;
import javax.measure.quantity.Dimensionless;
import javax.measure.unit.Unit;
import org.geotools.coverage.io.range.RangeAxis.WavelengthAxis;
import org.geotools.feature.NameImpl;
import org.geotools.util.MeasurementRange;
import org.geotools.util.SimpleInternationalString;
import org.opengis.coverage.SampleDimension;
import org.opengis.feature.type.Name;
import org.opengis.referencing.crs.SingleCRS;
import org.opengis.util.InternationalString;
/**
*
* @author Simone Giannecchini, GeoSolutions S.A.S.
*
* @param <V>
* @param <QA>
*/
public abstract class RangeAxisBin<V> {//implements Comparable<RangeAxisBin<V>>{
/**
* Implementation of {@link RangeAxis} for multibands images.
*
* <p>
* This implementation of RangeAxis can be seen as a stub implementation since in
* this case we do not really have an {@link RangeAxis} for this kind of data, or
* rather we have an rangeAxis that just represents an ordinal or a certain set of .
*
* @author Simone Giannecchini, GeoSolutions
* @todo add convenience constructor based on {@link SampleDimension} and or
* {@link SampleModel}
*/
public static class StringAxisBin extends RangeAxisBin<String> {
/**
*
*/
public StringAxisBin(final Name name,final InternationalString description,final RangeAxis rangeAxis, final String bandName) {
super(name,description,rangeAxis,bandName );
}
/**
* @see org.geotools.coverage.io.range.RangeAxis#getCoordinateReferenceSystem()
*/
public SingleCRS getCoordinateReferenceSystem() {
return null;
}
/**
* @see org.geotools.coverage.io.range.RangeAxis#getUnitOfMeasure()
*/
public Unit<Dimensionless> getUnitOfMeasure() {
return Unit.ONE;
}
}
/**
* A special {@link RangeAxisBin} that can be used to indicate bin over a {@link WavelengthAxis}.
*
* @author Simone Giannecchini, GeoSolutions SAS
*
*/
public static class WavelengthBin extends RangeAxisBin<MeasurementRange<Double>>{
// public int compareTo(RangeAxisBin<MeasurementRange<Double>> o) {
// if(!o.value.getUnits().isCompatible(this.getUnit()))
// throw new IllegalArgumentException();
// return 0;
// }
/**
*
*/
private static final long serialVersionUID = -3977921692927799401L;
public WavelengthBin( Name name, double value, InternationalString description, WavelengthAxis axis ){
super(
name,
description,
axis,
MeasurementRange.create(value, value, axis.getUnitOfMeasure()));
}
public WavelengthBin( String name, double value, String description, WavelengthAxis axis ){
super(
new NameImpl(name),
new SimpleInternationalString(description),
axis,
MeasurementRange.create(value, value, axis.getUnitOfMeasure()));
}
public WavelengthBin( Name name, double from, double to, InternationalString description, WavelengthAxis axis ) {
super(
name,
description,
axis,
MeasurementRange.create(from, to, axis.getUnitOfMeasure()));
}
public WavelengthBin( String name, double from, double to, String description, WavelengthAxis axis ) {
super(
new NameImpl(name),
new SimpleInternationalString(description),
axis,
MeasurementRange.create(from, to, axis.getUnitOfMeasure()));
}
}
/**
*
*/
private static final long serialVersionUID = 227920699316120413L;
/**
* The {@link RangeAxisBin} instance that is used as a reference by this {@link RangeAxisBin}.
*/
private RangeAxis rangeAxis;
public RangeAxisBin(
final Name name,
final InternationalString description,
final RangeAxis rangeAxis,
final V value) {
this.description = description;
this.name = name;
this.rangeAxis=rangeAxis;
this.value=value;
}
public RangeAxisBin(
final Name name,
final RangeAxis rangeAxis,
final V value) {
this(name, new SimpleInternationalString(name.getLocalPart()), rangeAxis, value);
}
public RangeAxisBin(
final String name,
final String description,
final RangeAxis rangeAxis,
final V value) {
this(new NameImpl(name), new SimpleInternationalString(description), rangeAxis, value);
}
public RangeAxisBin(
final String name,
final RangeAxis rangeAxis,
final V value) {
this(new NameImpl(name), new SimpleInternationalString(name), rangeAxis, value);
}
private V value;
private InternationalString description;
private Name name;
public InternationalString getDescription(){
return description;
}
public Name getName(){
return name;
}
public Unit<?> getUnit() {
return rangeAxis.getUnitOfMeasure();
}
public V getValue() {
return value;
}
public RangeAxis getAxis(){
return rangeAxis;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((rangeAxis == null) ? 0 : rangeAxis.hashCode());
result = prime * result + ((description == null) ? 0 : description.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((value == null) ? 0 : value.hashCode());
return result;
}
@SuppressWarnings("unchecked")
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
RangeAxisBin other = (RangeAxisBin) obj;
if (rangeAxis == null) {
if (other.rangeAxis != null)
return false;
} else if (!rangeAxis.equals(other.rangeAxis))
return false;
if (description == null) {
if (other.description != null)
return false;
} else if (!description.equals(other.description))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (value == null) {
if (other.value != null)
return false;
} else if (!value.equals(other.value))
return false;
return true;
}
@Override
public String toString() {
final StringBuilder builder= new StringBuilder();
builder.append("RangeAxis bin description").append("\n");
builder.append("Name:").append("\t\t\t\t\t").append(name.toString()).append("\n");
builder.append("Description:").append("\t\t\t\t").append(description.toString()).append("\n");
builder.append("Value:").append("\t\t\t\t\t").append(value.toString()).append("\n");
builder.append("RangeAxis:").append("\n").append(rangeAxis.toString()).append("\n");
return builder.toString();
}
public boolean belongsTo(final RangeAxis rangeAxis){
return rangeAxis.equals(this.rangeAxis);
}
public boolean compatibleWith(final RangeAxis rangeAxis){
return rangeAxis.compatibleWith(this.rangeAxis);
}
}