blob: a1cbedb83737afde2e40cee1f42a94e153d070a8 [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.crs;
import java.util.Map;
import jakarta.xml.bind.JAXBException;
import org.opengis.referencing.cs.AxisDirection;
import org.opengis.referencing.cs.AffineCS;
import org.opengis.referencing.cs.CartesianCS;
import org.opengis.referencing.cs.CoordinateSystem;
import org.opengis.referencing.datum.PixelInCell;
import org.apache.sis.referencing.cs.DefaultAffineCS;
import org.apache.sis.referencing.datum.DefaultImageDatum;
import org.apache.sis.io.wkt.Convention;
import org.apache.sis.xml.Namespaces;
// Test dependencies
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
import org.apache.sis.xml.test.TestCase;
import org.apache.sis.referencing.cs.HardCodedCS;
import org.apache.sis.referencing.cs.HardCodedAxes;
import static org.apache.sis.metadata.Assertions.assertXmlEquals;
import static org.apache.sis.referencing.Assertions.assertWktEquals;
// Specific to the geoapi-3.1 and geoapi-4.0 branches:
import static org.opengis.test.Assertions.assertAxisDirectionsEqual;
/**
* Tests {@link DefaultImageCRS}.
*
* @author Martin Desruisseaux (Geomatys)
*/
@SuppressWarnings("removal")
public final class DefaultImageCRSTest extends TestCase {
/**
* Creates a new test case.
*/
public DefaultImageCRSTest() {
}
/**
* Creates an image CRS using a two-dimensional affine or Cartesian coordinate system.
*
* @param cartesian {@code true} for a Cartesian coordinate system, or {@code false} for an affine one.
*/
private static DefaultImageCRS create(final boolean cartesian) {
return new DefaultImageCRS(Map.of(DefaultImageCRS.NAME_KEY, "An image CRS"),
new DefaultImageDatum(Map.of(DefaultImageDatum.NAME_KEY, "C1"), PixelInCell.CELL_CENTER),
cartesian ? HardCodedCS.GRID : new DefaultAffineCS(
Map.of(DefaultAffineCS.NAME_KEY, "Grid"),
HardCodedAxes.COLUMN, HardCodedAxes.ROW));
}
/**
* Tests WKT 2 formatting.
*/
@Test
public void testWKT2() {
final DefaultImageCRS crs = create(true);
assertWktEquals(Convention.WKT2,
"IMAGECRS[“An image CRS”,\n" +
" IDATUM[“C1”],\n" +
" CS[Cartesian, 2],\n" +
" AXIS[“Column (i)”, columnPositive, ORDER[1]],\n" +
" AXIS[“Row (j)”, rowPositive, ORDER[2]],\n" +
" SCALEUNIT[“unity”, 1]]",
crs);
assertWktEquals(Convention.WKT2_SIMPLIFIED,
"ImageCRS[“An image CRS”,\n" +
" ImageDatum[“C1”],\n" +
" CS[Cartesian, 2],\n" +
" Axis[“Column (i)”, columnPositive],\n" +
" Axis[“Row (j)”, rowPositive],\n" +
" Unit[“unity”, 1]]",
crs);
}
/**
* Tests XML (un)marshalling of an image CRS using a Cartesian CS.
*
* @throws JAXBException if an error occurred during (un)marshalling.
*/
@Test
public void testCartesianXML() throws JAXBException {
testXML(true);
}
/**
* Tests XML (un)marshalling of an image CRS using an affine CS.
*
* @throws JAXBException if an error occurred during (un)marshalling.
*/
@Test
public void testAffineXML() throws JAXBException {
testXML(false);
}
/**
* Implementation of {@link #testCartesianXML()} and {@link #testAffineXML()}.
*/
private void testXML(final boolean cartesian) throws JAXBException {
String expected =
"<gml:ImageCRS xmlns:gml=\"" + Namespaces.GML + "\">\n" +
" <gml:name>An image CRS</gml:name>\n" +
" <gml:cartesianCS>\n" +
" <gml:CartesianCS gml:id=\"Grid\">\n" +
" <gml:name>Grid</gml:name>\n" +
" <gml:axis>\n" +
" <gml:CoordinateSystemAxis uom=\"urn:ogc:def:uom:EPSG::9201\" gml:id=\"Column\">\n" +
" <gml:name>Column</gml:name>\n" +
" <gml:axisAbbrev>i</gml:axisAbbrev>\n" +
" <gml:axisDirection codeSpace=\"EPSG\">columnPositive</gml:axisDirection>\n" +
" </gml:CoordinateSystemAxis>\n" +
" </gml:axis>\n" +
" <gml:axis>\n" +
" <gml:CoordinateSystemAxis uom=\"urn:ogc:def:uom:EPSG::9201\" gml:id=\"Row\">\n" +
" <gml:name>Row</gml:name>\n" +
" <gml:axisAbbrev>j</gml:axisAbbrev>\n" +
" <gml:axisDirection codeSpace=\"EPSG\">rowPositive</gml:axisDirection>\n" +
" </gml:CoordinateSystemAxis>\n" +
" </gml:axis>\n" +
" </gml:CartesianCS>\n" +
" </gml:cartesianCS>\n" +
" <gml:imageDatum>\n" +
" <gml:ImageDatum gml:id=\"C1\">\n" +
" <gml:name>C1</gml:name>\n" +
" <gml:pixelInCell>cell center</gml:pixelInCell>\n" +
" </gml:ImageDatum>\n" +
" </gml:imageDatum>\n" +
"</gml:ImageCRS>";
if (!cartesian) {
expected = expected.replace("CartesianCS", "AffineCS").replace("cartesianCS", "affineCS");
}
final String xml = marshal(create(cartesian));
assertXmlEquals(expected, xml, "xmlns:*");
final DefaultImageCRS crs = unmarshal(DefaultImageCRS.class, xml);
assertEquals("An image CRS", crs.getName().getCode());
assertEquals("C1", crs.getDatum().getName().getCode());
final CoordinateSystem cs = crs.getCoordinateSystem();
assertInstanceOf((Class<?>) (cartesian ? CartesianCS.class : AffineCS.class), cs);
assertEquals(cartesian, cs instanceof CartesianCS);
assertEquals("Grid", cs.getName().getCode());
assertEquals(2, cs.getDimension());
assertAxisDirectionsEqual(cs, AxisDirection.COLUMN_POSITIVE, AxisDirection.ROW_POSITIVE);
assertEquals("Column", cs.getAxis(0).getName().getCode());
assertEquals("Row", cs.getAxis(1).getName().getCode());
assertEquals("i", cs.getAxis(0).getAbbreviation());
assertEquals("j", cs.getAxis(1).getAbbreviation());
}
}