]> gitweb.fperrin.net Git - GpsPrune.git/blob - tim/prune/load/xml/KmlHandler.java
Version 5, May 2008
[GpsPrune.git] / tim / prune / load / xml / KmlHandler.java
1 package tim.prune.load.xml;
2
3 import java.util.ArrayList;
4 import org.xml.sax.Attributes;
5 import org.xml.sax.SAXException;
6
7 import tim.prune.data.Field;
8
9
10 /**
11  * Class for handling specifics of parsing Kml files
12  */
13 public class KmlHandler extends XmlHandler
14 {
15         private boolean _insidePlacemark = false;
16         private boolean _insideName = false;
17         private boolean _insideCoordinates = false;
18         private String _name = null;
19         private StringBuffer _coordinates = null;
20         private ArrayList _pointList = new ArrayList();
21
22
23         /**
24          * Receive the start of a tag
25          * @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
26          */
27         public void startElement(String uri, String localName, String qName,
28                         Attributes attributes) throws SAXException
29         {
30                 String tagName = localName;
31                 if (tagName == null || tagName.equals("")) {tagName = qName;}
32                 if (tagName.equalsIgnoreCase("Placemark")) _insidePlacemark = true;
33                 else if (tagName.equalsIgnoreCase("coordinates")) {_insideCoordinates = true; _coordinates = null;}
34                 else if (tagName.equalsIgnoreCase("name")) {_insideName = true; _name = null;}
35                 super.startElement(uri, localName, qName, attributes);
36         }
37
38
39         /**
40          * Process end tag
41          * @see org.xml.sax.ContentHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
42          */
43         public void endElement(String uri, String localName, String qName)
44         throws SAXException
45         {
46                 String tagName = localName;
47                 if (tagName == null || tagName.equals("")) {tagName = qName;}
48                 if (tagName.equalsIgnoreCase("Placemark"))
49                 {
50                         processPlacemark();
51                         _insidePlacemark = false;
52                 }
53                 else if (tagName.equalsIgnoreCase("coordinates")) _insideCoordinates = false;
54                 else if (tagName.equalsIgnoreCase("name")) _insideName = false;
55                 super.endElement(uri, localName, qName);
56         }
57
58
59         /**
60          * Process character text (inside tags or between them)
61          * @see org.xml.sax.ContentHandler#characters(char[], int, int)
62          */
63         public void characters(char[] ch, int start, int length)
64                         throws SAXException
65         {
66                 if (_insidePlacemark && (_insideName || _insideCoordinates))
67                 {
68                         String value = new String(ch, start, length);
69                         if (_insideName) {_name = value;}
70                         else if (_insideCoordinates)
71                         {
72                                 if (_coordinates == null)
73                                 {
74                                         _coordinates = new StringBuffer();
75                                 }
76                                 _coordinates.append(value);
77                         }
78                 }
79                 super.characters(ch, start, length);
80         }
81
82
83         /**
84          * Process a placemark entry, either a single waypoint or a whole track
85          */
86         private void processPlacemark()
87         {
88                 if (_coordinates == null) return;
89                 String allCoords = _coordinates.toString();
90                 String[] coordArray = allCoords.split("[ \n]");
91                 int numPoints = coordArray.length;
92                 if (numPoints == 1)
93                 {
94                         // Add single waypoint to list
95                         _pointList.add(makeStringArray(allCoords, _name));
96                 }
97                 else if (numPoints > 1)
98                 {
99                         // Add each of the unnamed track points to list
100                         for (int p=0; p<numPoints; p++)
101                         {
102                                 String[] pointArray = makeStringArray(coordArray[p], null);
103                                 if (p==0) {pointArray[4] = "1";}
104                                 _pointList.add(pointArray);
105                         }
106                 }
107         }
108
109
110         /**
111          * Construct the String array for the given coordinates and name
112          * @param inCoordinates coordinate string in Kml format
113          * @param inName name of waypoint, or null if track point
114          * @return String array for point
115          */
116         private static String[] makeStringArray(String inCoordinates, String inName)
117         {
118                 String[] result = new String[5];
119                 String[] values = inCoordinates.split(",");
120                 if (values.length == 3) {System.arraycopy(values, 0, result, 0, 3);}
121                 result[3] = inName;
122                 return result;
123         }
124
125
126         /**
127          * @see tim.prune.load.xml.XmlHandler#getFieldArray()
128          */
129         public Field[] getFieldArray()
130         {
131                 final Field[] fields = {Field.LONGITUDE, Field.LATITUDE, Field.ALTITUDE, Field.WAYPT_NAME, Field.NEW_SEGMENT};
132                 return fields;
133         }
134
135
136         /**
137          * Return the parsed information as a 2d array
138          * @see tim.prune.load.xml.XmlHandler#getDataArray()
139          */
140         public String[][] getDataArray()
141         {
142                 int numPoints = _pointList.size();
143                 // construct data array
144                 String[][] result = new String[numPoints][];
145                 for (int i=0; i<numPoints; i++)
146                 {
147                         result[i] = (String[]) _pointList.get(i);
148                 }
149                 return result;
150         }
151
152 }