Working with Units
When you work with numbers, you often need to know the unit of the quantity expressed. INTViewer has a simple unit system to retrieve units and convert numbers expressed in different units.
Retrieving the vertical unit of a dataset
If a dataset (implementing com.interactive.intviewerapi.data.IData) has time or depth unit information, this dataset implements the com.interactive.intviewerapi.units.IZUnitProvider interface. The only method of that interface is getZUnit().
At this time, only com.interactive.intviewerapi.data.seismic.ISeismicData and com.interactive.intviewerapi.data.well.IWellData implement the IZUnitProvider interface.
ISeismicData seismicData = ...
IUnit unit = seismicData.getZUnit();
System.out.println(unit.getSymbol()); // example: "s"
System.out.println(unit.getName()); // example: "Seconds"
Finding out whether a dataset is in time or depth
ISeismicData seismicData = ...
IUnit unit = seismicData.getZUnit();
if (unit.getSIUnit().getSymbol().equals(IUnit.SECONDS_SYMBOL)) {
System.out.println("Dataset is in time");
} else if (unit.getSIUnit().getSymbol().equals(IUnit.METERS_SYMBOL)) {
System.out.println("Dataset is in depth");
}
Converting quantities
ISeismicData seismicData = ...
IUnit fromUnit = seismicData.getZUnit();
double sampleRate = seismicData.getDataStatistics().getSampleRate();
IUnit millisecondsUnit = IUnit.Factory.getUnit(IUnit.MILLISECONDS_SYMBOL);
double sampleRateInMilliseconds = fromUnit.convert(quantity, millisecondsUnit);
You can convert multiple quantities at a time using the convert(double[] quantities, IUnit unit) method.
Registering your own unit
To create your own unit, create a class extending com.interactive.intviewerapi.units.AbstractUnit.
TIMEINMILLISECONDSUNIT.JAVA
package com.interactive.intviewer.units;
import com.interactive.intviewerapi.units.AbstractUnit;
import com.interactive.intviewerapi.units.IUnit;
public class TimeInMillisecondsUnit extends AbstractUnit {
public TimeInMillisecondsUnit() {
super("Milliseconds", IUnit.MILLISECONDS_SYMBOL);
}
@Override
public double convertToSIUnit(double timeInMilliseconds) {
return timeInMilliseconds / 1000;
}
@Override
public double convertFromSIUnit(double timeInSeconds) {
return timeInSeconds * 1000;
}
@Override
public IUnit getSIUnit() {
return IUnit.Factory.getUnit(IUnit.SECONDS_SYMBOL);
}
}
Then register that class in the layer.xml file:
LAYER.XML
<folder name="Units">
<file name="com-interactive-intviewer-units-TimeInMillisecondsUnit.instance"/>
</folder>