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
cf707aa3
Commit
cf707aa3
authored
8 years ago
by
duminil
Browse files
Options
Download
Email Patches
Plain Diff
Tests now pass with iterator.
parent
114d2a18
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
src/eu/simstadt/lowlevelgmlparser/BuildingXmlNode.java
+1
-1
src/eu/simstadt/lowlevelgmlparser/BuildingXmlNode.java
src/eu/simstadt/lowlevelgmlparser/CityGmlIterator.java
+28
-8
src/eu/simstadt/lowlevelgmlparser/CityGmlIterator.java
src/eu/simstadt/regionchooser/RegionExtractor.java
+7
-6
src/eu/simstadt/regionchooser/RegionExtractor.java
with
36 additions
and
15 deletions
+36
-15
src/eu/simstadt/lowlevelgmlparser/BuildingXmlNode.java
+
1
-
1
View file @
cf707aa3
...
@@ -21,7 +21,7 @@
...
@@ -21,7 +21,7 @@
public
BuildingXmlNode
(
VTDNav
navigator
,
int
buildingOffset
,
int
buildingLength
)
{
public
BuildingXmlNode
(
VTDNav
navigator
,
int
buildingOffset
,
int
buildingLength
)
{
this
.
navigator
=
navigator
;
this
.
navigator
=
navigator
;
this
.
coordinatesFinder
=
new
AutoPilot
(
navigator
);
//COULD BE STATIC?
this
.
coordinatesFinder
=
new
AutoPilot
(
navigator
);
this
.
buildingLength
=
buildingLength
;
this
.
buildingLength
=
buildingLength
;
this
.
buildingOffset
=
buildingOffset
;
this
.
buildingOffset
=
buildingOffset
;
}
}
...
...
This diff is collapsed.
Click to expand it.
src/eu/simstadt/lowlevelgmlparser/CityGmlIterator.java
+
28
-
8
View file @
cf707aa3
package
eu.simstadt.lowlevelgmlparser
;
package
eu.simstadt.lowlevelgmlparser
;
import
java.io.IOException
;
import
java.io.IOException
;
import
java.nio.file.Files
;
import
java.nio.file.Path
;
import
java.nio.file.Path
;
import
java.util.Iterator
;
import
java.util.Iterator
;
import
java.util.logging.Logger
;
import
java.util.logging.Logger
;
...
@@ -20,12 +21,21 @@ public class CityGmlIterator implements Iterable<BuildingXmlNode>
...
@@ -20,12 +21,21 @@ public class CityGmlIterator implements Iterable<BuildingXmlNode>
private
AutoPilot
buildingsFinder
;
private
AutoPilot
buildingsFinder
;
private
VTDNav
navigator
;
private
VTDNav
navigator
;
private
long
offsetAndLength
;
private
long
offsetAndLength
;
private
int
buildingsCount
=
0
;
private
int
buildingOffset
=
0
;
private
int
buildingOffset
=
0
;
private
int
buildingLength
=
0
;
private
int
buildingLength
=
0
;
private
Path
citygmlPath
;
/*
* Simple class to parse a CityGML and extract cityObjectMember XML nodes and their coordinates. Since the
* coordinates are extracted for RegionChooser, it's okay to not be perfectly robust, but it should be fast and not
* use much memory.
*
* Based on VTD XML, it provides a Building iterator.
*
*/
public
CityGmlIterator
(
Path
citygmlPath
)
public
CityGmlIterator
(
Path
citygmlPath
)
throws
XPathParseException
,
NavException
,
NumberFormatException
,
XPathEvalException
,
IOException
{
throws
XPathParseException
,
NavException
,
NumberFormatException
,
XPathEvalException
,
IOException
{
this
.
citygmlPath
=
citygmlPath
;
VTDGen
parser
=
new
VTDGen
();
VTDGen
parser
=
new
VTDGen
();
parser
.
parseFile
(
citygmlPath
.
toString
(),
false
);
parser
.
parseFile
(
citygmlPath
.
toString
(),
false
);
this
.
navigator
=
parser
.
getNav
();
this
.
navigator
=
parser
.
getNav
();
...
@@ -41,22 +51,22 @@ public Iterator<BuildingXmlNode> iterator() {
...
@@ -41,22 +51,22 @@ public Iterator<BuildingXmlNode> iterator() {
public
boolean
hasNext
()
{
public
boolean
hasNext
()
{
try
{
try
{
return
buildingsFinder
.
evalXPath
()
!=
-
1
;
return
buildingsFinder
.
evalXPath
()
!=
-
1
;
}
catch
(
XPathEvalException
|
NavException
ex
)
{}
}
catch
(
XPathEvalException
|
NavException
ex
)
{
return
false
;
LOGGER
.
warning
(
"Error while parsing "
+
citygmlPath
);
return
false
;
}
}
}
@Override
@Override
public
BuildingXmlNode
next
()
{
public
BuildingXmlNode
next
()
{
try
{
try
{
buildingsCount
+=
1
;
if
(
buildingsCount
%
1000
==
0
)
{
LOGGER
.
info
(
"1000 buildings parsed"
);
}
offsetAndLength
=
navigator
.
getElementFragment
();
offsetAndLength
=
navigator
.
getElementFragment
();
buildingOffset
=
(
int
)
offsetAndLength
;
buildingOffset
=
(
int
)
offsetAndLength
;
buildingLength
=
(
int
)
(
offsetAndLength
>>
32
);
buildingLength
=
(
int
)
(
offsetAndLength
>>
32
);
return
new
BuildingXmlNode
(
navigator
,
buildingOffset
,
buildingLength
);
return
new
BuildingXmlNode
(
navigator
,
buildingOffset
,
buildingLength
);
}
catch
(
NavException
ex
)
{}
}
catch
(
NavException
ex
)
{
LOGGER
.
warning
(
"Error while parsing "
+
citygmlPath
);
}
return
null
;
return
null
;
}
}
...
@@ -68,4 +78,14 @@ public void remove() {
...
@@ -68,4 +78,14 @@ public void remove() {
return
it
;
return
it
;
}
}
public
String
getHeader
()
throws
NavException
{
return
navigator
.
toRawString
(
0
,
buildingOffset
);
}
public
Object
getFooter
()
throws
IOException
,
NavException
{
int
footerOffset
=
buildingOffset
+
buildingLength
;
int
footerLength
=
(
int
)
(
Files
.
size
(
citygmlPath
)
-
footerOffset
);
return
navigator
.
toRawString
(
footerOffset
,
footerLength
);
}
}
}
This diff is collapsed.
Click to expand it.
src/eu/simstadt/regionchooser/RegionExtractor.java
+
7
-
6
View file @
cf707aa3
...
@@ -33,21 +33,22 @@ static public StringBuffer selectRegionDirectlyFromCityGML(Path citygmlPath, Str
...
@@ -33,21 +33,22 @@ static public StringBuffer selectRegionDirectlyFromCityGML(Path citygmlPath, Str
CityGmlIterator
citygml
=
new
CityGmlIterator
(
citygmlPath
);
CityGmlIterator
citygml
=
new
CityGmlIterator
(
citygmlPath
);
for
(
BuildingXmlNode
buildingXmlNode
:
citygml
)
{
for
(
BuildingXmlNode
buildingXmlNode
:
citygml
)
{
buildingsCount
+=
1
;
if
(
buildingsCount
==
0
)
{
if
(
buildingsCount
%
1000
==
0
)
{
sb
.
append
(
citygml
.
getHeader
());
LOGGER
.
info
(
"1000 buildings parsed"
);
}
}
buildingsCount
+=
1
;
Point
point
=
buildingXmlNode
.
getCenterOfMass
();
Point
point
=
buildingXmlNode
.
getCenterOfMass
();
if
(
point
.
within
(
poly
))
{
if
(
point
.
within
(
poly
))
{
foundBuildingsCount
++;
foundBuildingsCount
++;
sb
.
append
(
buildingXmlNode
.
toString
());
sb
.
append
(
buildingXmlNode
.
toString
());
}
}
if
(
buildingsCount
%
1000
==
0
)
{
LOGGER
.
info
(
"1000 buildings parsed"
);
}
}
}
LOGGER
.
info
(
"Buildings found in selected region "
+
foundBuildingsCount
);
LOGGER
.
info
(
"Buildings found in selected region "
+
foundBuildingsCount
);
// int footerOffset = buildingOffset + buildingLength;
sb
.
append
(
citygml
.
getFooter
());
// int footerLength = (int) (Files.size(citygmlPath) - footerOffset);
// sb.append(navigator.toRawString(footerOffset, footerLength));
return
sb
;
return
sb
;
}
}
...
...
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