Class DefaultGeographicBoundingBox

  • All Implemented Interfaces:
    Serializable, Emptiable, Lenient­Comparable, Identified­Object, Geographic­Bounding­Box, Geographic­Extent

    public class DefaultGeographicBoundingBox
    extends AbstractGeographicExtent
    implements GeographicBoundingBox
    Geographic position of the dataset. This is only an approximate so specifying the coordinate reference system is unnecessary. The CRS shall be geographic with Greenwich prime meridian, but the datum doesn't need to be WGS84.

    The following properties are mandatory in a well-formed metadata according ISO 19115:

    EX_Geographic­Bounding­Box   ├─west­Bound­Longitude…… The western-most coordinate of the limit of the dataset extent.   ├─east­Bound­Longitude…… The eastern-most coordinate of the limit of the dataset extent.   ├─south­Bound­Latitude…… The southern-most coordinate of the limit of the dataset extent.   └─north­Bound­Latitude…… The northern-most, coordinate of the limit of the dataset extent.
    In addition to the standard properties, SIS provides the following methods:
    Validation and normalization
    All constructors and setter methods in this class perform the following argument validation or normalization:
    • If the south bound latitude is greater than the north bound latitude, then an exception is thrown.
    • If any latitude is set to a value outside the [-9090]° range, then that latitude will be clamped.
    • If any longitude is set to a value outside the [-180180]° range, then a multiple of 360° will be added or subtracted to that longitude in order to bring it back inside the range.
    If the west bound longitude is greater than the east bound longitude, then the box spans the anti-meridian. See GeneralEnvelope for more information on anti-meridian spanning.
    Note: relationship with Envelope classes
    The org​.apache​.sis​.geometry package provides various Envelope classes serving a simular purpose. The main difference is that envelopes can be expressed in any Coordinate Reference System (for example using any map projection), may have any number of dimensions, axes may have any direction (some maps are south-oriented) and may use any units of measurement. By contrast, geographic bounding box are restricted to two-dimensional geographic CRS with latitude and longitude in decimal degrees, inside the [-90 … +90]° and [-180 … +180]° range respectively, increasing toward north and east respectively, and longitude measured from the international reference meridian (Greenwich on Earth). However Geographic­Bounding­Box said nothing about the geodetic datum. Consequently this bounding box should be used only as a convenient way to give an approximate description of a location. Users can assume a precision of about 0.01° for the latitude and longitude values in this class. If more precision is desired, an Envelope should be considered instead.
    Limitations
    • Instances of this class are not synchronized for multi-threading. Synchronization, if needed, is caller's responsibility.
    • Serialized objects of this class are not guaranteed to be compatible with future Apache SIS releases. Serialization support is appropriate for short term storage or RMI between applications running the same version of Apache SIS. For long term storage, use XML instead.
    Since:
    0.3
    See Also:
    General­Envelope, Serialized Form

    Defined in the sis-metadata module

    • Constructor Detail

      • DefaultGeographicBoundingBox

        public DefaultGeographicBoundingBox()
        Constructs an initially empty geographic bounding box. All longitude and latitude values are initialized to Double​.Na­N.
      • DefaultGeographicBoundingBox

        public DefaultGeographicBoundingBox​(double westBoundLongitude,
                                            double eastBoundLongitude,
                                            double southBoundLatitude,
                                            double northBoundLatitude)
                                     throws IllegalArgumentException
        Creates a geographic bounding box initialized to the specified values. The inclusion property is set to true.

        Caution: Arguments are expected in the same order than they appear in the ISO 19115 specification. This is different than the order commonly found in the Java2D world, which is rather (xmin, ymin, xmax, ymax).

        Parameters:
        west­Bound­Longitude - the minimal λ value.
        east­Bound­Longitude - the maximal λ value.
        south­Bound­Latitude - the minimal φ value.
        north­Bound­Latitude - the maximal φ value.
        Throws:
        Illegal­Argument­Exception - if (south bound > north bound). Note that NaN values are allowed.
        See Also:
        set­Bounds(double, double, double, double)
    • Method Detail

      • castOrCopy

        public static DefaultGeographicBoundingBox castOrCopy​(GeographicBoundingBox object)
        Returns a SIS metadata implementation with the values of the given arbitrary implementation. This method performs the first applicable action in the following choices:
        • If the given object is null, then this method returns null.
        • Otherwise if the given object is already an instance of Default­Geographic­Bounding­Box, then it is returned unchanged.
        • Otherwise a new Default­Geographic­Bounding­Box instance is created using the copy constructor and returned. Note that this is a shallow copy operation, since the other metadata contained in the given object are not recursively copied.
        Parameters:
        object - the object to get as a SIS implementation, or null if none.
        Returns:
        a SIS implementation containing the values of the given object (may be the given object itself), or null if the argument was null.
      • getWestBoundLongitude

        @ValueRange(minimum=-180.0,
                    maximum=180.0)
        public double getWestBoundLongitude()
        Returns the western-most coordinate of the limit of the dataset extent. The value is expressed in longitude in decimal degrees (positive east).

        Note that the returned value is greater than the east bound longitude if this box is spanning over the anti-meridian.

        Specified by:
        get­West­Bound­Longitude in interface Geographic­Bounding­Box
        Returns:
        the western-most longitude between -180° and +180° inclusive, or NaN if undefined.
      • setWestBoundLongitude

        public void setWestBoundLongitude​(double newValue)
        Sets the western-most coordinate of the limit of the dataset extent. The value is expressed in longitude in decimal degrees (positive east). Values outside the [-180 … 180]° range are normalized.
        Parameters:
        new­Value - the western-most longitude between -180° and +180° inclusive, or NaN to undefine.
      • getEastBoundLongitude

        @ValueRange(minimum=-180.0,
                    maximum=180.0)
        public double getEastBoundLongitude()
        Returns the eastern-most coordinate of the limit of the dataset extent. The value is expressed in longitude in decimal degrees (positive east).

        Note that the returned value is smaller than the west bound longitude if this box is spanning over the anti-meridian.

        Specified by:
        get­East­Bound­Longitude in interface Geographic­Bounding­Box
        Returns:
        the eastern-most longitude between -180° and +180° inclusive, or NaN if undefined.
      • setEastBoundLongitude

        public void setEastBoundLongitude​(double newValue)
        Sets the eastern-most coordinate of the limit of the dataset extent. The value is expressed in longitude in decimal degrees (positive east). Values outside the [-180 … 180]° range are normalized.
        Parameters:
        new­Value - the eastern-most longitude between -180° and +180° inclusive, or NaN to undefine.
      • getSouthBoundLatitude

        @ValueRange(minimum=-90.0,
                    maximum=90.0)
        public double getSouthBoundLatitude()
        Returns the southern-most coordinate of the limit of the dataset extent. The value is expressed in latitude in decimal degrees (positive north).
        Specified by:
        get­South­Bound­Latitude in interface Geographic­Bounding­Box
        Returns:
        the southern-most latitude between -90° and +90° inclusive, or NaN if undefined.
      • setSouthBoundLatitude

        public void setSouthBoundLatitude​(double newValue)
        Sets the southern-most coordinate of the limit of the dataset extent. The value is expressed in latitude in decimal degrees (positive north). Values outside the [-90 … 90]° range are clamped. If the result is greater than the north bound latitude, then the north bound is set to Double​.Na­N.
        Parameters:
        new­Value - the southern-most latitude between -90° and +90° inclusive, or NaN to undefine.
      • getNorthBoundLatitude

        @ValueRange(minimum=-90.0,
                    maximum=90.0)
        public double getNorthBoundLatitude()
        Returns the northern-most, coordinate of the limit of the dataset extent. The value is expressed in latitude in decimal degrees (positive north).
        Specified by:
        get­North­Bound­Latitude in interface Geographic­Bounding­Box
        Returns:
        the northern-most latitude between -90° and +90° inclusive, or NaN if undefined.
      • setNorthBoundLatitude

        public void setNorthBoundLatitude​(double newValue)
        Sets the northern-most, coordinate of the limit of the dataset extent. The value is expressed in latitude in decimal degrees (positive north). Values outside the [-90 … 90]° range are clamped. If the result is smaller than the south bound latitude, then the south bound is set to Double​.Na­N.
        Parameters:
        new­Value - the northern-most latitude between -90° and +90° inclusive, or NaN to undefine.
      • setBounds

        public void setBounds​(double westBoundLongitude,
                              double eastBoundLongitude,
                              double southBoundLatitude,
                              double northBoundLatitude)
                       throws IllegalArgumentException
        Sets the bounding box to the specified values. The inclusion property is left unchanged.

        Caution: Arguments are expected in the same order than they appear in the ISO 19115 specification. This is different than the order commonly found in the Java2D world, which is rather (xmin, ymin, xmax, ymax).

        Parameters:
        west­Bound­Longitude - the minimal λ value.
        east­Bound­Longitude - the maximal λ value.
        south­Bound­Latitude - the minimal φ value.
        north­Bound­Latitude - the maximal φ value.
        Throws:
        Illegal­Argument­Exception - if (south bound > north bound). Note that NaN values are allowed.
      • setBounds

        public void setBounds​(GeographicBoundingBox box)
        Sets the bounding box to the same values than the specified box.
        Parameters:
        box - the geographic bounding box to use for setting the values of this box.
      • add

        public void add​(GeographicBoundingBox box)
        Adds a geographic bounding box to this box. This method behavior depends on whether the bounding boxes encompass an area covered by the data (inclusion) or an area where data is not present (exclusion):
        • If the inclusion status is the same for this box and the box to be added, then the resulting bounding box is the union of the two boxes.
        • If the inclusion/exclusion status are opposite, then this method attempts to exclude some area of the specified box from this box. The resulting bounding box is smaller if the exclusion can be performed without ambiguity.
        In both cases, if either this box or the specified box has NaN bounds, then the corresponding bounds of the result will bet set to NaN.
        Rational: this class is stricter about NaN values than other classes like General­Envelope. The reason is that computations on Geographic­Bounding­Box instances are rare (Envelope instances are preferred for this purpose). Usually, Geographic­Bounding­Box values come directly from some metadata structure. Consequently NaN values in Geographic­Bounding­Box means "information is unknown" more often than "not yet calculated".
        Parameters:
        box - the geographic bounding box to add to this box.
        See Also:
        General­Envelope​.add(Envelope)
      • isEmpty

        public boolean isEmpty()
        Returns true if this metadata is empty. This metadata is considered empty if every bound values are NaN. Note that this is different than the Java2D or envelope definition of "emptiness", since we don't test if the area is greater than zero - this method is a metadata test, not a geometric test.
        Specified by:
        is­Empty in interface Emptiable
        Overrides:
        is­Empty in class Abstract­Metadata
        Returns:
        true if this metadata does not define any bound value.
        See Also:
        Abstract­Envelope​.is­All­Na­N()