OSDN Git Service

fixed: GUIを一新した
[importpicture/importpicture.git] / src / main / java / osm / jp / gpx / GpxFile.java
1 package osm.jp.gpx;
2
3 import java.io.File;
4 import java.io.FileNotFoundException;
5 import java.io.FileOutputStream;
6 import java.io.IOException;
7 import java.text.ParseException;
8
9 import javax.xml.parsers.DocumentBuilder;
10 import javax.xml.parsers.DocumentBuilderFactory;
11 import javax.xml.parsers.ParserConfigurationException;
12 import javax.xml.transform.OutputKeys;
13 import javax.xml.transform.Transformer;
14 import javax.xml.transform.TransformerException;
15 import javax.xml.transform.TransformerFactory;
16 import javax.xml.transform.dom.DOMSource;
17 import javax.xml.transform.stream.StreamResult;
18
19 import org.w3c.dom.DOMException;
20 import org.w3c.dom.Document;
21 import org.w3c.dom.Element;
22 import org.w3c.dom.NamedNodeMap;
23 import org.w3c.dom.Node;
24 import org.w3c.dom.NodeList;
25 import org.xml.sax.SAXException;
26
27 @SuppressWarnings("serial")
28 public class GpxFile extends File {
29     Node gpx = null;
30     ElementMapTRKSEG mapTRKSEG = null;
31     Document document;
32
33     @SuppressWarnings("LeakingThisInConstructor")
34     public GpxFile(File file) throws ParserConfigurationException, DOMException, SAXException, IOException, ParseException {
35         super(file.getParentFile(), file.getName());
36
37         DocumentBuilderFactory factory = null;
38         DocumentBuilder        builder = null;
39         
40         factory = DocumentBuilderFactory.newInstance();
41         builder = factory.newDocumentBuilder();
42         factory.setIgnoringElementContentWhitespace(true);
43         factory.setIgnoringComments(true);
44         factory.setValidating(true);
45
46         // GPXファイルをパースする
47         mapTRKSEG = new ElementMapTRKSEG();
48         document = mapTRKSEG.parse(this);
49         
50         // パースされた mapTRKSEG の中身を出力する
51         mapTRKSEG.printinfo();
52         
53         // GPX file --> Node root
54         gpx = builder.parse(this).getFirstChild();
55     }
56         
57     /**
58      * GPX 変換出力
59      * @param outDir
60      * @throws FileNotFoundException 
61      * @throws TransformerException 
62      */
63     public void output(File outDir) throws FileNotFoundException, TransformerException {
64         String fileName = this.getName();
65         String iStr = fileName.substring(0, fileName.length() - 4);
66         File outputFile = new File(outDir, iStr +"_.gpx");
67         System.out.println(this.getAbsolutePath() + " => "+ outputFile.getAbsolutePath());
68         
69         outputFile.getParentFile().mkdirs();
70         DOMSource source = new DOMSource(this.gpx);
71         FileOutputStream os = new FileOutputStream(outputFile);
72         StreamResult result = new StreamResult(os);
73         TransformerFactory transFactory = TransformerFactory.newInstance();
74         Transformer transformer = transFactory.newTransformer();
75         transformer.setOutputProperty(OutputKeys.INDENT, "yes");
76         transformer.setOutputProperty(OutputKeys.METHOD, "xml");
77         transformer.transform(source, result);         
78
79         os = new FileOutputStream(outputFile);
80         result = new StreamResult(os);
81         transformer.transform(source, result);
82     }
83
84     /**
85      *  <wpt lat="35.25714922" lon="139.15490497">
86      *          <ele>62.099998474121094</ele>
87      *          <time>2012-06-11T00:44:38Z</time>
88      *          <name><![CDATA[写真]]></name>
89      *          <link href="2012-06-11_09-44-38.jpg">
90      *                  <text>2012-06-11_09-44-38.jpg</text>
91      *          </link>
92      *  </wpt>
93      *
94      *  <trkpt lat="35.32123832" lon="139.56965631">
95      *          <ele>47.20000076293945</ele>
96      *          <time>2012-06-15T03:00:29Z</time>
97      *  </trkpt>
98      *
99      * @param imgDir
100      * @return
101      * @param iFile
102      * @param timestamp
103      * @param trkpt
104      */
105     public Element createWptTag(File iFile, File imgDir, long timestamp, Element trkpt) {
106         Element wpt = document.createElement("wpt");
107
108         NamedNodeMap nodeMap = trkpt.getAttributes();
109         if (null != nodeMap) {
110             for (int j=0; j < nodeMap.getLength(); j++ ) {
111                 switch (nodeMap.item(j).getNodeName()) {
112                 case "lat":
113                     String lat = nodeMap.item(j).getNodeValue();
114                     wpt.setAttribute("lat", lat);
115                     break;
116                 case "lon":
117                     String lon = nodeMap.item(j).getNodeValue();
118                     wpt.setAttribute("lon", lon);
119                     break;
120                 }
121             }
122         }
123
124         NodeList nodes1 = trkpt.getChildNodes();
125         for (int i1=0; i1 < nodes1.getLength(); i1++) {
126             Node node1 = nodes1.item(i1);
127             NodeList nodes2 = node1.getChildNodes();
128             switch (node1.getNodeName()) {
129             case "ele":
130                 for (int i2=0; i2 < nodes2.getLength(); i2++) {
131                     Node node2 = nodes2.item(i2);
132                     if (node2 != null) {
133                         if (node2.getNodeType() == Node.TEXT_NODE) {
134                             String eleStr = node2.getNodeValue();
135                             Element eleE = document.createElement("ele");
136                             eleE.setTextContent(eleStr);
137                             wpt.appendChild(eleE);
138                         }
139                     }
140                 }
141                 break;
142             case "time":
143                 for (int i2=0; i2 < nodes2.getLength(); i2++) {
144                     Node node2 = nodes2.item(i2);
145                     if (node2 != null) {
146                         if (node2.getNodeType() == Node.TEXT_NODE) {
147                             String timeStr = node2.getNodeValue();
148                             Element timeE = document.createElement("time");
149                             timeE.setTextContent(timeStr);
150                             wpt.appendChild(timeE);
151                         }
152                     }
153                 }
154                 break;
155             case "magvar":
156                 for (int i2=0; i2 < nodes2.getLength(); i2++) {
157                     Node node2 = nodes2.item(i2);
158                     if (node2 != null) {
159                         if (node2.getNodeType() == Node.TEXT_NODE) {
160                             String magvarStr = node2.getNodeValue();
161                             Element magvarE = document.createElement("magvar");
162                             magvarE.setTextContent(magvarStr);
163                             wpt.appendChild(magvarE);
164                         }
165                     }
166                 }
167                 break;
168             case "speed":
169                 for (int i2=0; i2 < nodes2.getLength(); i2++) {
170                     Node node2 = nodes2.item(i2);
171                     if (node2 != null) {
172                         if (node2.getNodeType() == Node.TEXT_NODE) {
173                             String speedStr = node2.getNodeValue();
174                             Element speedE = document.createElement("speed");
175                             speedE.setTextContent(speedStr);
176                             wpt.appendChild(speedE);
177                         }
178                     }
179                 }
180                 break;
181             }
182         }
183
184         Element name = document.createElement("name");
185         name.appendChild(document.createCDATASection("写真"));
186         wpt.appendChild(name);
187
188         Element link = document.createElement("link");
189         link.setAttribute("href", ImportPicture.getShortPathName(imgDir, iFile));
190         Element text = document.createElement("text");
191         text.setTextContent(iFile.getName());
192         link.appendChild(text);
193         wpt.appendChild(link);
194
195         return wpt;
196     }
197 }