View Javadoc
1   /**
2    * I waive copyright and related rights in the this work worldwide through the CC0 1.0 Universal
3    * public domain dedication. https://creativecommons.org/publicdomain/zero/1.0/legalcode
4    */
5   
6   package gov.usgs.volcanoes.winston.server.http.cmd.fdsnws.constraint;
7   
8   import java.awt.geom.Point2D;
9   
10  import gov.usgs.proj.Projection;
11  import gov.usgs.volcanoes.core.util.StringUtils;
12  import gov.usgs.volcanoes.winston.Channel;
13  import gov.usgs.volcanoes.winston.Instrument;
14  
15  /**
16   * Constrain results to a geographical circle.
17   * 
18   * @author Tom Parker
19   *
20   */
21  public class GeographicCircleConstraint extends GeographicConstraint {
22  
23    private static double DEFAULT_LATITUDE = 0;
24    private static double DEFAULT_LONGITUDE = 0;
25    private static double DEFAULT_MINRADIUS = 0;
26    private static double DEFAULT_MAXRADIUS = 180;
27  
28    private Point2D.Double point;
29    private double minRadius;
30    private double maxRadius;
31  
32    /**
33     * Constructor.
34     * 
35     * @param latitude decimal latitude
36     * @param longitude decimal longitude
37     * @param minRadius min radius in degrees
38     * @param maxRadius max radius in degrees
39     */
40    public GeographicCircleConstraint(final String latitude, final String longitude,
41        final String minRadius, final String maxRadius) {
42      final double lat = StringUtils.stringToDouble(latitude, DEFAULT_LATITUDE);
43      final double lon = StringUtils.stringToDouble(longitude, DEFAULT_LONGITUDE);
44  
45      point = new Point2D.Double(lat, lon);
46  
47      this.minRadius = StringUtils.stringToDouble(minRadius, DEFAULT_MINRADIUS);
48      this.maxRadius = StringUtils.stringToDouble(maxRadius, DEFAULT_MAXRADIUS);
49    }
50  
51    public boolean matches(final Channel chan) {
52      final Instrument i = chan.getInstrument();
53      final double lat = i.getLatitude();
54      final double lon = i.getLongitude();
55  
56      if (Double.isNaN(lat) || Double.isNaN(lon)) {
57        return false;
58      }
59  
60      final Point2D.Double p = new Point2D.Double(lat, lon);
61      final double radius = Projection.distanceBetweenDegree(point, p);
62  
63      return (radius >= minRadius && radius <= maxRadius);
64    }
65  
66    @Override
67    public String toString() {
68      return "FdsnGeographicCircleConstraint: " + point.x + "," + point.y + " " + minRadius + " >< "
69          + maxRadius;
70    }
71  }