Commit b6fe0254 authored by Eric Duminil's avatar Eric Duminil
Browse files

Added SRS Name patterns.

parent c611eca9
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
public static final CoordinateReferenceSystem WGS84 = CRS_FACTORY.createFromName("EPSG:4326"); public static final CoordinateReferenceSystem WGS84 = CRS_FACTORY.createFromName("EPSG:4326");
private static final Pattern srsNamePattern = Pattern.compile("(?i)(?<=srsName=[\"'])[^\"']+(?=[\"'])"); private static final Pattern srsNamePattern = Pattern.compile("(?i)(?<=srsName=[\"'])[^\"']+(?=[\"'])");
private static final int CITYGML_HEADER_LENGTH = 50; private static final int CITYGML_HEADER_LENGTH = 50;
private static final String EPSG = "EPSG:";
private RegionChooserUtils() { private RegionChooserUtils() {
// only static use // only static use
...@@ -56,27 +57,27 @@ private static CoordinateReferenceSystem crsFromSrsName(String srsName) { ...@@ -56,27 +57,27 @@ private static CoordinateReferenceSystem crsFromSrsName(String srsName) {
Pattern pOGC = Pattern.compile("urn:ogc:def:crs(?:,crs)?:EPSG:[\\d\\.]*:([\\d]+)\\D*"); Pattern pOGC = Pattern.compile("urn:ogc:def:crs(?:,crs)?:EPSG:[\\d\\.]*:([\\d]+)\\D*");
Matcher mOGC = pOGC.matcher(srsName); Matcher mOGC = pOGC.matcher(srsName);
if (mOGC.find()) { 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:DE_DHDN_3GK3*DE_DHHN92_NH
// urn:adv:crs:ETRS89_UTM32*DE_DHHN92_NH // urn:adv:crs:ETRS89_UTM32*DE_DHHN92_NH
Pattern pURN = Pattern.compile("urn:adv:crs:([^\\*]+)"); Pattern pURN = Pattern.compile("urn:adv:crs:([^\\*]+)");
Matcher mURN = pURN.matcher(srsName); Matcher mURN = pURN.matcher(srsName);
//NOTE: Could use a HashMap if the switch/case becomes too long.
if (mURN.find()) { if (mURN.find()) {
switch (mURN.group(1)) { String shortSrsName = mURN.group(1);
case "DE_DHDN_3GK2":
return CRS_FACTORY.createFromName("EPSG:31466"); // Gauss Krueger:
case "DE_DHDN_3GK3": if (shortSrsName.startsWith("DE_DHDN_3GK")) {
return CRS_FACTORY.createFromName("EPSG:31467"); int gaussKruegerBaseEPSG = 31464;
case "DE_DHDN_3GK4": int gaussKruegerId = Integer.parseInt(shortSrsName.substring(11));
return CRS_FACTORY.createFromName("EPSG:31468"); return CRS_FACTORY.createFromName(EPSG + (gaussKruegerBaseEPSG + gaussKruegerId));
case "DE_DHDN_3GK5": }
return CRS_FACTORY.createFromName("EPSG:31469");
case "ETRS89_UTM32": // UTM North:
return CRS_FACTORY.createFromName("EPSG:25832"); if (shortSrsName.startsWith("ETRS89_UTM")) {
default: int utmBaseEPSG = 25800;
// nothing found int utmId = Integer.parseInt(shortSrsName.substring(10));
return CRS_FACTORY.createFromName(EPSG + (utmBaseEPSG + utmId));
} }
} }
throw new IllegalArgumentException("Unknown srsName format: " + srsName); throw new IllegalArgumentException("Unknown srsName format: " + srsName);
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
public class CRSfromCityGMLHeaderTests class CRSfromCityGMLHeaderTests
{ {
private Path repo = Paths.get("src/test/resources/testdata"); private Path repo = Paths.get("src/test/resources/testdata");
...@@ -17,39 +17,39 @@ private void testExtractCSRNameFromHeader(Path citygmlPath, String crsName) thro ...@@ -17,39 +17,39 @@ private void testExtractCSRNameFromHeader(Path citygmlPath, String crsName) thro
} }
@Test @Test
public void testExtractCRSFromStuttgart() throws IOException { void testExtractCRSFromStuttgart() throws IOException {
testExtractCSRNameFromHeader(repo.resolve("Stuttgart.proj/Stuttgart_LOD0_LOD1_buildings_and_trees.gml"), testExtractCSRNameFromHeader(repo.resolve("Stuttgart.proj/Stuttgart_LOD0_LOD1_buildings_and_trees.gml"),
"EPSG:31463"); "EPSG:31463");
} }
@Test @Test
public void testExtractCRSFromGruenbuehl() throws IOException { void testExtractCRSFromGruenbuehl() throws IOException {
testExtractCSRNameFromHeader(repo.resolve("Gruenbuehl.proj/20140218_Gruenbuehl_LOD2_1building.gml"), testExtractCSRNameFromHeader(repo.resolve("Gruenbuehl.proj/20140218_Gruenbuehl_LOD2_1building.gml"),
"EPSG:31467"); "EPSG:31467");
} }
@Test @Test
public void testExtractCRSFromMunich() throws IOException { void testExtractCRSFromMunich() throws IOException {
testExtractCSRNameFromHeader(repo.resolve("Muenchen.proj/Munich_v_1_0_0.gml"), "EPSG:32632"); testExtractCSRNameFromHeader(repo.resolve("Muenchen.proj/Munich_v_1_0_0.gml"), "EPSG:32632");
} }
@Test @Test
public void testExtractCRSFromNYC() throws IOException { void testExtractCRSFromNYC() throws IOException {
testExtractCSRNameFromHeader(repo.resolve("NewYork.proj/ManhattanSmall.gml"), "EPSG:32118"); testExtractCSRNameFromHeader(repo.resolve("NewYork.proj/ManhattanSmall.gml"), "EPSG:32118");
} }
@Test @Test
public void testExtractCRSFromAachen() throws IOException { void testExtractCRSFromAachen() throws IOException {
testExtractCSRNameFromHeader(repo.resolve("Others.proj/Aachen_LoD2_293_5623_1_NW.gml"), "EPSG:25832"); testExtractCSRNameFromHeader(repo.resolve("Others.proj/Aachen_LoD2_293_5623_1_NW.gml"), "EPSG:25832");
} }
@Test @Test
public void testExtractCRSFromValladolid() throws IOException { void testExtractCRSFromValladolid() throws IOException {
testExtractCSRNameFromHeader(repo.resolve("Others.proj/Valladolid_Spain_only_header.gml"), "EPSG:25830"); testExtractCSRNameFromHeader(repo.resolve("Others.proj/Valladolid_Spain_only_header.gml"), "EPSG:25830");
} }
@Test @Test
public void testDontExtractCRSFromBrokenCityGML() throws IOException { void testDontExtractCRSFromBrokenCityGML() throws IOException {
Path citygmlPath = repo.resolve("Others.proj/SimpleSolid_MSBS.gml"); Path citygmlPath = repo.resolve("Others.proj/SimpleSolid_MSBS.gml");
assertThrows(IllegalArgumentException.class, () -> { assertThrows(IllegalArgumentException.class, () -> {
testExtractCSRNameFromHeader(citygmlPath, "Nothing found. Should throw an exception"); testExtractCSRNameFromHeader(citygmlPath, "Nothing found. Should throw an exception");
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment