diff --git a/importPicture/src/osm/jp/gpx/GpxFile.java b/importPicture/src/osm/jp/gpx/GpxFile.java new file mode 100644 index 0000000..721fa0f --- /dev/null +++ b/importPicture/src/osm/jp/gpx/GpxFile.java @@ -0,0 +1,194 @@ +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></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; + } +} diff --git a/importPicture/src/osm/jp/gpx/ImportPicture.java b/importPicture/src/osm/jp/gpx/ImportPicture.java index 90086cb..f617918 100644 --- a/importPicture/src/osm/jp/gpx/ImportPicture.java +++ b/importPicture/src/osm/jp/gpx/ImportPicture.java @@ -17,12 +17,7 @@ import java.util.logging.Logger; import javax.xml.parsers.*; -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.apache.commons.imaging.ImageReadException; import org.apache.commons.imaging.ImageWriteException; @@ -131,7 +126,7 @@ public boolean param_GpxOutputWpt = true; public boolean param_ImgOutputAll = false; public String param_GpxSourceFolder = "."; - Document document; + public static final String TIME_FORMAT_STRING = "yyyy-MM-dd'T'HH:mm:ss'Z'"; private static final String EXIF_DATE_TIME_FORMAT_STRING = "yyyy:MM:dd HH:mm:ss"; @@ -307,7 +302,7 @@ } for (File gpxFile : this.gpxFiles) { - procGPXfile(gpxFile); + procGPXfile(new GpxFile(gpxFile)); } } catch(ParserConfigurationException | DOMException | SAXException | IOException | ParseException | ImageReadException | ImageWriteException | IllegalArgumentException | TransformerException e) { @@ -327,61 +322,23 @@ * @throws ImageReadException * @throws TransformerException */ - void procGPXfile(File gpxFile) throws ParserConfigurationException, SAXException, IOException, ParseException, ImageReadException, ImageWriteException, TransformerException { - DocumentBuilderFactory factory = null; - DocumentBuilder builder = null; - ElementMapTRKSEG mapTRKSEG = null; - Node gpx = null; - + void procGPXfile(GpxFile gpxFile) throws ParserConfigurationException, SAXException, IOException, ParseException, ImageReadException, ImageWriteException, TransformerException { System.gc(); - String fileName = gpxFile.getName(); - String iStr = fileName.substring(0, fileName.length() - 4); - - File outputFile = new File(outDir, iStr +"_.gpx"); - System.out.println(gpxFile.getAbsolutePath() + " => "+ outputFile.getAbsolutePath()); System.out.println(" 時差: "+ (delta / 1000) +"(sec)"); System.out.println(" Target GPX: ["+ gpxFile.getAbsolutePath() +"]"); System.out.println(" EXIF: "+ (exif ? ("convert to '" + outDir.getAbsolutePath() +"'") : "off")); System.out.println(); - factory = DocumentBuilderFactory.newInstance(); - builder = factory.newDocumentBuilder(); - factory.setIgnoringElementContentWhitespace(true); - factory.setIgnoringComments(true); - factory.setValidating(true); - - // GPXファイルをパースする - mapTRKSEG = new ElementMapTRKSEG(); - document = mapTRKSEG.parse(gpxFile); - - // パースされた mapTRKSEG の中身を出力する - mapTRKSEG.printinfo(); - - // GPX file --> Node root - gpx = builder.parse(gpxFile).getFirstChild(); - // imgDir内の画像ファイルを処理する System.out.println("|--------------------------------|--------------------|--------------------|--------------|--------------|--------|------|------|"); System.out.println("| name | Camera Time | GPStime | Latitude | Longitude | ele |magvar| km/h |"); System.out.println("|--------------------------------|--------------------|--------------------|--------------|--------------|--------|------|------|"); - proc(imgDir, delta, mapTRKSEG, exif, gpx); + proc(imgDir, delta, gpxFile.mapTRKSEG, exif, gpxFile); System.out.println("|--------------------------------|--------------------|--------------------|--------------|--------------|--------|------|------|"); - // 出力 - outputFile.getParentFile().mkdirs(); - DOMSource source = new DOMSource(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); + // GPX出力 + gpxFile.output(outDir); } @@ -392,14 +349,14 @@ * @throws ImageReadException * @throws ImageWriteException */ - boolean proc(File dir, long delta, ElementMapTRKSEG mapTRKSEG, boolean exifWrite, Node gpx) throws ParseException, ImageReadException, IOException, ImageWriteException { + boolean proc(File dir, long delta, ElementMapTRKSEG mapTRKSEG, boolean exifWrite, GpxFile gpxFile) throws ParseException, ImageReadException, IOException, ImageWriteException { boolean ret = false; File[] files = dir.listFiles(new JpegFileFilter()); Arrays.sort(files, new FileSort()); for (File image : files) { System.out.print(String.format("|%-32s|", image.getName())); if (image.isDirectory()) { - ret = proc(image, delta, mapTRKSEG, exifWrite, gpx); + ret = proc(image, delta, mapTRKSEG, exifWrite, gpxFile); continue; } @@ -409,7 +366,7 @@ continue; } - Discripter result = procImageFile(image, delta, mapTRKSEG, exifWrite, gpx); + Discripter result = procImageFile(image, delta, mapTRKSEG, exifWrite, gpxFile); ret |= result.ret; switch (result.control) { case Discripter.CONTINUE: @@ -434,7 +391,7 @@ } } - Discripter procImageFile(File imageFile, long delta, ElementMapTRKSEG mapTRKSEG, boolean exifWrite, Node gpx) throws ParseException, ImageReadException, IOException, ImageWriteException { + Discripter procImageFile(File imageFile, long delta, ElementMapTRKSEG mapTRKSEG, boolean exifWrite, GpxFile gpxFile) throws ParseException, ImageReadException, IOException, ImageWriteException { Discripter result = new Discripter(false); // itime <-- 画像ファイルの撮影時刻 @@ -515,8 +472,8 @@ if (Boolean.parseBoolean(params.getProperty(AppParameters.GPX_OUTPUT_WPT))) { if (trkptT != null) { - Element temp = createWptTag(imageFile, itime.getTime(), trkptT.trkpt); - gpx.appendChild(temp); + Element temp = gpxFile.createWptTag(imageFile, imgDir, itime.getTime(), trkptT.trkpt); + gpxFile.gpx.appendChild(temp); } } } @@ -653,119 +610,7 @@ return ((name != null) && name.toUpperCase().endsWith(".JPG")); } - /** - * <wpt lat="35.25714922" lon="139.15490497"> - * <ele>62.099998474121094</ele> - * <time>2012-06-11T00:44:38Z</time> - * <name></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, 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; - } - /** * DateをEXIFの文字列に変換する。 * 注意:EXiFの撮影時刻はUTC時間ではない