Skip to content
GitLab
Explore
Projects
Groups
Snippets
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
Eric Duminil
RegionChooser
Commits
782889f0
Commit
782889f0
authored
2 years ago
by
Eric Duminil
Browse files
Options
Download
Email Patches
Plain Diff
Refactor and tests
parent
af8031da
master
develop
No related merge requests found
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
src/main/java/eu/simstadt/regionchooser/RegionChooserCommandLineInterface.java
+1
-9
...tadt/regionchooser/RegionChooserCommandLineInterface.java
src/main/java/eu/simstadt/regionchooser/RegionChooserUtils.java
+12
-0
...in/java/eu/simstadt/regionchooser/RegionChooserUtils.java
src/main/java/eu/simstadt/regionchooser/RegionExtractor.java
+4
-4
src/main/java/eu/simstadt/regionchooser/RegionExtractor.java
src/test/java/eu/simstadt/regionchooser/RegionExtractorWithDifferentInputTests.java
+6
-19
...regionchooser/RegionExtractorWithDifferentInputTests.java
with
23 additions
and
32 deletions
+23
-32
src/main/java/eu/simstadt/regionchooser/RegionChooserCommandLineInterface.java
+
1
-
9
View file @
782889f0
...
...
@@ -7,9 +7,6 @@
import
java.util.Scanner
;
import
java.util.concurrent.Callable
;
import
java.util.logging.Logger
;
import
org.locationtech.jts.geom.Polygon
;
import
org.locationtech.jts.io.WKTReader
;
import
org.locationtech.jts.io.WKTWriter
;
import
org.osgeo.proj4j.CoordinateReferenceSystem
;
import
picocli.CommandLine
;
import
picocli.CommandLine.Command
;
...
...
@@ -49,7 +46,6 @@ class RegionChooserCommandLineInterface implements Callable<Integer>
@Override
public
Integer
call
()
throws
Exception
{
//TODO: Move as much logic to utils as possible
//TODO: Test
CoordinateReferenceSystem
localCRS
;
...
...
@@ -76,12 +72,8 @@ public Integer call() throws Exception {
}
if
(!
localCoordinates
)
{
final
WKTReader
WKT_READER
=
new
WKTReader
();
final
WKTWriter
WKT_WRITER
=
new
WKTWriter
();
// WKT coordinates are in WGS84, so should be first converted to srsName
Polygon
wgs84Polygon
=
(
Polygon
)
WKT_READER
.
read
(
wktPolygon
);
wktPolygon
=
WKT_WRITER
.
write
(
RegionChooserUtils
.
changePolygonCRS
(
wgs84Polygon
,
RegionChooserUtils
.
WGS84
,
localCRS
));
wktPolygon
=
RegionChooserUtils
.
wktPolygonToLocalCRS
(
wktPolygon
,
localCRS
);
}
LOGGER
.
info
(
"WKT Polygon expressed in local coordinates: "
+
wktPolygon
);
...
...
This diff is collapsed.
Click to expand it.
src/main/java/eu/simstadt/regionchooser/RegionChooserUtils.java
+
12
-
0
View file @
782889f0
...
...
@@ -13,6 +13,9 @@
import
org.locationtech.jts.geom.Coordinate
;
import
org.locationtech.jts.geom.GeometryFactory
;
import
org.locationtech.jts.geom.Polygon
;
import
org.locationtech.jts.io.ParseException
;
import
org.locationtech.jts.io.WKTReader
;
import
org.locationtech.jts.io.WKTWriter
;
import
org.osgeo.proj4j.BasicCoordinateTransform
;
import
org.osgeo.proj4j.CRSFactory
;
import
org.osgeo.proj4j.CoordinateReferenceSystem
;
...
...
@@ -111,6 +114,15 @@ public static Polygon changePolygonCRS(Polygon polygonInOriginalCRS, CoordinateR
return
geometryFactory
.
createPolygon
(
convexHullcoordinates
);
}
public
static
String
wktPolygonToLocalCRS
(
String
wktPolygonInWGS84
,
CoordinateReferenceSystem
localCRS
)
throws
ParseException
{
final
WKTReader
wktReader
=
new
WKTReader
();
final
WKTWriter
wktWriter
=
new
WKTWriter
();
// WKT coordinates are in WGS84, so should be first converted to srsName
Polygon
wgs84Polygon
=
(
Polygon
)
wktReader
.
read
(
wktPolygonInWGS84
);
return
wktWriter
.
write
(
changePolygonCRS
(
wgs84Polygon
,
WGS84
,
localCRS
));
}
/**
*
* Fast scan of the 50 first lines of a Citygml file to look for srsName. It might not be as reliable as parsing the
...
...
This diff is collapsed.
Click to expand it.
src/main/java/eu/simstadt/regionchooser/RegionExtractor.java
+
4
-
4
View file @
782889f0
...
...
@@ -21,10 +21,10 @@
public
class
RegionExtractor
{
private
static
final
WKTReader
wktReader
=
new
WKTReader
();
private
static
final
WKTReader
WKT_READER
=
new
WKTReader
();
private
static
final
Logger
LOGGER
=
Logger
.
getLogger
(
RegionExtractor
.
class
.
getName
());
private
static
final
GeometryFactory
gf
=
new
GeometryFactory
();
private
static
final
GeometryFactory
GEOMETRY_FACTORY
=
new
GeometryFactory
();
/**
* Main method behind RegionChooser. Given CityGMLs (as Path[]) and a geometry (as Well-known text POLYGON, in the
...
...
@@ -54,7 +54,7 @@ static StringBuilder selectRegionDirectlyFromCityGML(String wktPolygon, String s
int
buildingsCount
=
0
;
int
foundBuildingsCount
=
0
;
StringBuilder
sb
=
new
StringBuilder
();
Geometry
poly
=
wktReader
.
read
(
wktPolygon
);
Geometry
poly
=
WKT_READER
.
read
(
wktPolygon
);
CityGmlIterator
citygml
=
null
;
for
(
int
i
=
0
;
i
<
citygmlPaths
.
length
;
i
++)
{
...
...
@@ -68,7 +68,7 @@ static StringBuilder selectRegionDirectlyFromCityGML(String wktPolygon, String s
buildingsCount
+=
1
;
if
(
buildingXmlNode
.
hasCoordinates
())
{
Coordinate
coord
=
new
Coordinate
(
buildingXmlNode
.
x
,
buildingXmlNode
.
y
);
Point
point
=
gf
.
createPoint
(
coord
);
Point
point
=
GEOMETRY_FACTORY
.
createPoint
(
coord
);
if
(
point
.
within
(
poly
))
{
foundBuildingsCount
++;
sb
.
append
(
buildingXmlNode
.
toString
());
...
...
This diff is collapsed.
Click to expand it.
src/test/java/eu/simstadt/regionchooser/RegionExtractorWithDifferentInputTests.java
+
6
-
19
View file @
782889f0
...
...
@@ -7,25 +7,19 @@
import
java.util.Arrays
;
import
java.util.stream.Collectors
;
import
org.junit.jupiter.api.Test
;
import
org.locationtech.jts.geom.Polygon
;
import
org.locationtech.jts.io.ParseException
;
import
org.locationtech.jts.io.WKTReader
;
import
org.locationtech.jts.io.WKTWriter
;
import
org.osgeo.proj4j.CoordinateReferenceSystem
;
import
com.ximpleware.NavException
;
import
com.ximpleware.XPathEvalException
;
import
com.ximpleware.XPathParseException
;
public
class
RegionExtractorWithDifferentInputTests
class
RegionExtractorWithDifferentInputTests
{
private
static
final
WKTReader
WKT_READER
=
new
WKTReader
();
private
static
final
WKTWriter
WKT_WRITER
=
new
WKTWriter
();
private
static
final
Path
TEST_REPOSITORY
=
Paths
.
get
(
"src/test/resources/testdata/"
);
//NOTE: This test can be adapted to download a region which is too large for the server. Here with local coordinates
@Test
public
void
testExtractRegionWithLocalCRS
()
void
testExtractRegionWithLocalCRS
()
throws
IOException
,
XPathParseException
,
NavException
,
XPathEvalException
,
ParseException
{
String
citygml
=
"DA13_DA14_3D_Buildings_Port_Morris.gml"
;
String
projectName
=
"NewYork"
;
...
...
@@ -39,9 +33,8 @@ public void testExtractRegionWithLocalCRS()
"One weird shaped roof should be inside the region"
);
}
//NOTE: This test can be adapted to download a region which is too large for the server. Here with WGS84 coordinates
@Test
public
void
testExtractRegionWithWGS84
()
void
testExtractRegionWithWGS84
()
throws
ParseException
,
IOException
,
XPathParseException
,
NavException
,
XPathEvalException
{
String
wgs84WktPolygon
=
"POLYGON((-73.91140940026597 40.804246732157196,-73.91424181298568 40.80025100302325,-73.90934946374252 40.79755456207104,-73.90561582879378 40.80116062104605,-73.90960695580794 40.80340212653638,-73.91140940026597 40.804246732157196))"
;
String
citygml
=
"DA13_DA14_3D_Buildings_Port_Morris.gml"
;
...
...
@@ -49,10 +42,8 @@ public void testExtractRegionWithWGS84()
Path
project
=
TEST_REPOSITORY
.
resolve
(
projectName
+
".proj"
);
Path
citygmlPath
=
project
.
resolve
(
citygml
);
Polygon
wgs84Polygon
=
(
Polygon
)
WKT_READER
.
read
(
wgs84WktPolygon
);
CoordinateReferenceSystem
localCRS
=
RegionChooserUtils
.
crsFromCityGMLHeader
(
citygmlPath
);
String
localWktPolygon
=
WKT_WRITER
.
write
(
RegionChooserUtils
.
changePolygonCRS
(
wgs84Polygon
,
RegionChooserUtils
.
WGS84
,
localCRS
));
String
localWktPolygon
=
RegionChooserUtils
.
wktPolygonToLocalCRS
(
wgs84WktPolygon
,
localCRS
);
StringBuilder
sb
=
RegionExtractor
.
selectRegionDirectlyFromCityGML
(
localWktPolygon
,
localCRS
.
getName
(),
citygmlPath
);
assertTrue
(
sb
.
toString
().
contains
(
"gml_ZVHMQQ6BZGRT0O3Q6RGXF12BDOV49QIZ58XB"
),
...
...
@@ -61,7 +52,7 @@ public void testExtractRegionWithWGS84()
//NOTE: This test can be adapted to download a region which is too large for the server. Here with old coordinates from WebSimstadt
@Test
public
void
testExtractRegionWithOldCoordinates
()
void
testExtractRegionWithOldCoordinates
()
throws
ParseException
,
IOException
,
XPathParseException
,
NavException
,
XPathEvalException
{
String
oldFormatPolygon
=
"(40.81173171854368,-73.93268437431763)\r\n"
+
"(40.81069231965162,-73.93068165999941)\r\n"
+
...
...
@@ -98,16 +89,12 @@ public void testExtractRegionWithOldCoordinates()
Path
project
=
TEST_REPOSITORY
.
resolve
(
projectName
+
".proj"
);
Path
citygmlPath
=
project
.
resolve
(
citygml
);
Polygon
wgs84Polygon
=
(
Polygon
)
WKT_READER
.
read
(
wgs84WktPolygon
);
CoordinateReferenceSystem
localCRS
=
RegionChooserUtils
.
crsFromCityGMLHeader
(
citygmlPath
);
String
localWktPolygon
=
WKT_WRITER
.
write
(
RegionChooserUtils
.
changePolygonCRS
(
wgs84Polygon
,
RegionChooserUtils
.
WGS84
,
localCRS
));
String
localWktPolygon
=
RegionChooserUtils
.
wktPolygonToLocalCRS
(
wgs84WktPolygon
,
localCRS
);
StringBuilder
sb
=
RegionExtractor
.
selectRegionDirectlyFromCityGML
(
localWktPolygon
,
localCRS
.
getName
(),
citygmlPath
);
assertTrue
(
sb
.
toString
().
contains
(
"gml_ZVHMQQ6BZGRT0O3Q6RGXF12BDOV49QIZ58XB"
),
"One weird shaped roof should be inside the region"
);
}
//TODO: Write a method to merge RegionChooser results from multiple gmls
}
This diff is collapsed.
Click to expand it.
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
Menu
Explore
Projects
Groups
Snippets