From b6fe02542f4988980a05b52923267f7ad2063534 Mon Sep 17 00:00:00 2001 From: Eric Duminil <eric.duminil@gmail.com> Date: Thu, 29 Sep 2022 10:04:04 +0200 Subject: [PATCH] Added SRS Name patterns. --- .../regionchooser/RegionChooserUtils.java | 31 ++++++++++--------- .../CRSfromCityGMLHeaderTests.java | 16 +++++----- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src/main/java/eu/simstadt/regionchooser/RegionChooserUtils.java b/src/main/java/eu/simstadt/regionchooser/RegionChooserUtils.java index d7518c8..4bc3876 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 142e62a..b2a137b 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"); -- GitLab