diff --git a/src/main/java/eu/simstadt/regionchooser/RegionExtractor.java b/src/main/java/eu/simstadt/regionchooser/RegionExtractor.java index ababc25ff60cece255a1e07e922ef79b9cf161d3..335700b4d55e427a8ad470e1fdd7d7e77b8a142f 100644 --- a/src/main/java/eu/simstadt/regionchooser/RegionExtractor.java +++ b/src/main/java/eu/simstadt/regionchooser/RegionExtractor.java @@ -53,7 +53,7 @@ static int selectRegionDirectlyFromCityGML(String wktPolygon, String srsName, Wr int cityObjectsCount = 0; int foundBuildingsCount = 0; - // int foundVegetationCount = 0; + int foundVegetationCount = 0; Geometry poly = WKT_READER.read(wktPolygon); CityGmlIterator citygml = null; @@ -71,7 +71,11 @@ static int selectRegionDirectlyFromCityGML(String wktPolygon, String srsName, Wr Coordinate coord = new Coordinate(buildingXmlNode.x, buildingXmlNode.y); Point point = GEOMETRY_FACTORY.createPoint(coord); if (point.within(poly)) { - foundBuildingsCount++; + if (buildingXmlNode.isBuilding()) { + foundBuildingsCount++; + } else { + foundVegetationCount++; + } sb.append(buildingXmlNode.toString()); } } @@ -90,6 +94,9 @@ static int selectRegionDirectlyFromCityGML(String wktPolygon, String srsName, Wr } LOGGER.info("Buildings found in selected region : " + foundBuildingsCount); + if (foundVegetationCount > 0) { + LOGGER.info("Vegetation found in selected region : " + foundVegetationCount); + } //NOTE: This could be a problem if header starts with <core:CityModel> and footer ends with </CityModel> sb.append(citygml.getFooter()); return foundBuildingsCount; diff --git a/src/main/java/eu/simstadt/regionchooser/fast_xml_parser/CityObjectMember.java b/src/main/java/eu/simstadt/regionchooser/fast_xml_parser/CityObjectMember.java index f51252e82b50eb0550a51702779bbd20847fa851..7ed42cc48c6e0a687dafa9ed869d9329b645d403 100644 --- a/src/main/java/eu/simstadt/regionchooser/fast_xml_parser/CityObjectMember.java +++ b/src/main/java/eu/simstadt/regionchooser/fast_xml_parser/CityObjectMember.java @@ -14,14 +14,11 @@ public class CityObjectMember { - //TODO: Check it's the only correct possibility. - //FIXME: BuildingPart too! static final String XPATH_PATTERN = "/CityModel/cityObjectMember[Building or SolitaryVegetationObject or PlantCover]"; private int nodeOffset; private int nodeLength; private VTDNav navigator; - private AutoPilot coordinatesFinder; public Double x; public Double xMin; public Double xMax; @@ -33,18 +30,28 @@ public CityObjectMember(VTDNav navigator, int nodeOffset, int nodeLength) throws XPathParseException, XPathEvalException, NavException { this.navigator = navigator; - this.coordinatesFinder = new AutoPilot(navigator); this.nodeLength = nodeLength; this.nodeOffset = nodeOffset; extractCoordinates(); - //TODO: Get Node ID too, in order to avoid duplicates? - //TODO: Now that "Building" can be Vegetation too, define a method to check class? } public boolean hasCoordinates() { return coordinatesCount > 0; } + public boolean isBuilding() { + try { + this.navigator.push(); + AutoPilot checkBuilding = new AutoPilot(this.navigator); + checkBuilding.selectXPath("./Building"); + return checkBuilding.evalXPath() != -1; + } catch (XPathEvalException | NavException | XPathParseException ex) { + return false; + } finally { + this.navigator.pop(); + } + } + private void extractCoordinates() throws XPathParseException, XPathEvalException, NavException { double xTotal = 0; @@ -56,6 +63,9 @@ private void extractCoordinates() double tempYMin = Double.MAX_VALUE; double tempYMax = Double.MIN_VALUE; + + AutoPilot coordinatesFinder = new AutoPilot(navigator); + coordinatesFinder.selectXPath(".//posList|.//pos"); while (coordinatesFinder.evalXPath() != -1) { long offsetAndLength = navigator.getContentFragment(); diff --git a/src/test/java/eu/simstadt/regionchooser/RegionExtractorTests.java b/src/test/java/eu/simstadt/regionchooser/RegionExtractorTests.java index fc4857beb60b27cc6eee8fb82411615deaeffb1b..79c94563729dc34044bf347d109dc0af255a9f1a 100644 --- a/src/test/java/eu/simstadt/regionchooser/RegionExtractorTests.java +++ b/src/test/java/eu/simstadt/regionchooser/RegionExtractorTests.java @@ -173,7 +173,6 @@ void testExtractBuildingsAndRemoveOld() throws Throwable { StringWriter gmlWriter = new StringWriter(); int count = RegionExtractor.selectRegionDirectlyFromCityGML(wktPolygon, "EPSG:25832", gmlWriter, citygmlPath); String oneAachenBuilding = gmlWriter.toString(); - System.out.println(oneAachenBuilding); assertEquals(1, count); assertEquals(1, countRegexMatches(oneAachenBuilding, CITY_OBJECT_MEMBER_REGEX)); assertTrue(oneAachenBuilding.contains("DENW39AL10003jfi"));