001 /*
002 * GeoAPI - Java interfaces for OGC/ISO standards
003 * http://www.geoapi.org
004 *
005 * Copyright (C) 2006-2012 Open Geospatial Consortium, Inc.
006 * All Rights Reserved. http://www.opengeospatial.org/ogc/legal
007 *
008 * Permission to use, copy, and modify this software and its documentation, with
009 * or without modification, for any purpose and without fee or royalty is hereby
010 * granted, provided that you include the following on ALL copies of the software
011 * and documentation or portions thereof, including modifications, that you make:
012 *
013 * 1. The full text of this NOTICE in a location viewable to users of the
014 * redistributed or derivative work.
015 * 2. Notice of any changes or modifications to the OGC files, including the
016 * date changes were made.
017 *
018 * THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE
019 * NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
020 * TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT
021 * THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY
022 * PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
023 *
024 * COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
025 * CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION.
026 *
027 * The name and trademarks of copyright holders may NOT be used in advertising or
028 * publicity pertaining to the software without specific, written prior permission.
029 * Title to copyright in this software and any associated documentation will at all
030 * times remain with copyright holders.
031 */
032 package org.opengis.referencing.cs;
033
034 import java.util.List;
035 import java.util.ArrayList;
036
037 import org.opengis.util.CodeList;
038 import org.opengis.annotation.UML;
039
040 import static org.opengis.annotation.Obligation.*;
041 import static org.opengis.annotation.Specification.*;
042
043
044 /**
045 * Meaning of the axis value range specified through
046 * {@linkplain CoordinateSystemAxis#getMinimumValue minimum value} and
047 * {@linkplain CoordinateSystemAxis#getMaximumValue maximum value}.
048 *
049 * @author Martin Desruisseaux (IRD)
050 * @version 3.0
051 * @since 2.1
052 *
053 * @see CoordinateSystemAxis#getRangeMeaning()
054 */
055 @UML(identifier="CS_RangeMeaning", specification=ISO_19111)
056 public final class RangeMeaning extends CodeList<RangeMeaning> {
057 /**
058 * Serial number for compatibility with different versions.
059 */
060 private static final long serialVersionUID = -3525560558294789416L;
061
062 /**
063 * List of all enumerations of this type.
064 * Must be declared before any enum declaration.
065 */
066 private static final List<RangeMeaning> VALUES = new ArrayList<RangeMeaning>(2);
067
068 /**
069 * Any value between and including {@linkplain CoordinateSystemAxis#getMinimumValue minimum value}
070 * and {@linkplain CoordinateSystemAxis#getMaximumValue maximum value} is valid.
071 */
072 @UML(identifier="exact", obligation=CONDITIONAL, specification=ISO_19111)
073 public static final RangeMeaning EXACT = new RangeMeaning("EXACT");
074
075 /**
076 * The axis is continuous with values wrapping around at the
077 * {@linkplain CoordinateSystemAxis#getMinimumValue minimum value} and
078 * {@linkplain CoordinateSystemAxis#getMaximumValue maximum value}.
079 * Values with the same meaning repeat modulo the difference between maximum value and
080 * minimum value.
081 *
082 * <blockquote><font size="-1"><b>Example:</b> In a geographic CRS, longitude values are
083 * often defined with a finite extent (e.g., from -180 degrees to +180 degrees). The minimum
084 * and maximum longitude limits define a single line (on the ellipsoid, sphere, or cylinder),
085 * known as the anti-meridian, across which longitude values are discontinuous: as this line
086 * is crossed, longitude changes abruptly (e.g., going West from a little more than -180° to
087 * a little less than +180°).</font></blockquote>
088 */
089 @UML(identifier="wraparound", obligation=CONDITIONAL, specification=ISO_19111)
090 public static final RangeMeaning WRAPAROUND = new RangeMeaning("WRAPAROUND");
091
092 /**
093 * Constructs an enum with the given name. The new enum is
094 * automatically added to the list returned by {@link #values}.
095 *
096 * @param name The enum name. This name must not be in use by an other enum of this type.
097 */
098 private RangeMeaning(final String name) {
099 super(name, VALUES);
100 }
101
102 /**
103 * Returns the list of {@code RangeMeaning}s.
104 *
105 * @return The list of codes declared in the current JVM.
106 */
107 public static RangeMeaning[] values() {
108 synchronized (VALUES) {
109 return VALUES.toArray(new RangeMeaning[VALUES.size()]);
110 }
111 }
112
113 /**
114 * Returns the list of enumerations of the same kind than this enum.
115 */
116 @Override
117 public RangeMeaning[] family() {
118 return values();
119 }
120
121 /**
122 * Returns the range meaning that matches the given string, or returns a
123 * new one if none match it. More specifically, this methods returns the first instance for
124 * which <code>{@linkplain #name() name()}.{@linkplain String#equals equals}(code)</code>
125 * returns {@code true}. If no existing instance is found, then a new one is created for
126 * the given name.
127 *
128 * @param code The name of the code to fetch or to create.
129 * @return A code matching the given name.
130 */
131 public static RangeMeaning valueOf(String code) {
132 return valueOf(RangeMeaning.class, code);
133 }
134 }