Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
Eric Duminil
RegionChooser
Commits
f3f5c798
Commit
f3f5c798
authored
Jun 06, 2017
by
duminil
Browse files
RegionChooser: CityGML envelope zMin and zMax are kept.
parent
6aab3d8b
Changes
2
Show whitespace changes
Inline
Side-by-side
src/eu/simstadt/regionchooser/RegionExtractor.java
View file @
f3f5c798
...
@@ -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
java
x.xml.stream.XMLStreamException
;
import
java
.util.regex.Matcher
;
import
org.xml.sax.SAXParseExceptio
n
;
import
java.util.regex.Patter
n
;
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
SAX
ParseException
,
XMLStream
Exception
,
ParseException
,
XPathParseException
,
NavException
,
throws
ParseException
,
NumberFormat
Exception
,
X
PathParseException
,
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
;
...
...
test/eu/simstadt/regionchooser/RegionExtractorTests.java
View file @
f3f5c798
...
@@ -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\">"
));
}
}
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment