OSDN Git Service

fix:GPXファイル単体選択を可能にしました
authoryuuhayashi <hayashi.yuu@gmail.com>
Fri, 1 Jan 2016 04:27:26 +0000 (13:27 +0900)
committeryuuhayashi <hayashi.yuu@gmail.com>
Fri, 1 Jan 2016 04:27:26 +0000 (13:27 +0900)
importPicture/src/osm/jp/gpx/ImportPicture.java
importPicture/src/osm/jp/gpx/matchtime/gui/AdjustTime.java
importPicture/src/osm/jp/gpx/matchtime/gui/ParameterPanelFolder.java

index 27b795e..789fe4c 100644 (file)
@@ -134,7 +134,7 @@ public class ImportPicture extends Thread {
         }\r
 \r
         // \r
-        if (argv[3].toUpperCase().equals("noEXIF")) {\r
+        if (argv[3].toUpperCase().equals("NOEXIF")) {\r
             obj.exif = false;\r
             obj.outDir = null;\r
         }\r
@@ -146,14 +146,16 @@ public class ImportPicture extends Thread {
         // 第6引数が指定されなければ、指定されたディレクトリ内のGPXファイルすべてを対象とする\r
         if (argv.length >= 5) {\r
             obj.gpxDir = new File(argv[4]);\r
+            if (!obj.gpxDir.exists()) {\r
+               // GPXファイルまたはディレクトリが存在しません。\r
+               System.out.println("GPXファイルまたはディレクトリが存在しません。('"+ argv[4] +"')");\r
+               return;\r
+            }\r
         }\r
         else {\r
             obj.gpxDir = obj.imgDir;\r
         }\r
-        if (obj.gpxDir.isFile()) {\r
-            obj.gpxFiles.add(new File(obj.gpxDir, argv[4]));            \r
-        }\r
-        else {\r
+        if (obj.gpxDir.isDirectory()) {\r
             File[] files = obj.gpxDir.listFiles();\r
             if (files == null) {\r
                // 対象となるGPXファイルがありませんでした。\r
@@ -171,6 +173,9 @@ public class ImportPicture extends Thread {
                 }\r
             }\r
         }\r
+        else {\r
+            obj.gpxFiles.add(obj.gpxDir);            \r
+        }\r
         \r
         // その他のパラメータを読み取る\r
         obj.params = new AppParameters();\r
@@ -194,15 +199,18 @@ public class ImportPicture extends Thread {
     @Override\r
     public void run() {\r
        String paramStr = params.getProperty(AppParameters.GPX_GPXSPLIT);\r
-       if ((paramStr != null) && (paramStr.toUpperCase().equals(AppParameters.GPX_GPXSPLIT))) {\r
+       if ((paramStr != null) && (paramStr.toUpperCase().equals("ON"))) {\r
                param_GpxSplit = true;\r
        }\r
         \r
        paramStr = params.getProperty(AppParameters.GPX_NO_FIRST_NODE);\r
-       if ((paramStr != null) && (paramStr.toUpperCase().equals(AppParameters.GPX_NO_FIRST_NODE))) {\r
+       if ((paramStr != null) && (paramStr.toUpperCase().equals("ON"))) {\r
                param_GpxNoFirstNode = true;\r
        }\r
        \r
+        System.out.println(" - param: number of gpxFiles = '"+ this.gpxFiles.size() +"'");\r
+        System.out.println(" - param: imgDir = '"+ this.imgDir.getAbsolutePath() +"'");\r
+        System.out.println(" - param: outDir = '"+ (this.outDir == null ? "" : this.outDir.getAbsolutePath()) +"'");\r
         System.out.println(" - param: "+ AppParameters.GPX_GPXSPLIT +"="+ param_GpxSplit);\r
         System.out.println(" - param: "+ AppParameters.GPX_NO_FIRST_NODE +"="+ param_GpxNoFirstNode);        \r
         System.out.println(" - param: "+ AppParameters.GPX_BASETIME +"="+ params.getProperty(AppParameters.GPX_BASETIME) );\r
@@ -235,6 +243,10 @@ public class ImportPicture extends Thread {
 \r
                 File outputFile = new File(imgDir, iStr +"_.gpx");\r
                 System.out.println(iStr + " => "+ outputFile.getName());\r
+                System.out.println("           時差: "+ (delta / 1000) +"(sec)");\r
+                System.out.println("    Target GPX: ["+ gpxFile.getAbsolutePath() +"]");\r
+                System.out.println("          EXIF: "+ (exif ? ("convert to '" + outDir.getAbsolutePath() +"'") : "off"));\r
+                System.out.println();\r
 \r
                 factory = DocumentBuilderFactory.newInstance();\r
                 builder = factory.newDocumentBuilder();\r
@@ -263,64 +275,93 @@ public class ImportPicture extends Thread {
                  * </gpx>\r
                  */\r
                 TreeMap<Long,Element> map = new TreeMap<>();\r
+                TreeMap<Long,Element> mapTRKSEG = new TreeMap<>();\r
                 Element trk = null;\r
                 gpx    = builder.parse(gpxFile).getFirstChild();\r
+                Document doc = gpx.getOwnerDocument();\r
                 NodeList nodes = gpx.getChildNodes();\r
                 for (int i=0; i < nodes.getLength(); i++) {\r
                     Node node2 = nodes.item(i);\r
                     if (node2.getNodeName().equals("trk")) {\r
                         trk = (Element) node2;\r
-                        trkptMap(trk, map);\r
-                    }\r
-                }\r
+                        \r
+                        NodeList nodes1 = trk.getChildNodes();\r
+                        int trksegCounter = 0;\r
+                        for (int i1=0; i1 < nodes1.getLength(); i1++) {\r
+                            Node nodeTRKSEG = nodes1.item(i1);\r
+                            if (nodeTRKSEG.getNodeName().equals("trkseg")) {\r
+                               trksegCounter++;\r
+                               Element newTRKSEG = doc.createElement("trkseg");\r
+                                Element trkseg = (Element) nodeTRKSEG;\r
+                                NodeList nodes2 = trkseg.getChildNodes();\r
+                                for (int i2=0; i2 < nodes2.getLength(); i2++) {\r
+                                    Node nodeTRKPT = nodes2.item(i2);\r
+                                    if (nodeTRKPT.getNodeName().equals("trkpt")) {\r
+                                       if (param_GpxNoFirstNode && (i2 == 0)) {\r
+                                               continue;\r
+                                       }\r
+                                       newTRKSEG.appendChild(getCopy(doc, nodeTRKPT));\r
+                                    }\r
+                                }\r
+                                mapTRKSEG.put(new Long(trksegCounter), getCopy(doc, newTRKSEG));\r
 \r
-                boolean change = false;\r
-                if (trk != null) {\r
-                    /*\r
-                    * GPXへ割りつける開始時刻と終了時刻を求める\r
-                    */\r
-                    long gpxStartTime = (new Date()).getTime();                // 対象とする開始時刻(現在時刻)\r
-                    long gpxEndTime = 0L;                                                      // 対象とする終了時刻\r
-                    Set<Long> keySet = map.keySet();  //すべてのキー値を取得\r
-                    for (Long timeLong : keySet) {\r
-                        long gpxTime = timeLong;\r
-                        if (gpxStartTime > gpxTime) {\r
-                            gpxStartTime = gpxTime;\r
+                                // <trk>から<trkseg>を削除する。\r
+                                trk.removeChild(nodeTRKSEG);\r
+                            }\r
                         }\r
-                        if (gpxEndTime < gpxTime) {\r
-                            gpxEndTime = gpxTime;\r
+                        \r
+                        // <trkseg>毎に実行する\r
+                        Iterator<Long> keyIte = mapTRKSEG.keySet().iterator();\r
+                        while (keyIte.hasNext()) {    //ループ。反復子iteratorによる キー 取得\r
+\r
+                               // <trk>に、新たな<trkseg>を追加する。\r
+                               Element newTRKSEG = mapTRKSEG.get(keyIte.next());\r
+                            trk.appendChild(newTRKSEG);\r
+                            \r
+                            // mapに、<trkpy>を割り付ける\r
+                            trkptMap(newTRKSEG, map);\r
                         }\r
                     }\r
-                    \r
-                    System.out.println("           時差: "+ (delta / 1000) +"(sec)");\r
-                    System.out.println("    Target GPX: ["+ gpxFile.getAbsolutePath() +"]");\r
-                    System.out.println("GPX start time: "+ dfjp.format(new Date(gpxStartTime)) + "\t[GMT " + dfuk.format(new Date(gpxStartTime))+"]");\r
-                    System.out.println("  GPX end time: "+ dfjp.format(new Date(gpxEndTime)) + "\t[GMT " + dfuk.format(new Date(gpxEndTime))+"]");\r
-                    System.out.println("          EXIF: "+ (exif ? ("convert to '" + outDir.getAbsolutePath() +"'") : "off"));\r
-                    System.out.println();\r
-                    System.out.println("------------|--------------------|--------------------|------------|------------|--------|------|");\r
-                    System.out.println(" name       | UpdateTime         | GPStime            | Latitude   | Longitude  | ele    |magvar|");\r
-                    System.out.println("------------|--------------------|--------------------|------------|------------|--------|------|");\r
-                    change = proc(imgDir, delta, gpxStartTime, gpxEndTime, map, exif, gpx);\r
-                    System.out.println("------------|--------------------|--------------------|------------|------------|--------|------|");\r
                 }\r
+                \r
+                /*\r
+                 * GPXへ割りつける開始時刻と終了時刻を求める\r
+                 */\r
+                               long gpxStartTime = (new Date()).getTime();             // 対象とする開始時刻(現在時刻)\r
+                               long gpxEndTime = 0L;                                                   // 対象とする終了時刻\r
+                               Set<Long> keySet = map.keySet();  //すべてのキー値を取得\r
+                               for (Long timeLong : keySet) {\r
+                                       long gpxTime = timeLong;\r
+                                       if (gpxStartTime > gpxTime) {\r
+                                            gpxStartTime = gpxTime;\r
+                                       }\r
+                                       if (gpxEndTime < gpxTime) {\r
+                                            gpxEndTime = gpxTime;\r
+                                       }\r
+                               }\r
+                                \r
+                               System.out.println("GPX start time: "+ dfjp.format(new Date(gpxStartTime)) + "\t[GMT " + dfuk.format(new Date(gpxStartTime))+"]");\r
+                               System.out.println("  GPX end time: "+ dfjp.format(new Date(gpxEndTime)) + "\t[GMT " + dfuk.format(new Date(gpxEndTime))+"]");\r
+                               System.out.println("------------|--------------------|--------------------|------------|------------|--------|------|");\r
+                               System.out.println(" name       | UpdateTime         | GPStime            | Latitude   | Longitude  | ele    |magvar|");\r
+                               System.out.println("------------|--------------------|--------------------|------------|------------|--------|------|");\r
+                               proc(imgDir, delta, gpxStartTime, gpxEndTime, map, exif, gpx);\r
+                               System.out.println("------------|--------------------|--------------------|------------|------------|--------|------|");\r
 \r
                 // 出力\r
-                if (change) {\r
-                    DOMSource source = new DOMSource(gpx);\r
-                    FileOutputStream os = new FileOutputStream(outputFile);\r
-                    StreamResult result = new StreamResult(os);\r
-                    TransformerFactory transFactory = TransformerFactory.newInstance();\r
-                    Transformer transformer = transFactory.newTransformer();\r
-                    transformer.setOutputProperty(OutputKeys.INDENT, "yes");\r
-                    transformer.setOutputProperty(OutputKeys.METHOD, "xml");\r
-                    transformer.transform(source, result);         \r
-                    if (exif) {\r
-                        outputFile = new File(outDir, iStr +"_.gpx");\r
-                        os = new FileOutputStream(outputFile);\r
-                        result = new StreamResult(os);\r
-                        transformer.transform(source, result);\r
-                    }\r
+                DOMSource source = new DOMSource(gpx);\r
+                FileOutputStream os = new FileOutputStream(outputFile);\r
+                StreamResult result = new StreamResult(os);\r
+                TransformerFactory transFactory = TransformerFactory.newInstance();\r
+                Transformer transformer = transFactory.newTransformer();\r
+                transformer.setOutputProperty(OutputKeys.INDENT, "yes");\r
+                transformer.setOutputProperty(OutputKeys.METHOD, "xml");\r
+                transformer.transform(source, result);         \r
+                if (exif) {\r
+                    outputFile = new File(outDir, iStr +"_.gpx");\r
+                    os = new FileOutputStream(outputFile);\r
+                    result = new StreamResult(os);\r
+                    transformer.transform(source, result);\r
                 }\r
             }\r
         }\r
@@ -341,7 +382,7 @@ public class ImportPicture extends Thread {
         DecimalFormat dayFormatter = new DecimalFormat("00");\r
 \r
         boolean ret = false;\r
-        File[] files = dir.listFiles();\r
+        File[] files = dir.listFiles(new JpegFileFilter());\r
         Arrays.sort(files, new FileSort());\r
         for (File image : files) {\r
             System.out.print(String.format("%12s|", image.getName()));\r
@@ -530,44 +571,34 @@ public class ImportPicture extends Thread {
     /**\r
      * XMLエレメント<trkpt>をTIMEでキー付したHashMapを生成する<br>\r
      * \r
-     *         <trk><trkseg><trkpt><time>2014-01-01T00:59:09Z</time></trkpt></trkseg></trk\r
+     *         <trkseg><trkpt><time>2014-01-01T00:59:09Z</time></trkpt></trkseg\r
      * \r
      * @param trk\r
      * @param map\r
      * @throws ParseException\r
      */\r
-    public void trkptMap(Element trk, TreeMap<Long,Element> map) throws ParseException {\r
+    public void trkptMap(Element trkseg, TreeMap<Long,Element> map) throws ParseException {\r
         dfuk.setTimeZone(TimeZone.getTimeZone("GMT"));\r
 \r
-        NodeList nodes1 = trk.getChildNodes();\r
-        for (int i1=0; i1 < nodes1.getLength(); i1++) {\r
-            Node node2 = nodes1.item(i1);\r
-            if (node2.getNodeName().equals("trkseg")) {\r
-                Element trkseg = (Element) node2;\r
-                NodeList nodes2 = trkseg.getChildNodes();\r
-                for (int i2=0; i2 < nodes2.getLength(); i2++) {\r
-                    Node node3 = nodes2.item(i2);\r
-                    if (node3.getNodeName().equals("trkpt")) {\r
-                        Element trkpt = (Element) node3;\r
-\r
-                        NodeList nodes3 = trkpt.getChildNodes();\r
-                        for (int i3=0; i3 < nodes3.getLength(); i3++) {\r
-                               if (param_GpxNoFirstNode && (i3 == 0)) {\r
-                                       continue;\r
-                               }\r
-                            Node node4 = nodes3.item(i3);\r
-                            if (node4.getNodeName().equals("time")) {\r
-                                Element time = (Element) node4;\r
-                                NodeList nodes4 = time.getChildNodes();      // 子ノードを取得\r
-                                for (int i4=0; i4< nodes4.getLength(); i4++) {\r
-                                    Node node5 = nodes4.item(i4);\r
-                                    if (node5 != null) {\r
-                                        if (node5.getNodeType() == Node.TEXT_NODE) {\r
-                                            String timeStr = node5.getNodeValue();\r
-                                            long t = dfuk.parse(timeStr).getTime();\r
-                                            map.put(t, getCopy(trk.getOwnerDocument(), trkpt));\r
-                                        }\r
-                                    }\r
+        NodeList nodes2 = trkseg.getChildNodes();\r
+        for (int i2=0; i2 < nodes2.getLength(); i2++) {\r
+            Node node3 = nodes2.item(i2);\r
+            if (node3.getNodeName().equals("trkpt")) {\r
+                Element trkpt = (Element) node3;\r
+\r
+                NodeList nodes3 = trkpt.getChildNodes();\r
+                for (int i3=0; i3 < nodes3.getLength(); i3++) {\r
+                    Node node4 = nodes3.item(i3);\r
+                    if (node4.getNodeName().equals("time")) {\r
+                        Element time = (Element) node4;\r
+                        NodeList nodes4 = time.getChildNodes();      // 子ノードを取得\r
+                        for (int i4=0; i4< nodes4.getLength(); i4++) {\r
+                            Node node5 = nodes4.item(i4);\r
+                            if (node5 != null) {\r
+                                if (node5.getNodeType() == Node.TEXT_NODE) {\r
+                                    String timeStr = node5.getNodeValue();\r
+                                    long t = dfuk.parse(timeStr).getTime();\r
+                                    map.put(t, getCopy(trkseg.getOwnerDocument(), trkpt));\r
                                 }\r
                             }\r
                         }\r
@@ -865,4 +896,16 @@ public class ImportPicture extends Thread {
         }\r
     }\r
 \r
+    /**\r
+     * JPEGファイルフィルター\r
+     * @author yuu\r
+     */\r
+       class JpegFileFilter implements FilenameFilter{\r
+       public boolean accept(File dir, String name) {\r
+                       if (name.matches(".*\\.JPG$")) {\r
+                               return true;\r
+                       }\r
+                       return false;\r
+       }\r
+       }\r
 }
\ No newline at end of file
index 8ea7ccd..eb4f55f 100644 (file)
@@ -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();
                        }
         });
index 31369c4..517df40 100644 (file)
@@ -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);