package com.revolsys.geometry.cs;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import com.revolsys.geometry.cs.epsg.EpsgCoordinateSystems;
import com.revolsys.io.FileUtil;
public class CoordinateSystemParser {
public static List<GeographicCoordinateSystem> getGeographicCoordinateSystems(
final String authorityName, final InputStream in) {
final Map<String, AngularUnit> angularUnitsByName = new TreeMap<>();
final List<GeographicCoordinateSystem> coordinateSystems = new ArrayList<>();
final BufferedReader reader = new BufferedReader(FileUtil.newUtf8Reader(in));
try {
for (String line = reader.readLine(); line != null; line = reader.readLine()) {
final String[] fields = line.split("\t");
final String id = fields[0];
final String csName = fields[1];
final String datumName = fields[2];
final String spheroidName = fields[3];
final double semiMajorAxis = Double.parseDouble(fields[4]);
final double inverseFlattening = Double.parseDouble(fields[5]);
final String primeMeridianName = fields[6];
final double longitude = Double.parseDouble(fields[7]);
final String angularUnitName = fields[8];
final double conversionFactor = Double.parseDouble(fields[9]);
final Spheroid spheroid = new Spheroid(spheroidName, semiMajorAxis, inverseFlattening,
null);
final Datum datum = new Datum(datumName, spheroid, null);
final PrimeMeridian primeMeridian = new PrimeMeridian(primeMeridianName, longitude, null);
AngularUnit angularUnit = angularUnitsByName.get(angularUnitName);
if (angularUnit == null) {
angularUnit = new AngularUnit(angularUnitName, conversionFactor, null);
angularUnitsByName.put(angularUnitName, angularUnit);
}
final Authority authority = new BaseAuthority(authorityName, id);
final GeographicCoordinateSystem cs = new GeographicCoordinateSystem(Integer.parseInt(id),
csName, datum, primeMeridian, angularUnit, null, authority);
coordinateSystems.add(cs);
}
} catch (final IOException e) {
e.printStackTrace();
} finally {
try {
reader.close();
} catch (final IOException e) {
}
}
return coordinateSystems;
}
public static List<ProjectedCoordinateSystem> getProjectedCoordinateSystems(
final Map<Integer, CoordinateSystem> geoCsById, final String authorityName,
final InputStream in) {
final Map<String, LinearUnit> linearUnitsByName = new TreeMap<>();
final List<ProjectedCoordinateSystem> coordinateSystems = new ArrayList<>();
final BufferedReader reader = new BufferedReader(FileUtil.newUtf8Reader(in));
try {
for (String line = reader.readLine(); line != null; line = reader.readLine()) {
final String[] fields = line.split("\t");
try {
final String id = fields[0];
final String csName = fields[1];
final int geoCsId = Integer.parseInt(fields[2]);
final GeographicCoordinateSystem geoCs = (GeographicCoordinateSystem)geoCsById
.get(geoCsId);
final String projectionName = fields[3];
final String parameterString = fields[4];
final String unitName = fields[5];
final double conversionFactor = Double.parseDouble(fields[6]);
final Map<String, Object> parameters = new LinkedHashMap<>();
for (final String param : parameterString.substring(1, parameterString.length() - 1)
.split(",")) {
final String[] paramValues = param.split("=");
if (paramValues.length == 2) {
final String key = new String(paramValues[0].trim());
final Double value = Double.valueOf(paramValues[1].trim());
parameters.put(key, value);
}
}
final Projection projection = EpsgCoordinateSystems.getProjection(projectionName);
LinearUnit unit = linearUnitsByName.get(unitName);
if (unit == null) {
unit = new LinearUnit(unitName, conversionFactor, null);
linearUnitsByName.put(unitName, unit);
}
final Authority authority = new BaseAuthority(authorityName, id);
final ProjectedCoordinateSystem cs = new ProjectedCoordinateSystem(Integer.parseInt(id),
csName, geoCs, projection, parameters, unit, null, authority);
coordinateSystems.add(cs);
} catch (final Throwable t) {
t.printStackTrace();
}
}
} catch (final Throwable e) {
e.printStackTrace();
} finally {
try {
reader.close();
} catch (final IOException e) {
}
}
return coordinateSystems;
}
}