package com.elphel.imagej.orthomosaic; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.time.LocalDateTime; import java.util.ArrayList; import ij.Prefs; public class GroundObjectPattern implements Serializable { private static final long serialVersionUID = 1L; public static long UTC_EAST_HRS = 3; public static String patterns_directory; //public LocalDateTime plusHours(long hours) public int zoom_level; // 1 for 5mm/pix public String object_type; // like "TM62" // public String object_version; // just change config LocalDateTime utcDateTime; // UTC public String filename; // should be square public GroundObjectPattern( String filename, int zoom_level, String object_type, LocalDateTime utcDateTime) { this.filename = filename; this.zoom_level = zoom_level; this.object_type = object_type; this.utcDateTime = utcDateTime; } private void writeObject(ObjectOutputStream oos) throws IOException { oos.defaultWriteObject(); } private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { ois.defaultReadObject(); } public static void setPatternsDirectory( String directory) { while (directory.endsWith(Prefs.getFileSeparator())){ directory=directory.substring(0, directory.length()-1); } patterns_directory = directory; } public String getPatternPath() { return patterns_directory+Prefs.getFileSeparator()+filename; } public static String getPatternsDirectory() { return patterns_directory; } public static GroundObjectPattern getPattern( String object_type, LocalDateTime utcDateTime, ArrayList<GroundObjectPattern> patterns) { GroundObjectPattern best_gop = null; long best_hrs_diff = 24; for (GroundObjectPattern gop:patterns) { if ((object_type == null) || object_type.equals(gop.object_type)) { if (utcDateTime != null) { long hrs_diff = Math.abs(utcDateTime.getHour()-gop.utcDateTime.getHour()); if (hrs_diff > 12) { hrs_diff = 24 -hrs_diff; } if (hrs_diff < best_hrs_diff) { best_gop = gop; best_hrs_diff = hrs_diff; } } else { best_gop = gop; // use latest } } } return best_gop; } public LocalDateTime getUTC() { return utcDateTime; } public LocalDateTime getLocalDT() { return utcDateTime.plusHours(UTC_EAST_HRS); } public boolean isEvening() { return getLocalDT().getHour() >= 12; } public double getAGL() { double agl = 50; // zoom 0 for 50m AGL for (int z = zoom_level; z > 0; z--) { agl /=2; } for (int z = zoom_level; z < 0; z++) { agl *=2; } return agl; } public int getZoomLevel() { return zoom_level; } }