// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.opendata.core.datasets.fr; import org.geotools.referencing.CRS; import org.geotools.referencing.operation.projection.LambertConformal2SP; import org.geotools.referencing.operation.projection.MapProjection.AbstractProvider; import org.opengis.referencing.FactoryException; import org.opengis.referencing.NoSuchAuthorityCodeException; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.opengis.referencing.crs.ProjectedCRS; import org.opengis.referencing.datum.GeodeticDatum; import org.opengis.referencing.operation.MathTransform; import org.openstreetmap.josm.plugins.opendata.core.io.geographic.DefaultShpHandler; public class FrenchShpHandler extends DefaultShpHandler { @Override public CoordinateReferenceSystem getCrsFor(String crsName) throws NoSuchAuthorityCodeException, FactoryException { if (crsName.equalsIgnoreCase("RGM04")) { return CRS.decode("EPSG:4471"); } else if (crsName.equalsIgnoreCase("RGFG95_UTM_Zone_22N")) { return CRS.decode("EPSG:2972"); } else { return super.getCrsFor(crsName); } } @Override public MathTransform findMathTransform(CoordinateReferenceSystem sourceCRS, CoordinateReferenceSystem targetCRS, boolean lenient) throws FactoryException { if (sourceCRS.getName().getCode().equalsIgnoreCase("Lambert I Nord")) { if (sourceCRS instanceof ProjectedCRS) { GeodeticDatum datum = ((ProjectedCRS) sourceCRS).getDatum(); if (datum.getPrimeMeridian().getGreenwichLongitude() > 0.0 && ((ProjectedCRS) sourceCRS).getConversionFromBase().getMathTransform() instanceof LambertConformal2SP) { LambertConformal2SP lambert = (LambertConformal2SP) ((ProjectedCRS) sourceCRS).getConversionFromBase().getMathTransform(); Double falseNorthing = get(lambert.getParameterValues(), AbstractProvider.FALSE_NORTHING); Double centralmeridian = get(lambert.getParameterValues(), AbstractProvider.CENTRAL_MERIDIAN); if (centralmeridian.equals(0.0)) { if (falseNorthing.equals(200000.0)) { return CRS.findMathTransform(CRS.decode("EPSG:27561"), targetCRS, lenient); } else if (falseNorthing.equals(1200000.0)) { return CRS.findMathTransform(CRS.decode("EPSG:27571"), targetCRS, lenient); } } } } } return super.findMathTransform(sourceCRS, targetCRS, lenient); } }