]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - src/tim/prune/function/srtm/LookupSrtmFunction.java
Allow to overwrite altitudes from SRTM data
[GpsPrune.git] / src / tim / prune / function / srtm / LookupSrtmFunction.java
index 0ae2e45c04a42a1f76c9b22db13677b0be0656ad..51c587ee6ac9ee4fc07cf8e594ea3b49c50259a6 100644 (file)
@@ -32,6 +32,8 @@ import tim.prune.undo.UndoLookupSrtm;
  */
 public class LookupSrtmFunction extends GenericFunction implements Runnable
 {
+       /** Whether to overwrite all altitudes, or only fill in missing data */
+       private boolean _overwriteAlt = false;
        /** Progress dialog */
        private ProgressDialog _progress = null;
        /** Track to process */
@@ -53,13 +55,18 @@ public class LookupSrtmFunction extends GenericFunction implements Runnable
         * Constructor
         * @param inApp  App object
         */
-       public LookupSrtmFunction(App inApp) {
+       public LookupSrtmFunction(App inApp, boolean overwriteAlt) {
                super(inApp);
+               _overwriteAlt = overwriteAlt;
        }
 
        /** @return name key */
        public String getNameKey() {
-               return "function.lookupsrtm";
+               if (_overwriteAlt) {
+                       return "function.overwritesrtm";
+               } else {
+                       return "function.lookupsrtm";
+               }
        }
 
        /**
@@ -103,37 +110,14 @@ public class LookupSrtmFunction extends GenericFunction implements Runnable
        {
                // Compile list of tiles to get
                ArrayList<SrtmTile> tileList = new ArrayList<SrtmTile>();
-               boolean hasZeroAltitudePoints = false;
-               boolean hasNonZeroAltitudePoints = false;
-               // First, loop to see what kind of points we have
-               for (int i = 0; i < _track.getNumPoints(); i++)
-               {
-                       if (_track.getPoint(i).hasAltitude())
-                       {
-                               if (_track.getPoint(i).getAltitude().getValue() == 0) {
-                                       hasZeroAltitudePoints = true;
-                               }
-                               else {
-                                       hasNonZeroAltitudePoints = true;
-                               }
-                       }
-               }
-               // Should we overwrite the zero altitude values?
-               boolean overwriteZeros = hasZeroAltitudePoints && !hasNonZeroAltitudePoints;
-               // If non-zero values present as well, ask user whether to overwrite the zeros or not
-               if (hasNonZeroAltitudePoints && hasZeroAltitudePoints && JOptionPane.showConfirmDialog(_parentFrame,
-                       I18nManager.getText("dialog.lookupsrtm.overwritezeros"), I18nManager.getText(getNameKey()),
-                       JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)
-               {
-                       overwriteZeros = true;
-               }
+
+               boolean overwriteZeros = overwriteZeros();
 
                // Now loop again to extract the required tiles
                for (int i = 0; i < _track.getNumPoints(); i++)
                {
                        // Consider points which don't have altitudes or have zero values
-                       if (!_track.getPoint(i).hasAltitude()
-                               || (overwriteZeros && _track.getPoint(i).getAltitude().getValue() == 0))
+                       if (needsAltitude(_track.getPoint(i), overwriteZeros))
                        {
                                SrtmTile tile = new SrtmTile(_track.getPoint(i));
                                boolean alreadyGot = false;
@@ -155,15 +139,69 @@ public class LookupSrtmFunction extends GenericFunction implements Runnable
                }
        }
 
+       /**
+        * true if we need to set the altitude of this point
+        */
+       private boolean needsAltitude(DataPoint point, boolean overwriteZeros)
+       {
+               if (_overwriteAlt)
+               {
+                       return true;
+               }
+               if (!point.hasAltitude())
+               {
+                       return true;
+               }
+               if (overwriteZeros && point.getAltitude().getValue() == 0)
+               {
+                       return true;
+               }
+               return false;
+       }
+
+       private boolean overwriteZeros()
+       {
+               // nothing to do if we overwrite all altitudes anyway
+               if (_overwriteAlt) {
+                       return true;
+               }
+
+               boolean hasZeroAltitudePoints = false;
+               boolean hasNonZeroAltitudePoints = false;
+               // First, loop to see what kind of points we have
+               for (int i = 0; i < _track.getNumPoints(); i++)
+               {
+                       if (_track.getPoint(i).hasAltitude())
+                       {
+                               if (_track.getPoint(i).getAltitude().getValue() == 0) {
+                                       hasZeroAltitudePoints = true;
+                               }
+                               else {
+                                       hasNonZeroAltitudePoints = true;
+                               }
+                       }
+               }
+               // Should we overwrite the zero altitude values?
+               boolean overwriteZeros = hasZeroAltitudePoints && !hasNonZeroAltitudePoints;
+               // If non-zero values present as well, ask user whether to overwrite the zeros or not
+               if (hasNonZeroAltitudePoints && hasZeroAltitudePoints && JOptionPane.showConfirmDialog(_parentFrame,
+                       I18nManager.getText("dialog.lookupsrtm.overwritezeros"), I18nManager.getText(getNameKey()),
+                       JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)
+               {
+                       overwriteZeros = true;
+               }
+               return overwriteZeros;
+       }
+
 
        /**
         * Lookup the values from SRTM data
         * @param inTileList list of tiles to get
         * @param inOverwriteZeros true to overwrite zero altitude values
         */
-       private void lookupValues(ArrayList<SrtmTile> inTileList, boolean inOverwriteZeros)
+       private void lookupValues(ArrayList<SrtmTile> inTileList, boolean overwriteZeros)
        {
-               UndoLookupSrtm undo = new UndoLookupSrtm(_app.getTrackInfo());
+               UndoLookupSrtm undo = new UndoLookupSrtm(_app.getTrackInfo(), _overwriteAlt);
                int numAltitudesFound = 0;
                // Update progress bar
                if (_progress != null)
@@ -214,8 +252,7 @@ public class LookupSrtmFunction extends GenericFunction implements Runnable
                                                for (int p = 0; p < _track.getNumPoints(); p++)
                                                {
                                                        DataPoint point = _track.getPoint(p);
-                                                       if (!point.hasAltitude()
-                                                               || (inOverwriteZeros && point.getAltitude().getValue() == 0))
+                                                       if (needsAltitude(point, overwriteZeros))
                                                        {
                                                                if (new SrtmTile(point).equals(tile))
                                                                {