All Downloads are FREE. Search and download functionalities are using the official Maven repository.

au.gov.amsa.geo.model.Options Maven / Gradle / Ivy

The newest version!
package au.gov.amsa.geo.model;

import static au.gov.amsa.geo.model.Util.formatDate;

import java.math.BigDecimal;
import java.util.Optional;

import org.joda.time.DateTime;

import com.github.davidmoten.guavamini.Preconditions;

public class Options {

	private static final double KM_PER_NM = 1.852;
	private final BigDecimal originLat;
	private final BigDecimal originLon;
	private final BigDecimal cellSizeDegrees;
	private final double cellSizeDegreesDouble;
	private final Bounds bounds;
	private final Grid grid;
	private final Bounds filterBounds;
	private final SegmentOptions segmentOptions;
	private final Optional startTime;
	private final Optional finishTime;

	public Options(BigDecimal originLat, BigDecimal originLon,
			BigDecimal cellSizeDegrees, Bounds bounds,
			Optional filterBounds, SegmentOptions segmentOptions,
			Optional startTime, Optional finishTime) {
		Preconditions.checkNotNull(originLat);
		Preconditions.checkNotNull(originLon);
		Preconditions.checkNotNull(cellSizeDegrees);
		Preconditions.checkArgument(cellSizeDegrees.doubleValue() > 0);
		Preconditions.checkNotNull(filterBounds);
		Preconditions.checkNotNull(startTime);
		Preconditions.checkNotNull(finishTime);
		this.originLat = originLat;
		this.originLon = originLon;
		this.cellSizeDegrees = cellSizeDegrees;
		this.bounds = bounds;
		if (filterBounds.isPresent())
			this.filterBounds = filterBounds.get();
		else
			this.filterBounds = bounds;
		this.segmentOptions = segmentOptions;
		this.startTime = startTime;
		this.finishTime = finishTime;
		grid = new Grid(this);
		this.cellSizeDegreesDouble = cellSizeDegrees.doubleValue();
	}

	public int maxCells() {
		return (int) Math.round(bounds.getWidthDegrees()
				* bounds.getHeightDegrees() / cellSizeDegreesDouble
				/ cellSizeDegreesDouble);
	}

	public static Bounds createFilterBounds(Bounds bounds,
			SegmentOptions segmentOptions) {
		double maxTimeTravellingHours = 4.0;
		double maxDistanceKm = maxTimeTravellingHours
				* segmentOptions.maxSpeedKnots() * KM_PER_NM;
		au.gov.amsa.util.navigation.Position topLeftBounds = au.gov.amsa.util.navigation.Position
				.create(bounds.getTopLeftLat(), bounds.getTopLeftLon());
		double topLat = topLeftBounds.predict(maxDistanceKm, 0).getLat();
		double leftLon = topLeftBounds.predict(maxDistanceKm, -90).getLon();
		au.gov.amsa.util.navigation.Position bottomRightBounds = au.gov.amsa.util.navigation.Position
				.create(bounds.getBottomRightLat(), bounds.getBottomRightLon());

		double bottomLat = bottomRightBounds.predict(maxDistanceKm, 180)
				.getLat();
		double rightLon = bottomRightBounds.predict(maxDistanceKm, 90).getLon();

		return new Bounds(topLat, leftLon, bottomLat, rightLon);
	}

	public Optional getStartTime() {
		return startTime;
	}

	public Optional getFinishTime() {
		return finishTime;
	}

	public BigDecimal getOriginLat() {
		return originLat;
	}

	public BigDecimal getOriginLon() {
		return originLon;
	}

	public BigDecimal getCellSizeDegrees() {
		return cellSizeDegrees;
	}

	public double getCellSizeDegreesAsDouble() {
		return cellSizeDegreesDouble;
	}

	public Bounds getBounds() {
		return bounds;
	}

	public Bounds getFilterBounds() {
		return filterBounds;
	}

	public Grid getGrid() {
		return grid;
	}

	@Override
	public String toString() {
		StringBuilder builder = new StringBuilder();
		builder.append("Options [originLat=");
		builder.append(originLat);
		builder.append(", originLon=");
		builder.append(originLon);
		builder.append(", cellSizeDegrees=");
		builder.append(cellSizeDegrees);
		builder.append(", bounds=");
		builder.append(bounds);
		builder.append(", filterBounds=");
		builder.append(filterBounds);
		builder.append(", startTime=");
		builder.append(formatDate(startTime));
		builder.append(", finishTime=");
		builder.append(formatDate(finishTime));
		builder.append(", segmentOptions=");
		builder.append(segmentOptions);
		builder.append("]");
		return builder.toString();
	}

	public static Builder builder() {
		return new Builder();
	}

	public static Builder builder(Options o) {
		return builder().bounds(o.getBounds())
				.cellSizeDegrees(o.getCellSizeDegrees())
				.filterBounds(o.getFilterBounds())
				.finishTime(o.getFinishTime()).startTime(o.getStartTime())
				.originLat(o.getOriginLat()).originLon(o.getOriginLon())
				.segmentOptions(o.getSegmentOptions());
	}

	public SegmentOptions getSegmentOptions() {
		return segmentOptions;
	}

	public static class Builder {

		private BigDecimal originLat = BigDecimal.ZERO;
		private BigDecimal originLon = BigDecimal.ZERO;
		private BigDecimal cellSizeDegrees = BigDecimal.ONE;
		private Bounds bounds = new Bounds(15, 67, -60, 179);
		private SegmentOptions segmentOptions = SegmentOptions.builder()
				.build();
		private Optional filterBounds = Optional.empty();
		private Optional startTime = Optional.empty();
		private Optional finishTime = Optional.empty();

		private Builder() {
		}

		public Builder originLat(BigDecimal originLat) {
			this.originLat = originLat;
			return this;
		}

		public Builder originLat(double originLat) {
			this.originLat = BigDecimal.valueOf(originLat);
			return this;
		}

		public Builder originLon(BigDecimal originLon) {
			this.originLon = originLon;
			return this;
		}

		public Builder originLon(double originLon) {
			this.originLon = BigDecimal.valueOf(originLon);
			return this;
		}

		public Builder cellSizeDegrees(BigDecimal cellSizeDegrees) {
			this.cellSizeDegrees = cellSizeDegrees;
			return this;
		}

		public Builder cellSizeDegrees(double cellSizeDegrees) {
			this.cellSizeDegrees = BigDecimal.valueOf(cellSizeDegrees)
					.setScale(30);
			return this;
		}

		public Builder bounds(Bounds bounds) {
			this.bounds = bounds;
			return this;
		}

		public Builder filterBounds(Bounds bounds) {
			this.filterBounds = Optional.of(bounds);
			return this;
		}

		public Builder startTime(Optional startTime) {
			this.startTime = startTime;
			return this;
		}

		public Builder startTime(String isoDateTimeFormat) {
			this.startTime = Optional.of(DateTime.parse(isoDateTimeFormat)
					.getMillis());
			return this;
		}

		public Builder finishTime(Optional finishTime) {
			this.finishTime = finishTime;
			return this;
		}

		public Builder finishTime(String isoDateTimeFormat) {
			this.finishTime = Optional.of(DateTime.parse(isoDateTimeFormat)
					.getMillis());
			return this;
		}

		public Builder segmentOptions(SegmentOptions o) {
			this.segmentOptions = o;
			return this;
		}

		public Options build() {
			return new Options(originLat, originLon, cellSizeDegrees, bounds,
					filterBounds, segmentOptions, startTime, finishTime);
		}
	}

	public Builder buildFrom() {
		return builder(this);
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy