RegionExtractorTests.java 8.11 KB
Newer Older
1
package eu.simstadt.regionchooser;
2
3

import static org.junit.Assert.assertEquals;
4
import static org.junit.Assert.assertFalse;
5
6
7
import static org.junit.Assert.assertTrue;
import java.nio.file.Path;
import java.nio.file.Paths;
duminil's avatar
duminil committed
8
9
import java.util.regex.Matcher;
import java.util.regex.Pattern;
10
11
12
13
14
import org.junit.Test;


public class RegionExtractorTests
{
15
	private static final String EPSG_32118 = "EPSG:32118";
Eric Duminil's avatar
Eric Duminil committed
16
17
18
19
20
	private static final String CITY_OBJECT_MEMBER_REGEX = "<(core:)?cityObjectMember";
	private static final String CITY_MODEL_HEADER = "<CityModel";
	private static final String CORE_CITY_MODEL_HEADER = "<core:CityModel";
	private static final String CITY_MODEL_FOOTER = "</CityModel";
	private static final String CORE_CITY_MODEL_FOOTER = "</core:CityModel";
Matthias Betz's avatar
Matthias Betz committed
21
	private static final Path TEST_REPOSITORY = Paths.get("src/test/resources/testdata/");
Eric Duminil's avatar
Eric Duminil committed
22

duminil's avatar
duminil committed
23
24
25
26
27
28
29
30
	public static int countRegexMatches(String str, String subStr) {
		Pattern pattern = Pattern.compile(subStr);
		Matcher matcher = pattern.matcher(str);
		int count = 0;
		while (matcher.find()) {
			count++;
		}
		return count;
31
32
33
34
35
36
	}

	@Test
	public void testExtract3BuildingsFromGSK3Model() throws Throwable {
		//NOTE: Small region around Martinskirche in Grünbühl
		String wktPolygon = "POLYGON((3515848.896028535 5415823.108586172,3515848.9512289143 5415803.590347393,3515829.0815150724 5415803.338023346,3515830.9784850604 5415793.437034622,3515842.0946056456 5415793.272282251,3515843.3515515197 5415766.204935087,3515864.1064344468 5415766.557899496,3515876.489172751 5415805.433782301,3515876.343844858 5415822.009293416,3515848.896028535 5415823.108586172))";
37
		Path citygmlPath = TEST_REPOSITORY.resolve("Gruenbuehl.proj/20140218_Gruenbuehl_LOD2.gml");
38
39
		String churchGMLString = RegionExtractor.selectRegionDirectlyFromCityGML(citygmlPath, wktPolygon, "EPSG:31467")
				.toString();
Eric Duminil's avatar
Eric Duminil committed
40
		assertEquals(countRegexMatches(churchGMLString, CITY_OBJECT_MEMBER_REGEX), 3);
41
42
43
44
		assertTrue(churchGMLString.contains("Donaustr"));
		assertTrue(churchGMLString.contains("DEBW_LOD2_203056"));
		assertTrue(churchGMLString.contains("DEBW_LOD2_2869"));
		assertTrue(churchGMLString.contains("DEBW_LOD2_2909"));
Eric Duminil's avatar
Eric Duminil committed
45
46
		assertTrue(churchGMLString.contains(CORE_CITY_MODEL_HEADER));
		assertTrue(churchGMLString.contains(CORE_CITY_MODEL_FOOTER));
47
48
49
50
51
52
		assertTrue("The exported CityGML should contain a new envelope with the correct EPSG", churchGMLString
				.contains("<gml:Envelope srsName=\"EPSG:31467\" srsDimension=\"3\">"));
		assertTrue("The exported CityGML should contain a new envelope", churchGMLString
				.contains("<gml:lowerCorner>3515829.0815150724 5415766.204935087 "));
		assertTrue("The exported CityGML should contain a new envelope", churchGMLString
				.contains("<gml:upperCorner>3515876.489172751 5415823.108586172 "));
53
	}
54
55

	@Test
56
	public void testExtractBuildingsWithoutCommentsInBetween() throws Throwable {
57
58
		//NOTE: Small region around WashingtonSquare
		String wktPolygon = "POLYGON((300259.78663489706 62835.835907766595,300230.33294975647 62792.0482567884,300213.5667431851 62770.83143720031,300183.6592861123 62730.20347659383,300252.9947486632 62676.938468840905,300273.3862256562 62701.767105345614,300257.5250407747 62715.760413539596,300308.2754543957 62805.14198211394,300259.78663489706 62835.835907766595))";
59
60
		Path citygmlPath = TEST_REPOSITORY.resolve("NewYork.proj/ManhattanSmall.gml");
		String archGMLString = RegionExtractor.selectRegionDirectlyFromCityGML(citygmlPath, wktPolygon, EPSG_32118)
61
				.toString();
Eric Duminil's avatar
Eric Duminil committed
62
		assertEquals(countRegexMatches(archGMLString, CITY_OBJECT_MEMBER_REGEX), 2);
63
64
65
		assertTrue(archGMLString.contains("WASHINGTON SQUARE"));
		assertTrue(archGMLString.contains("uuid_c0980a6e-05ea-4d09-bc83-efab226945a1"));
		assertTrue(archGMLString.contains("uuid_0985cebb-922d-4b3e-95e5-15dc6089cd28"));
Eric Duminil's avatar
Eric Duminil committed
66
67
		assertTrue(archGMLString.contains(CITY_MODEL_HEADER));
		assertTrue(archGMLString.contains(CITY_MODEL_FOOTER));
68
69
70
71
		assertFalse("Comments between buildings shouldn't be extracted",
				archGMLString.contains("comment between buildings")); // Comment
		assertFalse("Comments after buildings shouldn't be extracted",
				archGMLString.contains("comment after last building")); // Comment
72
73
	}

74
75
76
	@Test
	public void testExtractBuildingsAndChangeEnvelope() throws Throwable {
		String wktPolygon = "POLYGON((299761.8123557725 61122.68126771413,299721.46983062755 61058.11626595352,299780.84627343423 61021.99295737501,299823.9079725632 61083.3979344517,299761.8123557725 61122.68126771413))";
77
		Path citygmlPath = TEST_REPOSITORY.resolve("NewYork.proj/FamilyCourt_LOD2_with_PLUTO_attributes.gml");
78
		String familyCourtBuilding = RegionExtractor
79
				.selectRegionDirectlyFromCityGML(citygmlPath, wktPolygon, EPSG_32118).toString();
Eric Duminil's avatar
Eric Duminil committed
80
		assertEquals(countRegexMatches(familyCourtBuilding, CITY_OBJECT_MEMBER_REGEX), 1);
81
82
83
84
85
		assertTrue(familyCourtBuilding.contains("Bldg_12210021066"));
		assertFalse("The exported CityGML shouldn't contain the original envelope", familyCourtBuilding
				.contains("<gml:lowerCorner>298393.46959639067 59277.34021543693 -11.892070104139751</gml:lowerCorner>"));
		assertFalse("The exported CityGML shouldn't contain the original envelope", familyCourtBuilding
				.contains("<gml:upperCorner>305641.79529639013 67101.44881543722 547.7591871983744</gml:upperCorner>"));
86
87
88
89
		assertTrue("The exported CityGML should contain a new envelope with the original altitudes", familyCourtBuilding
				.contains("<gml:lowerCorner>299721.46983062755 61021.99295737501 -11.89"));
		assertTrue("The exported CityGML should contain a new envelope with the original altitudes", familyCourtBuilding
				.contains("<gml:upperCorner>299823.9079725632 61122.68126771413 547.75"));
90
91
		assertTrue("The exported CityGML should contain a new envelope with the correct EPSG", familyCourtBuilding
				.contains("<gml:Envelope srsName=\"EPSG:32118\" srsDimension=\"3\">"));
92
93
	}

94
95
96
97
	@Test
	public void testExtract0BuildingsWithWrongCoordinates() throws Throwable {
		//NOTE: Small region, far away from NYC
		String wktPolygon = "POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))";
98
99
		Path citygmlPath = TEST_REPOSITORY.resolve("NewYork.proj/ManhattanSmall.gml");
		String emptyGMLString = RegionExtractor.selectRegionDirectlyFromCityGML(citygmlPath, wktPolygon, EPSG_32118)
100
				.toString();
Eric Duminil's avatar
Eric Duminil committed
101
102
103
		assertEquals(countRegexMatches(emptyGMLString, CITY_OBJECT_MEMBER_REGEX), 0);
		assertTrue(emptyGMLString.contains(CITY_MODEL_HEADER));
		assertTrue(emptyGMLString.contains(CITY_MODEL_FOOTER));
104
	}
duminil's avatar
duminil committed
105

duminil's avatar
duminil committed
106
107
108
109
	@Test
	public void testExtract0BuildingsFromEmptyGML() throws Throwable {
		//NOTE: Small region, with too many spaces between coordinates
		String wktPolygon = "POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))";
110
111
		Path citygmlPath = TEST_REPOSITORY.resolve("NewYork.proj/empty_model.gml");
		String emptyGMLString = RegionExtractor.selectRegionDirectlyFromCityGML(citygmlPath, wktPolygon, EPSG_32118)
112
				.toString();
Eric Duminil's avatar
Eric Duminil committed
113
114
115
		assertEquals(countRegexMatches(emptyGMLString, CITY_OBJECT_MEMBER_REGEX), 0);
		assertTrue(emptyGMLString.contains(CORE_CITY_MODEL_HEADER));
		assertTrue(emptyGMLString.contains(CORE_CITY_MODEL_FOOTER));
duminil's avatar
duminil committed
116
117
	}

duminil's avatar
duminil committed
118
119
120
121
	@Test
	public void testExtract0BuildingsFromWeirdGML() throws Throwable {
		//NOTE: Small region, with too many spaces between coordinates
		String wktPolygon = "POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))";
122
123
		Path citygmlPath = TEST_REPOSITORY.resolve("NewYork.proj/broken_nyc_lod2.gml");
		String emptyGMLString = RegionExtractor.selectRegionDirectlyFromCityGML(citygmlPath, wktPolygon, EPSG_32118)
124
				.toString();
Eric Duminil's avatar
Eric Duminil committed
125
126
127
		assertEquals(countRegexMatches(emptyGMLString, CITY_OBJECT_MEMBER_REGEX), 0);
		assertTrue(emptyGMLString.contains(CORE_CITY_MODEL_HEADER));
		assertTrue(emptyGMLString.contains(CORE_CITY_MODEL_FOOTER));
duminil's avatar
duminil committed
128
	}
129
130

	@Test
131
	public void testExtractBuildingsFromCitygmlWithoutZinEnvelope() throws Throwable {
132
		String wktPolygon = "POLYGON((3512683.1280912133 5404783.732132129,3512719.1608604863 5404714.627650777,3512831.40076119 5404768.344155442,3512790.239106708 5404838.614891164,3512683.1280912133 5404783.732132129))";
133
		Path citygmlPath = TEST_REPOSITORY.resolve("Stuttgart.proj/Stuttgart_LOD0_LOD1_small.gml");
134
135
		String emptyGMLString = RegionExtractor.selectRegionDirectlyFromCityGML(citygmlPath, wktPolygon, "EPSG:31463")
				.toString();
136
		assertEquals(countRegexMatches(emptyGMLString, "<bldg:Building gml:id"), 2);
137
	}
138
}