diff --git a/src/main/java/eu/simstadt/regionchooser/RegionChooserUtils.java b/src/main/java/eu/simstadt/regionchooser/RegionChooserUtils.java index d7518c8813698e04d1583977e3baaa18ec60fdb8..4bc38769e0ca51c39611085a31bc46645dca569c 100644 --- a/src/main/java/eu/simstadt/regionchooser/RegionChooserUtils.java +++ b/src/main/java/eu/simstadt/regionchooser/RegionChooserUtils.java @@ -22,6 +22,7 @@ public static final CoordinateReferenceSystem WGS84 = CRS_FACTORY.createFromName("EPSG:4326"); private static final Pattern srsNamePattern = Pattern.compile("(?i)(?<=srsName=[\"'])[^\"']+(?=[\"'])"); private static final int CITYGML_HEADER_LENGTH = 50; + private static final String EPSG = "EPSG:"; private RegionChooserUtils() { // only static use @@ -56,27 +57,27 @@ private static CoordinateReferenceSystem crsFromSrsName(String srsName) { Pattern pOGC = Pattern.compile("urn:ogc:def:crs(?:,crs)?:EPSG:[\\d\\.]*:([\\d]+)\\D*"); Matcher mOGC = pOGC.matcher(srsName); if (mOGC.find()) { - return CRS_FACTORY.createFromName("EPSG:" + mOGC.group(1)); + return CRS_FACTORY.createFromName(EPSG + mOGC.group(1)); } // urn:adv:crs:DE_DHDN_3GK3*DE_DHHN92_NH // urn:adv:crs:ETRS89_UTM32*DE_DHHN92_NH Pattern pURN = Pattern.compile("urn:adv:crs:([^\\*]+)"); Matcher mURN = pURN.matcher(srsName); - //NOTE: Could use a HashMap if the switch/case becomes too long. if (mURN.find()) { - switch (mURN.group(1)) { - case "DE_DHDN_3GK2": - return CRS_FACTORY.createFromName("EPSG:31466"); - case "DE_DHDN_3GK3": - return CRS_FACTORY.createFromName("EPSG:31467"); - case "DE_DHDN_3GK4": - return CRS_FACTORY.createFromName("EPSG:31468"); - case "DE_DHDN_3GK5": - return CRS_FACTORY.createFromName("EPSG:31469"); - case "ETRS89_UTM32": - return CRS_FACTORY.createFromName("EPSG:25832"); - default: - // nothing found + String shortSrsName = mURN.group(1); + + // Gauss Krueger: + if (shortSrsName.startsWith("DE_DHDN_3GK")) { + int gaussKruegerBaseEPSG = 31464; + int gaussKruegerId = Integer.parseInt(shortSrsName.substring(11)); + return CRS_FACTORY.createFromName(EPSG + (gaussKruegerBaseEPSG + gaussKruegerId)); + } + + // UTM North: + if (shortSrsName.startsWith("ETRS89_UTM")) { + int utmBaseEPSG = 25800; + int utmId = Integer.parseInt(shortSrsName.substring(10)); + return CRS_FACTORY.createFromName(EPSG + (utmBaseEPSG + utmId)); } } throw new IllegalArgumentException("Unknown srsName format: " + srsName); diff --git a/src/test/java/eu/simstadt/regionchooser/CRSfromCityGMLHeaderTests.java b/src/test/java/eu/simstadt/regionchooser/CRSfromCityGMLHeaderTests.java index 142e62a33da3431e543d029b323bb6a9ceecadc3..b2a137bc265f96c565f0793a83d8b2c30b8c7143 100644 --- a/src/test/java/eu/simstadt/regionchooser/CRSfromCityGMLHeaderTests.java +++ b/src/test/java/eu/simstadt/regionchooser/CRSfromCityGMLHeaderTests.java @@ -8,7 +8,7 @@ import org.junit.jupiter.api.Test; -public class CRSfromCityGMLHeaderTests +class CRSfromCityGMLHeaderTests { private Path repo = Paths.get("src/test/resources/testdata"); @@ -17,39 +17,39 @@ private void testExtractCSRNameFromHeader(Path citygmlPath, String crsName) thro } @Test - public void testExtractCRSFromStuttgart() throws IOException { + void testExtractCRSFromStuttgart() throws IOException { testExtractCSRNameFromHeader(repo.resolve("Stuttgart.proj/Stuttgart_LOD0_LOD1_buildings_and_trees.gml"), "EPSG:31463"); } @Test - public void testExtractCRSFromGruenbuehl() throws IOException { + void testExtractCRSFromGruenbuehl() throws IOException { testExtractCSRNameFromHeader(repo.resolve("Gruenbuehl.proj/20140218_Gruenbuehl_LOD2_1building.gml"), "EPSG:31467"); } @Test - public void testExtractCRSFromMunich() throws IOException { + void testExtractCRSFromMunich() throws IOException { testExtractCSRNameFromHeader(repo.resolve("Muenchen.proj/Munich_v_1_0_0.gml"), "EPSG:32632"); } @Test - public void testExtractCRSFromNYC() throws IOException { + void testExtractCRSFromNYC() throws IOException { testExtractCSRNameFromHeader(repo.resolve("NewYork.proj/ManhattanSmall.gml"), "EPSG:32118"); } @Test - public void testExtractCRSFromAachen() throws IOException { + void testExtractCRSFromAachen() throws IOException { testExtractCSRNameFromHeader(repo.resolve("Others.proj/Aachen_LoD2_293_5623_1_NW.gml"), "EPSG:25832"); } @Test - public void testExtractCRSFromValladolid() throws IOException { + void testExtractCRSFromValladolid() throws IOException { testExtractCSRNameFromHeader(repo.resolve("Others.proj/Valladolid_Spain_only_header.gml"), "EPSG:25830"); } @Test - public void testDontExtractCRSFromBrokenCityGML() throws IOException { + void testDontExtractCRSFromBrokenCityGML() throws IOException { Path citygmlPath = repo.resolve("Others.proj/SimpleSolid_MSBS.gml"); assertThrows(IllegalArgumentException.class, () -> { testExtractCSRNameFromHeader(citygmlPath, "Nothing found. Should throw an exception");