blob: b381f50d8fb5baeaa3ad89e908f305eca60ad008 [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.internal.referencing;
import org.opengis.referencing.cs.CoordinateSystem;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.crs.ProjectedCRS;
import org.opengis.referencing.operation.MathTransform;
import org.apache.sis.referencing.operation.transform.MathTransforms;
/**
* Finds the axes where wraparound may happen in a CRS. The search may be indirect.
* For example if the given CRS is projected, this class will search in geographic CRS.
*
* @author Martin Desruisseaux (Geomatys)
* @version 1.2
* @since 1.2
* @module
*/
public final class WraparoundAxesFinder {
/**
* The CRS that may contain wraparound axes. Geographic CRS are preferred,
* but will be the CRS specified at construction time if we found nothing better.
*/
public final CoordinateReferenceSystem preferredCRS;
/**
* The transform from {@link #preferredCRS} to the CRS specified at construction time.
* Never null but may be the identity transform.
*/
public final MathTransform preferredToSpecified;
/**
* Searches wraparound axes in the specified CRS or its base CRS (if any).
*
* @param crs the CRS where to search for wraparound axes.
*/
public WraparoundAxesFinder(CoordinateReferenceSystem crs) {
if (crs instanceof ProjectedCRS) {
final ProjectedCRS p = (ProjectedCRS) crs;
crs = p.getBaseCRS(); // Geographic, so a wraparound axis certainly exists.
preferredToSpecified = p.getConversionFromBase().getMathTransform();
} else {
// TODO: we should handle the case of CompoundCRS before to fallback on identity.
preferredToSpecified = MathTransforms.identity(ReferencingUtilities.getDimension(crs));
}
preferredCRS = crs;
}
/**
* Returns the range (maximum - minimum) of wraparound axes. For non-wraparound axes, the value is set to 0.
* The length of this array is the smallest length necessary for handing all wraparound axes.
* It may be smaller than the CRS dimension.
*
* @return periods of axes (0 for non-wraparound axes), or {@code null} if none.
*/
public double[] periods() {
double[] periods = null;
final CoordinateSystem cs = preferredCRS.getCoordinateSystem();
for (int i = cs.getDimension(); --i >= 0;) {
final double period = WraparoundApplicator.range(cs, i);
if (period > 0) {
if (periods == null) {
periods = new double[i + 1];
}
periods[i] = period;
}
}
return periods;
}
}