From 6da7cb9aa06d0227a6f846a8d9b0aff7ca0d243e Mon Sep 17 00:00:00 2001 From: yuuhayashi Date: Fri, 1 Jan 2016 13:27:26 +0900 Subject: [PATCH] =?utf8?q?fix:GPX=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB?= =?utf8?q?=E5=8D=98=E4=BD=93=E9=81=B8=E6=8A=9E=E3=82=92=E5=8F=AF=E8=83=BD?= =?utf8?q?=E3=81=AB=E3=81=97=E3=81=BE=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- importPicture/src/osm/jp/gpx/ImportPicture.java | 209 +++++++++++++-------- .../src/osm/jp/gpx/matchtime/gui/AdjustTime.java | 3 +- .../jp/gpx/matchtime/gui/ParameterPanelFolder.java | 26 ++- 3 files changed, 138 insertions(+), 100 deletions(-) diff --git a/importPicture/src/osm/jp/gpx/ImportPicture.java b/importPicture/src/osm/jp/gpx/ImportPicture.java index 27b795e..789fe4c 100644 --- a/importPicture/src/osm/jp/gpx/ImportPicture.java +++ b/importPicture/src/osm/jp/gpx/ImportPicture.java @@ -134,7 +134,7 @@ public class ImportPicture extends Thread { } // - if (argv[3].toUpperCase().equals("noEXIF")) { + if (argv[3].toUpperCase().equals("NOEXIF")) { obj.exif = false; obj.outDir = null; } @@ -146,14 +146,16 @@ public class ImportPicture extends Thread { // 第6引数が指定されなければ、指定されたディレクトリ内のGPXファイルすべてを対象とする if (argv.length >= 5) { obj.gpxDir = new File(argv[4]); + if (!obj.gpxDir.exists()) { + // GPXファイルまたはディレクトリが存在しません。 + System.out.println("GPXファイルまたはディレクトリが存在しません。('"+ argv[4] +"')"); + return; + } } else { obj.gpxDir = obj.imgDir; } - if (obj.gpxDir.isFile()) { - obj.gpxFiles.add(new File(obj.gpxDir, argv[4])); - } - else { + if (obj.gpxDir.isDirectory()) { File[] files = obj.gpxDir.listFiles(); if (files == null) { // 対象となるGPXファイルがありませんでした。 @@ -171,6 +173,9 @@ public class ImportPicture extends Thread { } } } + else { + obj.gpxFiles.add(obj.gpxDir); + } // その他のパラメータを読み取る obj.params = new AppParameters(); @@ -194,15 +199,18 @@ public class ImportPicture extends Thread { @Override public void run() { String paramStr = params.getProperty(AppParameters.GPX_GPXSPLIT); - if ((paramStr != null) && (paramStr.toUpperCase().equals(AppParameters.GPX_GPXSPLIT))) { + if ((paramStr != null) && (paramStr.toUpperCase().equals("ON"))) { param_GpxSplit = true; } paramStr = params.getProperty(AppParameters.GPX_NO_FIRST_NODE); - if ((paramStr != null) && (paramStr.toUpperCase().equals(AppParameters.GPX_NO_FIRST_NODE))) { + if ((paramStr != null) && (paramStr.toUpperCase().equals("ON"))) { param_GpxNoFirstNode = true; } + System.out.println(" - param: number of gpxFiles = '"+ this.gpxFiles.size() +"'"); + System.out.println(" - param: imgDir = '"+ this.imgDir.getAbsolutePath() +"'"); + System.out.println(" - param: outDir = '"+ (this.outDir == null ? "" : this.outDir.getAbsolutePath()) +"'"); System.out.println(" - param: "+ AppParameters.GPX_GPXSPLIT +"="+ param_GpxSplit); System.out.println(" - param: "+ AppParameters.GPX_NO_FIRST_NODE +"="+ param_GpxNoFirstNode); System.out.println(" - param: "+ AppParameters.GPX_BASETIME +"="+ params.getProperty(AppParameters.GPX_BASETIME) ); @@ -235,6 +243,10 @@ public class ImportPicture extends Thread { File outputFile = new File(imgDir, iStr +"_.gpx"); System.out.println(iStr + " => "+ outputFile.getName()); + 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(); @@ -263,64 +275,93 @@ public class ImportPicture extends Thread { * */ TreeMap map = new TreeMap<>(); + TreeMap mapTRKSEG = new TreeMap<>(); Element trk = null; gpx = builder.parse(gpxFile).getFirstChild(); + Document doc = gpx.getOwnerDocument(); NodeList nodes = gpx.getChildNodes(); for (int i=0; i < nodes.getLength(); i++) { Node node2 = nodes.item(i); if (node2.getNodeName().equals("trk")) { trk = (Element) node2; - trkptMap(trk, map); - } - } + + NodeList nodes1 = trk.getChildNodes(); + int trksegCounter = 0; + for (int i1=0; i1 < nodes1.getLength(); i1++) { + Node nodeTRKSEG = nodes1.item(i1); + if (nodeTRKSEG.getNodeName().equals("trkseg")) { + trksegCounter++; + Element newTRKSEG = doc.createElement("trkseg"); + Element trkseg = (Element) nodeTRKSEG; + NodeList nodes2 = trkseg.getChildNodes(); + for (int i2=0; i2 < nodes2.getLength(); i2++) { + Node nodeTRKPT = nodes2.item(i2); + if (nodeTRKPT.getNodeName().equals("trkpt")) { + if (param_GpxNoFirstNode && (i2 == 0)) { + continue; + } + newTRKSEG.appendChild(getCopy(doc, nodeTRKPT)); + } + } + mapTRKSEG.put(new Long(trksegCounter), getCopy(doc, newTRKSEG)); - boolean change = false; - if (trk != null) { - /* - * GPXへ割りつける開始時刻と終了時刻を求める - */ - long gpxStartTime = (new Date()).getTime(); // 対象とする開始時刻(現在時刻) - long gpxEndTime = 0L; // 対象とする終了時刻 - Set keySet = map.keySet(); //すべてのキー値を取得 - for (Long timeLong : keySet) { - long gpxTime = timeLong; - if (gpxStartTime > gpxTime) { - gpxStartTime = gpxTime; + // からを削除する。 + trk.removeChild(nodeTRKSEG); + } } - if (gpxEndTime < gpxTime) { - gpxEndTime = gpxTime; + + // 毎に実行する + Iterator keyIte = mapTRKSEG.keySet().iterator(); + while (keyIte.hasNext()) { //ループ。反復子iteratorによる キー 取得 + + // に、新たなを追加する。 + Element newTRKSEG = mapTRKSEG.get(keyIte.next()); + trk.appendChild(newTRKSEG); + + // mapに、を割り付ける + trkptMap(newTRKSEG, map); } } - - System.out.println(" 時差: "+ (delta / 1000) +"(sec)"); - System.out.println(" Target GPX: ["+ gpxFile.getAbsolutePath() +"]"); - System.out.println("GPX start time: "+ dfjp.format(new Date(gpxStartTime)) + "\t[GMT " + dfuk.format(new Date(gpxStartTime))+"]"); - System.out.println(" GPX end time: "+ dfjp.format(new Date(gpxEndTime)) + "\t[GMT " + dfuk.format(new Date(gpxEndTime))+"]"); - System.out.println(" EXIF: "+ (exif ? ("convert to '" + outDir.getAbsolutePath() +"'") : "off")); - System.out.println(); - System.out.println("------------|--------------------|--------------------|------------|------------|--------|------|"); - System.out.println(" name | UpdateTime | GPStime | Latitude | Longitude | ele |magvar|"); - System.out.println("------------|--------------------|--------------------|------------|------------|--------|------|"); - change = proc(imgDir, delta, gpxStartTime, gpxEndTime, map, exif, gpx); - System.out.println("------------|--------------------|--------------------|------------|------------|--------|------|"); } + + /* + * GPXへ割りつける開始時刻と終了時刻を求める + */ + long gpxStartTime = (new Date()).getTime(); // 対象とする開始時刻(現在時刻) + long gpxEndTime = 0L; // 対象とする終了時刻 + Set keySet = map.keySet(); //すべてのキー値を取得 + for (Long timeLong : keySet) { + long gpxTime = timeLong; + if (gpxStartTime > gpxTime) { + gpxStartTime = gpxTime; + } + if (gpxEndTime < gpxTime) { + gpxEndTime = gpxTime; + } + } + + System.out.println("GPX start time: "+ dfjp.format(new Date(gpxStartTime)) + "\t[GMT " + dfuk.format(new Date(gpxStartTime))+"]"); + System.out.println(" GPX end time: "+ dfjp.format(new Date(gpxEndTime)) + "\t[GMT " + dfuk.format(new Date(gpxEndTime))+"]"); + System.out.println("------------|--------------------|--------------------|------------|------------|--------|------|"); + System.out.println(" name | UpdateTime | GPStime | Latitude | Longitude | ele |magvar|"); + System.out.println("------------|--------------------|--------------------|------------|------------|--------|------|"); + proc(imgDir, delta, gpxStartTime, gpxEndTime, map, exif, gpx); + System.out.println("------------|--------------------|--------------------|------------|------------|--------|------|"); // 出力 - if (change) { - 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); - if (exif) { - outputFile = new File(outDir, iStr +"_.gpx"); - os = new FileOutputStream(outputFile); - result = new StreamResult(os); - transformer.transform(source, result); - } + 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); + if (exif) { + outputFile = new File(outDir, iStr +"_.gpx"); + os = new FileOutputStream(outputFile); + result = new StreamResult(os); + transformer.transform(source, result); } } } @@ -341,7 +382,7 @@ public class ImportPicture extends Thread { DecimalFormat dayFormatter = new DecimalFormat("00"); boolean ret = false; - File[] files = dir.listFiles(); + File[] files = dir.listFiles(new JpegFileFilter()); Arrays.sort(files, new FileSort()); for (File image : files) { System.out.print(String.format("%12s|", image.getName())); @@ -530,44 +571,34 @@ public class ImportPicture extends Thread { /** * XMLエレメント<trkpt>をTIMEでキー付したHashMapを生成する
* - * <trk><trkseg><trkpt><time>2014-01-01T00:59:09Z</time></trkpt></trkseg></trk> + * <trkseg><trkpt><time>2014-01-01T00:59:09Z</time></trkpt></trkseg> * * @param trk * @param map * @throws ParseException */ - public void trkptMap(Element trk, TreeMap map) throws ParseException { + public void trkptMap(Element trkseg, TreeMap map) throws ParseException { dfuk.setTimeZone(TimeZone.getTimeZone("GMT")); - NodeList nodes1 = trk.getChildNodes(); - for (int i1=0; i1 < nodes1.getLength(); i1++) { - Node node2 = nodes1.item(i1); - if (node2.getNodeName().equals("trkseg")) { - Element trkseg = (Element) node2; - NodeList nodes2 = trkseg.getChildNodes(); - for (int i2=0; i2 < nodes2.getLength(); i2++) { - Node node3 = nodes2.item(i2); - if (node3.getNodeName().equals("trkpt")) { - Element trkpt = (Element) node3; - - NodeList nodes3 = trkpt.getChildNodes(); - for (int i3=0; i3 < nodes3.getLength(); i3++) { - if (param_GpxNoFirstNode && (i3 == 0)) { - continue; - } - Node node4 = nodes3.item(i3); - if (node4.getNodeName().equals("time")) { - Element time = (Element) node4; - NodeList nodes4 = time.getChildNodes(); // 子ノードを取得 - for (int i4=0; i4< nodes4.getLength(); i4++) { - Node node5 = nodes4.item(i4); - if (node5 != null) { - if (node5.getNodeType() == Node.TEXT_NODE) { - String timeStr = node5.getNodeValue(); - long t = dfuk.parse(timeStr).getTime(); - map.put(t, getCopy(trk.getOwnerDocument(), trkpt)); - } - } + NodeList nodes2 = trkseg.getChildNodes(); + for (int i2=0; i2 < nodes2.getLength(); i2++) { + Node node3 = nodes2.item(i2); + if (node3.getNodeName().equals("trkpt")) { + Element trkpt = (Element) node3; + + NodeList nodes3 = trkpt.getChildNodes(); + for (int i3=0; i3 < nodes3.getLength(); i3++) { + Node node4 = nodes3.item(i3); + if (node4.getNodeName().equals("time")) { + Element time = (Element) node4; + NodeList nodes4 = time.getChildNodes(); // 子ノードを取得 + for (int i4=0; i4< nodes4.getLength(); i4++) { + Node node5 = nodes4.item(i4); + if (node5 != null) { + if (node5.getNodeType() == Node.TEXT_NODE) { + String timeStr = node5.getNodeValue(); + long t = dfuk.parse(timeStr).getTime(); + map.put(t, getCopy(trkseg.getOwnerDocument(), trkpt)); } } } @@ -865,4 +896,16 @@ public class ImportPicture extends Thread { } } + /** + * JPEGファイルフィルター + * @author yuu + */ + class JpegFileFilter implements FilenameFilter{ + public boolean accept(File dir, String name) { + if (name.matches(".*\\.JPG$")) { + return true; + } + return false; + } + } } \ No newline at end of file diff --git a/importPicture/src/osm/jp/gpx/matchtime/gui/AdjustTime.java b/importPicture/src/osm/jp/gpx/matchtime/gui/AdjustTime.java index 8ea7ccd..eb4f55f 100644 --- a/importPicture/src/osm/jp/gpx/matchtime/gui/AdjustTime.java +++ b/importPicture/src/osm/jp/gpx/matchtime/gui/AdjustTime.java @@ -232,7 +232,7 @@ public class AdjustTime extends JFrame JPanel tmpPanel4 = new JPanel(); tmpPanel4.setLayout(new BoxLayout(tmpPanel4, BoxLayout.Y_AXIS)); File gpxDir = new File("."); - arg4_gpxFolder = new ParameterPanelFolder("GPXフォルダ: ", gpxDir.getAbsolutePath()); + arg4_gpxFolder = new ParameterPanelFolder("GPXフォルダ: ", gpxDir.getAbsolutePath(), false); tmpPanel4.add(arg4_gpxFolder); cards[cardNo].add(tmpPanel4, BorderLayout.CENTER); @@ -322,7 +322,6 @@ public class AdjustTime extends JFrame try { createAndShowGUI(); } catch (Exception e) { - // TODO Auto-generated catch block e.printStackTrace(); } }); diff --git a/importPicture/src/osm/jp/gpx/matchtime/gui/ParameterPanelFolder.java b/importPicture/src/osm/jp/gpx/matchtime/gui/ParameterPanelFolder.java index 31369c4..517df40 100644 --- a/importPicture/src/osm/jp/gpx/matchtime/gui/ParameterPanelFolder.java +++ b/importPicture/src/osm/jp/gpx/matchtime/gui/ParameterPanelFolder.java @@ -11,36 +11,32 @@ public class ParameterPanelFolder extends ParameterPanel implements ActionListen JFileChooser fc; JButton openButton; - public ParameterPanelFolder(String label, String text) { + public ParameterPanelFolder(String label, String text, boolean onlyDir) { super(label, text); //Create a file chooser File sdir = new File(text); - if (sdir.isDirectory()) { + + if (sdir.exists()) { fc = new JFileChooser(sdir); } else { fc = new JFileChooser(); } - fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - - //Uncomment one of the following lines to try a different - //file selection mode. The first allows just directories - //to be selected (and, at least in the Java look and feel, - //shown). The second allows both files and directories - //to be selected. If you leave these lines commented out, - //then the default mode (FILES_ONLY) will be used. - // - //fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - //fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); + + if (onlyDir) { + fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + } - //Create the open button. We use the image from the JLF - //Graphics Repository (but we extracted it from the jar). openButton = new JButton("選択...", AdjustTime.createImageIcon("images/Open16.gif")); openButton.addActionListener(this); this.add(openButton); } + public ParameterPanelFolder(String label, String text) { + this(label, text, true); + } + public void setEnable(boolean f) { super.setEnabled(f); openButton.setEnabled(f); -- 2.11.0