Commit f3f5c798 authored by duminil's avatar duminil
Browse files

RegionChooser: CityGML envelope zMin and zMax are kept.

parent 6aab3d8b
...@@ -3,8 +3,8 @@ ...@@ -3,8 +3,8 @@
import java.io.IOException; import java.io.IOException;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.xml.stream.XMLStreamException; import java.util.regex.Matcher;
import org.xml.sax.SAXParseException; import java.util.regex.Pattern;
import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Envelope; import com.vividsolutions.jts.geom.Envelope;
import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.Geometry;
...@@ -37,11 +37,16 @@ ...@@ -37,11 +37,16 @@
* @param wktPolygon * @param wktPolygon
* @param string * @param string
* @return a StringBuffer, full with the extracted Citygml, including header, buildings and footer. * @return a StringBuffer, full with the extracted Citygml, including header, buildings and footer.
* @throws Exception * @throws ParseException
* @throws IOException
* @throws XPathEvalException
* @throws NavException
* @throws XPathParseException
* @throws NumberFormatException
*/ */
static public StringBuffer selectRegionDirectlyFromCityGML(Path citygmlPath, String wktPolygon, String srsName) static public StringBuffer selectRegionDirectlyFromCityGML(Path citygmlPath, String wktPolygon, String srsName)
throws SAXParseException, XMLStreamException, ParseException, XPathParseException, NavException, throws ParseException, NumberFormatException, XPathParseException, NavException, XPathEvalException,
NumberFormatException, XPathEvalException, IOException { IOException {
int buildingsCount = 0; int buildingsCount = 0;
int foundBuildingsCount = 0; int foundBuildingsCount = 0;
...@@ -75,7 +80,8 @@ static public StringBuffer selectRegionDirectlyFromCityGML(Path citygmlPath, Str ...@@ -75,7 +80,8 @@ static public StringBuffer selectRegionDirectlyFromCityGML(Path citygmlPath, Str
* region comes from a huge file (e.g. from NYC), it might inherit this header with a huge envelope. Some methods * region comes from a huge file (e.g. from NYC), it might inherit this header with a huge envelope. Some methods
* might get confused by this wrong envelope, so this method replaces the original envelope with the bounding box * might get confused by this wrong envelope, so this method replaces the original envelope with the bounding box
* from the extracting polygon. The real envelope might be even smaller, but it could only be known at the end of the * from the extracting polygon. The real envelope might be even smaller, but it could only be known at the end of the
* parsing, after having analyzed every building. The envelope should be written in the header. * parsing, after having analyzed every building. The envelope should be written in the header. If present, min and
* max values for Z are kept.
* *
* @param header * @param header
* @param envelope * @param envelope
...@@ -84,11 +90,23 @@ static public StringBuffer selectRegionDirectlyFromCityGML(Path citygmlPath, Str ...@@ -84,11 +90,23 @@ static public StringBuffer selectRegionDirectlyFromCityGML(Path citygmlPath, Str
*/ */
private static String replaceEnvelopeInHeader(String header, Envelope envelope, String srsName) { private static String replaceEnvelopeInHeader(String header, Envelope envelope, String srsName) {
//NOTE: Sorry for using a regex to parse XML. The header in itself isn't correct, so this looked like the easiest solution. //NOTE: Sorry for using a regex to parse XML. The header in itself isn't correct, so this looked like the easiest solution.
String headerWithoutEnvelope = header.replaceFirst("(?is)<gml:boundedBy>.*?</gml:boundedBy>", ""); double zMin = 0;
double zMax = 0;
Pattern boundedByPattern = Pattern.compile(
"(?is)<gml:boundedBy>.*?<gml:lowerCorner>(.*?)</gml:lowerCorner>\\s*<gml:upperCorner>(.*?)</gml:upperCorner>.*?</gml:boundedBy>");
Matcher matcher = boundedByPattern.matcher(header);
String headerWithoutEnvelope = header;
if (matcher.find()) {
headerWithoutEnvelope = matcher.replaceFirst("");
zMin = Double.valueOf(matcher.group(1).split("\\s+")[2]);
zMax = Double.valueOf(matcher.group(2).split("\\s+")[2]);
}
String newEnvelope = "<gml:boundedBy>\r\n" + String newEnvelope = "<gml:boundedBy>\r\n" +
" <gml:Envelope srsName=\"" + srsName + "\" srsDimension=\"3\">\r\n" + //NOTE: Would srsDimension="2" be better? Should the original Z get extracted? " <gml:Envelope srsName=\"" + srsName + "\" srsDimension=\"3\">\r\n" + //NOTE: Would srsDimension="2" be better? Should the original Z get extracted?
" <gml:lowerCorner>" + envelope.getMinX() + " " + envelope.getMinY() + " 0</gml:lowerCorner>\r\n" + " <gml:lowerCorner>" + envelope.getMinX() + " " + envelope.getMinY() + " " + zMin
" <gml:upperCorner>" + envelope.getMaxX() + " " + envelope.getMaxY() + " 0</gml:upperCorner>\r\n" + + "</gml:lowerCorner>\r\n" +
" <gml:upperCorner>" + envelope.getMaxX() + " " + envelope.getMaxY() + " " + zMax
+ "</gml:upperCorner>\r\n" +
" </gml:Envelope>\r\n" + " </gml:Envelope>\r\n" +
"</gml:boundedBy>\r\n"; "</gml:boundedBy>\r\n";
return headerWithoutEnvelope + newEnvelope; return headerWithoutEnvelope + newEnvelope;
......
...@@ -37,7 +37,6 @@ public void testExtract3BuildingsFromGSK3Model() throws Throwable { ...@@ -37,7 +37,6 @@ public void testExtract3BuildingsFromGSK3Model() throws Throwable {
assertTrue(churchGMLString.contains("DEBW_LOD2_2909")); assertTrue(churchGMLString.contains("DEBW_LOD2_2909"));
assertTrue(churchGMLString.contains("<core:CityModel")); // Header assertTrue(churchGMLString.contains("<core:CityModel")); // Header
assertTrue(churchGMLString.contains("</core:CityModel")); // Footer assertTrue(churchGMLString.contains("</core:CityModel")); // Footer
System.out.println(churchGMLString);
assertTrue("The exported CityGML should contain a new envelope with the correct EPSG", churchGMLString assertTrue("The exported CityGML should contain a new envelope with the correct EPSG", churchGMLString
.contains("<gml:Envelope srsName=\"EPSG:31467\" srsDimension=\"3\">")); .contains("<gml:Envelope srsName=\"EPSG:31467\" srsDimension=\"3\">"));
assertTrue("The exported CityGML should contain a new envelope", churchGMLString assertTrue("The exported CityGML should contain a new envelope", churchGMLString
...@@ -72,18 +71,17 @@ public void testExtractBuildingsAndChangeEnvelope() throws Throwable { ...@@ -72,18 +71,17 @@ public void testExtractBuildingsAndChangeEnvelope() throws Throwable {
Path repo = Paths.get("../TestRepository"); Path repo = Paths.get("../TestRepository");
Path citygmlPath = repo.resolve("NewYork.proj/FamilyCourt_LOD2_with_PLUTO_attributes.gml"); Path citygmlPath = repo.resolve("NewYork.proj/FamilyCourt_LOD2_with_PLUTO_attributes.gml");
String familyCourtBuilding = RegionExtractor String familyCourtBuilding = RegionExtractor
.selectRegionDirectlyFromCityGML(citygmlPath, wktPolygon, "EPSG:32118") .selectRegionDirectlyFromCityGML(citygmlPath, wktPolygon, "EPSG:32118").toString();
.toString();
assertEquals(countRegexMatches(familyCourtBuilding, "<(core:)?cityObjectMember"), 1); assertEquals(countRegexMatches(familyCourtBuilding, "<(core:)?cityObjectMember"), 1);
assertTrue(familyCourtBuilding.contains("Bldg_12210021066")); assertTrue(familyCourtBuilding.contains("Bldg_12210021066"));
assertFalse("The exported CityGML shouldn't contain the original envelope", familyCourtBuilding assertFalse("The exported CityGML shouldn't contain the original envelope", familyCourtBuilding
.contains("<gml:lowerCorner>298393.46959639067 59277.34021543693 -11.892070104139751</gml:lowerCorner>")); .contains("<gml:lowerCorner>298393.46959639067 59277.34021543693 -11.892070104139751</gml:lowerCorner>"));
assertFalse("The exported CityGML shouldn't contain the original envelope", familyCourtBuilding assertFalse("The exported CityGML shouldn't contain the original envelope", familyCourtBuilding
.contains("<gml:upperCorner>305641.79529639013 67101.44881543722 547.7591871983744</gml:upperCorner>")); .contains("<gml:upperCorner>305641.79529639013 67101.44881543722 547.7591871983744</gml:upperCorner>"));
assertTrue("The exported CityGML should contain a new envelope", familyCourtBuilding assertTrue("The exported CityGML should contain a new envelope with the original altitudes", familyCourtBuilding
.contains("<gml:lowerCorner>299721.46983062755 61021.99295737501 ")); .contains("<gml:lowerCorner>299721.46983062755 61021.99295737501 -11.89"));
assertTrue("The exported CityGML should contain a new envelope", familyCourtBuilding assertTrue("The exported CityGML should contain a new envelope with the original altitudes", familyCourtBuilding
.contains("<gml:upperCorner>299823.9079725632 61122.68126771413 ")); .contains("<gml:upperCorner>299823.9079725632 61122.68126771413 547.75"));
assertTrue("The exported CityGML should contain a new envelope with the correct EPSG", familyCourtBuilding assertTrue("The exported CityGML should contain a new envelope with the correct EPSG", familyCourtBuilding
.contains("<gml:Envelope srsName=\"EPSG:32118\" srsDimension=\"3\">")); .contains("<gml:Envelope srsName=\"EPSG:32118\" srsDimension=\"3\">"));
} }
......
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