blob: 3edb04e959c286c0c1f6869f51159f1235c562bb [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.sis.referencing.datum;
import java.util.Map;
import java.util.HashMap;
import java.time.Instant;
import org.apache.sis.referencing.NamedIdentifier;
import org.apache.sis.referencing.internal.VerticalDatumTypes;
import org.apache.sis.measure.Units;
import static org.apache.sis.util.privy.Constants.SECONDS_PER_DAY;
// Test dependencies
import org.apache.sis.metadata.iso.citation.HardCodedCitations;
// Specific to the geoapi-3.1 and geoapi-4.0 branches:
import org.opengis.referencing.datum.RealizationMethod;
import static org.opengis.referencing.IdentifiedObject.*;
import static org.opengis.referencing.ObjectDomain.*;
/**
* Collection of datum for testing purpose.
*
* @author Martin Desruisseaux (Geomatys)
*/
public final class HardCodedDatum {
/**
* Greenwich meridian (EPSG:8901), with angular measurements in decimal degrees.
*/
public static final DefaultPrimeMeridian GREENWICH = new DefaultPrimeMeridian(
properties("Greenwich", "8901", null),
0, Units.DEGREE);
/**
* Paris meridian (EPSG:8903), with angular measurements in grad.
*/
public static final DefaultPrimeMeridian PARIS = new DefaultPrimeMeridian(
properties("Paris", "8903", null),
2.5969213, Units.GRAD);
/**
* Old Paris meridian (EPSG:8914) defined as 2°20'13.95"E.
* Equivalent to 2.596898 grad (value given by EPSG).
*
* <p>When used together with {@link #PARIS}, this prime meridian is useful for testing
* two real-world prime meridians that are very close together but still different.</p>
*/
public static final DefaultPrimeMeridian PARIS_RGS = new DefaultPrimeMeridian(
properties("Paris RGS", "8914", null),
2 + (20 + 13.95/60)/60, Units.DEGREE);
/**
* WGS 1984 datum (EPSG:6326). Prime meridian is Greenwich.
* This datum is used in GPS systems.
*/
public static final DefaultGeodeticDatum WGS84 = new DefaultGeodeticDatum(
properties("World Geodetic System 1984", "6326", "Satellite navigation."),
new DefaultEllipsoid(GeodeticDatumMock.WGS84.getEllipsoid()), GREENWICH);
/**
* WGS 1972 datum (EPSG:6322). Prime meridian is Greenwich.
* This datum is used, together with {@linkplain #WGS84}, in
* {@code org.apache.sis.referencing.operation.transform.EarthGravitationalModel}.
*/
public static final DefaultGeodeticDatum WGS72 = new DefaultGeodeticDatum(
properties("World Geodetic System 1972", "6322", getScope(WGS84)),
new DefaultEllipsoid(GeodeticDatumMock.WGS84.getEllipsoid()), GREENWICH);
/**
* Nouvelle Triangulation Française datum (EPSG:6807). Prime meridian is Paris.
*/
public static final DefaultGeodeticDatum NTF = new DefaultGeodeticDatum(
properties("Nouvelle Triangulation Française", "6807", "Topographic mapping."),
new DefaultEllipsoid(GeodeticDatumMock.NTF.getEllipsoid()), PARIS);
/**
* Tokyo 1918 datum (EPSG:6301). Ellipsoid is Bessel 1841 and prime meridian is Greenwich.
* Bursa-Wolf parameters to {@link #JGD2000} are (-146.414, 507.337, 680.507).
*/
public static final DefaultGeodeticDatum TOKYO = new DefaultGeodeticDatum(
properties("Tokyo 1918", "6301", "Geodetic survey."),
DefaultEllipsoid.createFlattenedSphere(properties("Bessel 1841", "7004", null),
6377397.155, 299.1528128, Units.METRE), GREENWICH);
/**
* Japanese Geodetic Datum 2000 datum (EPSG:6612). Ellipsoid is GRS 1980 and prime meridian is Greenwich.
* This is useful for testing datum shift from {@link #TOKYO}.
*/
public static final DefaultGeodeticDatum JGD2000 = new DefaultGeodeticDatum(
properties("Japanese Geodetic Datum 2000", "6612", getScope(TOKYO)),
DefaultEllipsoid.createFlattenedSphere(properties("GRS 1980", "7019", null),
6378137, 298.257222101, Units.METRE), GREENWICH);
/**
* Spherical datum based on GRS 1980 Authalic Sphere (EPSG:6047). Prime meridian is Greenwich.
*/
public static final DefaultGeodeticDatum SPHERE = new DefaultGeodeticDatum(
properties("Not specified (based on GRS 1980 Authalic Sphere)", "6047", "Not a valid datum."),
new DefaultEllipsoid(GeodeticDatumMock.SPHERE.getEllipsoid()), GREENWICH);
/**
* Ellipsoid for measurements of height above the ellipsoid.
* This is not a valid datum according ISO 19111, but is used by Apache SIS for internal calculation.
*/
@SuppressWarnings("deprecation")
public static final DefaultVerticalDatum ELLIPSOID = new DefaultVerticalDatum(
properties("Ellipsoid", null, getScope(SPHERE)),
VerticalDatumTypes.ellipsoidal());
/**
* Mean sea level, which can be used as an approximation of geoid.
*/
@SuppressWarnings("deprecation")
public static final DefaultVerticalDatum MEAN_SEA_LEVEL = new DefaultVerticalDatum(
properties("Mean Sea Level", "5100", "Hydrography."),
RealizationMethod.GEOID);
/**
* Default datum for time measured since January 1st, 1970 at 00:00 UTC.
*/
public static final DefaultTemporalDatum UNIX = new DefaultTemporalDatum(
properties("UNIX", null, null),
Instant.EPOCH);
/**
* Default datum for time measured since November 17, 1858 at 00:00 UTC.
*/
public static final DefaultTemporalDatum MODIFIED_JULIAN = new DefaultTemporalDatum(
properties("Modified Julian", null, null),
Instant.ofEpochSecond(-40587L * SECONDS_PER_DAY));
/**
* A parametric datum for day of year, without any particular year.
*/
public static final DefaultParametricDatum DAY_OF_YEAR = new DefaultParametricDatum(
properties("Day of year", null, null));
/**
* Image with {@link org.apache.sis.coverage.grid.PixelInCell#CELL_CENTER}.
*/
@SuppressWarnings("removal")
public static final DefaultImageDatum IMAGE = new DefaultImageDatum(
properties("Image", null, null),
"cell center");
/**
* An engineering datum for unknown coordinate reference system. Such CRS are usually
* assumed Cartesian, but will not have any transformation path to other CRS.
*/
public static final DefaultEngineeringDatum UNKNOWN = new DefaultEngineeringDatum(properties("Unknown", null, null));
/**
* Creates a map of properties for the given name and EPSG code.
*
* @param name the object primary name.
* @param code the object identifier code.
* @param scope the object scope, or {@code null} if none.
*/
private static Map<String,?> properties(final String name, final String code, final CharSequence scope) {
final Map<String,Object> properties = new HashMap<>(4);
properties.put(NAME_KEY, name);
if (code != null) {
properties.put(IDENTIFIERS_KEY, new NamedIdentifier(HardCodedCitations.EPSG, code));
}
if (scope != null) {
properties.put(SCOPE_KEY, scope);
}
return properties;
}
/**
* Returns the scope of the given object.
*/
private static CharSequence getScope(final AbstractDatum object) {
return object.getDomains().iterator().next().getScope();
}
/**
* Do not allow instantiation of this class.
*/
private HardCodedDatum() {
}
}