BuildingXmlNode.java 1.89 KB
Newer Older
duminil's avatar
duminil committed
1
2
package eu.simstadt.lowlevelgmlparser;

3
4
5
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.Point;
duminil's avatar
duminil committed
6
7
8
import com.ximpleware.AutoPilot;
import com.ximpleware.NavException;
import com.ximpleware.VTDNav;
9
10
import com.ximpleware.XPathEvalException;
import com.ximpleware.XPathParseException;
duminil's avatar
duminil committed
11
12
13
14
15
16
17
18
19


public class BuildingXmlNode
{

	private int buildingOffset;
	private int buildingLength;
	private VTDNav navigator;
	private AutoPilot coordinatesFinder;
20
	private static final GeometryFactory gf = new GeometryFactory();
duminil's avatar
duminil committed
21
22
23
24
25
26
27
28

	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;
	}

29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
	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);
	}

duminil's avatar
duminil committed
54
55
56
57
58
59
60
61
62
	public String toString() {
		try {
			return navigator.toRawString(buildingOffset, buildingLength);
		} catch (NavException ex) {
			return null;
		}
	}

}