--- /dev/null
+package osm.jp.gpx;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.text.ParseException;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.w3c.dom.DOMException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+@SuppressWarnings("serial")
+public class GpxFile extends File {
+ Node gpx = null;
+ ElementMapTRKSEG mapTRKSEG = null;
+ Document document;
+
+ public GpxFile(File file) throws ParserConfigurationException, DOMException, SAXException, IOException, ParseException {
+ super(file.getParentFile(), file.getName());
+
+ DocumentBuilderFactory factory = null;
+ DocumentBuilder builder = null;
+
+ factory = DocumentBuilderFactory.newInstance();
+ builder = factory.newDocumentBuilder();
+ factory.setIgnoringElementContentWhitespace(true);
+ factory.setIgnoringComments(true);
+ factory.setValidating(true);
+
+ // GPXファイルをパースする
+ mapTRKSEG = new ElementMapTRKSEG();
+ document = mapTRKSEG.parse(this);
+
+ // パースされた mapTRKSEG の中身を出力する
+ mapTRKSEG.printinfo();
+
+ // GPX file --> Node root
+ gpx = builder.parse(this).getFirstChild();
+ }
+
+ /**
+ * GPX 変換出力
+ * @throws FileNotFoundException
+ * @throws TransformerException
+ */
+ public void output(File outDir) throws FileNotFoundException, TransformerException {
+ String fileName = this.getName();
+ String iStr = fileName.substring(0, fileName.length() - 4);
+ File outputFile = new File(outDir, iStr +"_.gpx");
+ System.out.println(this.getAbsolutePath() + " => "+ outputFile.getAbsolutePath());
+
+ outputFile.getParentFile().mkdirs();
+ DOMSource source = new DOMSource(this.gpx);
+ FileOutputStream os = new FileOutputStream(outputFile);
+ StreamResult result = new StreamResult(os);
+ TransformerFactory transFactory = TransformerFactory.newInstance();
+ Transformer transformer = transFactory.newTransformer();
+ transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+ transformer.setOutputProperty(OutputKeys.METHOD, "xml");
+ transformer.transform(source, result);
+
+ os = new FileOutputStream(outputFile);
+ result = new StreamResult(os);
+ transformer.transform(source, result);
+ }
+
+ /**
+ * <wpt lat="35.25714922" lon="139.15490497">
+ * <ele>62.099998474121094</ele>
+ * <time>2012-06-11T00:44:38Z</time>
+ * <name><![CDATA[写真]]></name>
+ * <link href="2012-06-11_09-44-38.jpg">
+ * <text>2012-06-11_09-44-38.jpg</text>
+ * </link>
+ * </wpt>
+ *
+ * <trkpt lat="35.32123832" lon="139.56965631">
+ * <ele>47.20000076293945</ele>
+ * <time>2012-06-15T03:00:29Z</time>
+ * </trkpt>
+ *
+ * @return
+ * @param iFile
+ * @param timestamp
+ * @param trkpt
+ */
+ public Element createWptTag(File iFile, File imgDir, long timestamp, Element trkpt) {
+ Element wpt = document.createElement("wpt");
+
+ NamedNodeMap nodeMap = trkpt.getAttributes();
+ if (null != nodeMap) {
+ for (int j=0; j < nodeMap.getLength(); j++ ) {
+ switch (nodeMap.item(j).getNodeName()) {
+ case "lat":
+ String lat = nodeMap.item(j).getNodeValue();
+ wpt.setAttribute("lat", lat);
+ break;
+ case "lon":
+ String lon = nodeMap.item(j).getNodeValue();
+ wpt.setAttribute("lon", lon);
+ break;
+ }
+ }
+ }
+
+ NodeList nodes1 = trkpt.getChildNodes();
+ for (int i1=0; i1 < nodes1.getLength(); i1++) {
+ Node node1 = nodes1.item(i1);
+ NodeList nodes2 = node1.getChildNodes();
+ switch (node1.getNodeName()) {
+ case "ele":
+ for (int i2=0; i2 < nodes2.getLength(); i2++) {
+ Node node2 = nodes2.item(i2);
+ if (node2 != null) {
+ if (node2.getNodeType() == Node.TEXT_NODE) {
+ String eleStr = node2.getNodeValue();
+ Element eleE = document.createElement("ele");
+ eleE.setTextContent(eleStr);
+ wpt.appendChild(eleE);
+ }
+ }
+ }
+ break;
+ case "time":
+ for (int i2=0; i2 < nodes2.getLength(); i2++) {
+ Node node2 = nodes2.item(i2);
+ if (node2 != null) {
+ if (node2.getNodeType() == Node.TEXT_NODE) {
+ String timeStr = node2.getNodeValue();
+ Element timeE = document.createElement("time");
+ timeE.setTextContent(timeStr);
+ wpt.appendChild(timeE);
+ }
+ }
+ }
+ break;
+ case "magvar":
+ for (int i2=0; i2 < nodes2.getLength(); i2++) {
+ Node node2 = nodes2.item(i2);
+ if (node2 != null) {
+ if (node2.getNodeType() == Node.TEXT_NODE) {
+ String magvarStr = node2.getNodeValue();
+ Element magvarE = document.createElement("magvar");
+ magvarE.setTextContent(magvarStr);
+ wpt.appendChild(magvarE);
+ }
+ }
+ }
+ break;
+ case "speed":
+ for (int i2=0; i2 < nodes2.getLength(); i2++) {
+ Node node2 = nodes2.item(i2);
+ if (node2 != null) {
+ if (node2.getNodeType() == Node.TEXT_NODE) {
+ String speedStr = node2.getNodeValue();
+ Element speedE = document.createElement("speed");
+ speedE.setTextContent(speedStr);
+ wpt.appendChild(speedE);
+ }
+ }
+ }
+ break;
+ }
+ }
+
+ Element name = document.createElement("name");
+ name.appendChild(document.createCDATASection("写真"));
+ wpt.appendChild(name);
+
+ Element link = document.createElement("link");
+ link.setAttribute("href", ImportPicture.getShortPathName(imgDir, iFile));
+ Element text = document.createElement("text");
+ text.setTextContent(iFile.getName());
+ link.appendChild(text);
+ wpt.appendChild(link);
+
+ return wpt;
+ }
+}