Commit eaacae87 authored by duminil's avatar duminil
Browse files

Trying to define building iterator.

parent 227b6817
package eu.simstadt.lowlevelgmlparser;
import java.io.IOException;
import java.nio.file.Path;
import java.util.Iterator;
import java.util.logging.Logger;
import com.ximpleware.AutoPilot;
import com.ximpleware.NavException;
import com.ximpleware.VTDGen;
import com.ximpleware.VTDNav;
import com.ximpleware.XPathEvalException;
import com.ximpleware.XPathParseException;
public class CityGmlIterator implements Iterable<String>
{
private static final Logger LOGGER = Logger.getLogger(CityGmlIterator.class.getName());
private AutoPilot buildingsFinder;
private VTDNav navigator;
private long offsetAndLength;
private int buildingsCount = 0;
private int buildingOffset = 0;
private int buildingLength = 0;
public CityGmlIterator(Path citygmlPath)
throws XPathParseException, NavException, NumberFormatException, XPathEvalException, IOException {
VTDGen parser = new VTDGen();
parser.parseFile(citygmlPath.toString(), false);
this.navigator = parser.getNav();
this.buildingsFinder = new AutoPilot(navigator);
buildingsFinder.selectXPath("//cityObjectMember");
}
@Override
public Iterator<String> iterator() {
Iterator<String> it = new Iterator<String>() {
@Override
public boolean hasNext() {
try {
return buildingsFinder.evalXPath() != -1;
} catch (XPathEvalException | NavException ex) {}
return false;
}
@Override
public String next() {
try {
buildingsCount += 1;
if (buildingsCount % 1000 == 0) {
LOGGER.info("1000 buildings parsed");
}
offsetAndLength = navigator.getElementFragment();
buildingOffset = (int) offsetAndLength;
buildingLength = (int) (offsetAndLength >> 32);
return navigator.toRawString(buildingOffset, buildingLength);
} catch (NavException ex) {}
return null;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
return it;
}
}
Markdown is supported
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