]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - src/tim/prune/function/compress/MarkPointsInRectangleFunction.java
Moved source into separate src directory due to popular request
[GpsPrune.git] / src / tim / prune / function / compress / MarkPointsInRectangleFunction.java
diff --git a/src/tim/prune/function/compress/MarkPointsInRectangleFunction.java b/src/tim/prune/function/compress/MarkPointsInRectangleFunction.java
new file mode 100644 (file)
index 0000000..2ea0f8c
--- /dev/null
@@ -0,0 +1,98 @@
+package tim.prune.function.compress;
+
+import tim.prune.App;
+import tim.prune.UpdateMessageBroker;
+import tim.prune.data.DataPoint;
+
+/**
+ * Function to mark all the points in the selected rectangle
+ */
+public class MarkPointsInRectangleFunction extends MarkAndDeleteFunction
+{
+       /** Minimum and maximum latitude values of rectangle */
+       private double _minLat = 0.0, _maxLat = 0.0;
+       /** Minimum and maximum longitude values of rectangle */
+       private double _minLon = 0.0, _maxLon = 0.0;
+
+
+       /**
+        * Constructor
+        * @param inApp App object
+        */
+       public MarkPointsInRectangleFunction(App inApp)
+       {
+               super(inApp);
+       }
+
+       /** @return name key */
+       public String getNameKey() {
+               return "menu.track.markrectangle";
+       }
+
+       /**
+        * Set the coordinates of the rectangle
+        * @param inLon1 first longitude value
+        * @param inLat1 first latitude value
+        * @param inLon2 second longitude value
+        * @param inLat2 second latitude value
+        */
+       public void setRectCoords(double inLon1, double inLat1, double inLon2, double inLat2)
+       {
+               if (inLon1 == inLon2 || inLat1 == inLat2)
+               {
+                       // Coordinates not valid
+                       _minLat = _maxLat = _minLon = _maxLon = 0.0;
+               }
+               else
+               {
+                       if (inLon2 > inLon1) {
+                               _minLon = inLon1; _maxLon = inLon2;
+                       }
+                       else {
+                               _minLon = inLon2; _maxLon = inLon1;
+                       }
+                       if (inLat2 > inLat1) {
+                               _minLat = inLat1; _maxLat = inLat2;
+                       }
+                       else {
+                               _minLat = inLat2; _maxLat = inLat1;
+                       }
+               }
+       }
+
+       /**
+        * Begin the function using the set parameters
+        */
+       public void begin()
+       {
+               if (_maxLon == _minLon || _maxLat == _minLat) {
+                       return;
+               }
+
+               // Loop over all points in track
+               final int numPoints = _app.getTrackInfo().getTrack().getNumPoints();
+               int numMarked = 0;
+               for (int i=0; i<numPoints; i++)
+               {
+                       DataPoint point = _app.getTrackInfo().getTrack().getPoint(i);
+                       // For each point, see if it's within the rectangle
+                       final double pointLon = point.getLongitude().getDouble();
+                       final double pointLat = point.getLatitude().getDouble();
+                       final boolean insideRect = (pointLon >= _minLon && pointLon <= _maxLon
+                               && pointLat >= _minLat && pointLat <= _maxLat);
+                       // Mark it accordingly (also resetting points outside the rect to false)
+                       point.setMarkedForDeletion(insideRect);
+                       if (insideRect) {
+                               numMarked++;
+                       }
+               }
+
+               // Inform subscribers to update display
+               UpdateMessageBroker.informSubscribers();
+               // Confirm message showing how many marked
+               if (numMarked > 0)
+               {
+                       optionallyDeleteMarkedPoints(numMarked);
+               }
+       }
+}