package eu.simstadt.lowlevelgmlparser; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.Point; import com.ximpleware.AutoPilot; import com.ximpleware.NavException; import com.ximpleware.VTDNav; import com.ximpleware.XPathEvalException; import com.ximpleware.XPathParseException; public class BuildingXmlNode { private int buildingOffset; private int buildingLength; private VTDNav navigator; private AutoPilot coordinatesFinder; private static final GeometryFactory gf = new GeometryFactory(); public BuildingXmlNode(VTDNav navigator, int buildingOffset, int buildingLength) { this.navigator = navigator; this.coordinatesFinder = new AutoPilot(navigator); //COULD BE STATIC? this.buildingLength = buildingLength; this.buildingOffset = buildingOffset; } public Point getCenterOfMass() throws XPathParseException, NumberFormatException, XPathEvalException, NavException { int coordinatesCount = 0; double xTotal = 0; double yTotal = 0; coordinatesFinder.selectXPath(".//posList"); while (coordinatesFinder.evalXPath() != -1) { long offsetAndLength = navigator.getContentFragment(); int coordinatesOffset = (int) offsetAndLength; int coordinatesLength = (int) (offsetAndLength >> 32); String posList = navigator.toRawString(coordinatesOffset, coordinatesLength); String[] coordinates = posList.split(" "); for (int k = 0; k < coordinates.length; k = k + 3) { coordinatesCount++; xTotal += Double.valueOf(coordinates[k]); yTotal += Double.valueOf(coordinates[k + 1]); } } double x = xTotal / coordinatesCount; double y = yTotal / coordinatesCount; Coordinate coord = new Coordinate(x, y); return gf.createPoint(coord); } public String toString() { try { return navigator.toRawString(buildingOffset, buildingLength); } catch (NavException ex) { return null; } } }