/*- * Copyright 2020 Beuth Hochschule für Technik Berlin, Hochschule für Technik Stuttgart * * This file is part of CityDoctor2. * * CityDoctor2 is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * CityDoctor2 is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with CityDoctor2. If not, see . */ package de.hft.stuttgart.citydoctor2.parser; import java.io.Serializable; import org.osgeo.proj4j.BasicCoordinateTransform; import org.osgeo.proj4j.CRSFactory; import org.osgeo.proj4j.CoordinateReferenceSystem; /** * Container class to store the configuration needed to parse a file. Also * contains information on transformation of vertices. * * @author Matthias Betz * */ public class ParserConfiguration implements Serializable { private static final long serialVersionUID = 6209047092991074661L; private static final CRSFactory CRS_FACTORY = new CRSFactory(); private int roundingPlaces = 8; private boolean validate = false; private transient BasicCoordinateTransform targetTransform = null; private transient BasicCoordinateTransform originalTransform = null; private String targetTransformString; private String originalTransformString; private boolean hasTransformation = false; private boolean useLowMemoryConsumption = false; private transient double fromMetres = 1.0; public ParserConfiguration(int numberOfRoundingPlaces, boolean validate) { this(numberOfRoundingPlaces, validate, false); } public ParserConfiguration(int numberOfRoundingPlaces, boolean validate, boolean lowMemory) { if (numberOfRoundingPlaces < 0) { throw new IllegalArgumentException("Number of rounding places must be a positive value"); } roundingPlaces = numberOfRoundingPlaces; this.validate = validate; useLowMemoryConsumption = lowMemory; } public boolean getValidate() { return validate; } public int getNumberOfRoundingPlaces() { return roundingPlaces; } public void setCoordinateSystem(CoordinateReferenceSystem crs, CoordinateReferenceSystem tgtCrs) { if (crs != null && tgtCrs != null) { hasTransformation = true; targetTransformString = tgtCrs.getParameterString(); originalTransformString = crs.getParameterString(); targetTransform = new BasicCoordinateTransform(crs, tgtCrs); originalTransform = new BasicCoordinateTransform(tgtCrs, crs); } } public BasicCoordinateTransform getTargetTransform() { if (hasTransformation && targetTransform == null) { createCoordinateTransforms(); } return targetTransform; } private void createCoordinateTransforms() { CoordinateReferenceSystem tgtCrs = null; CoordinateReferenceSystem crs = null; synchronized (CRS_FACTORY) { tgtCrs = CRS_FACTORY.createFromParameters("Target", targetTransformString); crs = CRS_FACTORY.createFromParameters("Original", originalTransformString); } targetTransform = new BasicCoordinateTransform(crs, tgtCrs); originalTransform = new BasicCoordinateTransform(tgtCrs, crs); } public BasicCoordinateTransform getOriginalTransform() { if (hasTransformation && originalTransform == null) { createCoordinateTransforms(); } return originalTransform; } public void setFromMetres(double d) { fromMetres = d; } public double getFromMetres() { return fromMetres; } public boolean useLowMemoryConsumption() { return useLowMemoryConsumption; } }