OSDN Git Service

ElementMapTRKSEG.parse(File) を追加
[importpicture/importpicture.git] / importPicture / src / osm / jp / gpx / ImportPicture.java
index 24a5a44..428006d 100644 (file)
@@ -1,4 +1,5 @@
 package osm.jp.gpx;\r
+\r
 import java.io.*;\r
 import java.nio.channels.FileChannel;\r
 import java.text.DecimalFormat;\r
@@ -10,12 +11,8 @@ import java.util.Calendar;
 import java.util.Comparator;\r
 import java.util.Date;\r
 import java.util.GregorianCalendar;\r
-import java.util.Iterator;\r
 import java.util.Map;\r
-import java.util.Map.Entry;\r
-import java.util.Set;\r
 import java.util.TimeZone;\r
-import java.util.TreeMap;\r
 import java.util.logging.LogManager;\r
 import java.util.logging.Logger;\r
 \r
@@ -97,8 +94,13 @@ public class ImportPicture extends Thread {
      * ・精確な時刻との時差を入力することで、撮影日時を補正します。\r
      * ・画像ファイルの更新日付リストをCSV形式のファイルとして出力する。\r
      * ・・結果は、取り込み元のGPXファイルとは別に、元ファイル名にアンダーバー「_」を付加した.ファイルに出力します。\r
+     * \r
+     *  exp) $ java -cp .:AdjustTime.jar:commons-imaging-1.0-SNAPSHOT.jar [AdjustTime.ini]\r
+     *  exp) > java -cp .;AdjustTime.jar;commons-imaging-1.0-SNAPSHOT.jar [AdjustTime.ini]\r
      *\r
      * @param argv\r
+     * argv[0] = INIファイルのパス名\r
+     * \r
      * argv[-] = dummy\r
      * argv[0] = 画像ファイルが格納されているディレクトリ          --> imgDir\r
      * argv[1] = 時刻補正の基準とする画像ファイル                              --> baseFile\r
@@ -111,31 +113,23 @@ public class ImportPicture extends Thread {
      */\r
     public static void main(String[] argv) throws Exception\r
     {\r
-        Date jptime;\r
+        Date imgtime;\r
 \r
+       String paramFilePath = ((argv.length < 1) ? AppParameters.FILE_PATH : argv[0]);\r
+        System.out.println("Param File = '"+ paramFilePath +"'");\r
         ImportPicture obj = new ImportPicture();\r
-        obj.ex = null;\r
-\r
-        if (argv.length > 0) {\r
-            obj.imgDir = new File(argv[0]);\r
-        }\r
-\r
-        if (argv.length < 4) {\r
-            System.out.println("!!! Illigal command call. !!!");\r
-            System.out.println("> java -cp .:AdjustTime.jar:commons-imaging-1.0-SNAPSHOT.jar <targetDir> <time base image> <time> {EXIF/not} (gpx)");\r
-            System.out.println("> java -cp .:AdjustTime.jar:commons-imaging-1.0-SNAPSHOT.jar. IMG_01234.JPG 2012-06-15T12:52:22 EXIF");\r
-            System.out.println("> java -cp .:AdjustTime.jar . IMG_01234.JPG 2012-06-15T12:52:22 not");\r
-            System.out.println();\r
-            return;\r
-        }\r
+        obj.params = new AppParameters(paramFilePath);\r
 \r
-        obj.params = new AppParameters();\r
+        obj.ex = null;\r
+        // argv[0] --> AppParameters.IMG_SOURCE_FOLDER に置き換え\r
+        obj.imgDir = new File(obj.params.getProperty(AppParameters.IMG_SOURCE_FOLDER));\r
 \r
         // 基準時刻(ファイル更新日時 | EXIF撮影日時)\r
        obj.exifBase = (obj.params.getProperty(AppParameters.GPX_BASETIME).equals("EXIF_TIME") ? true : false);\r
 \r
         // 基準時刻ファイルの「更新日時」を使って時刻合わせを行う。\r
-        File baseFile = new File(obj.imgDir, argv[1]);\r
+        // argv[1] --> AppParameters.IMG_BASE_FILE に置き換え\r
+        File baseFile = new File(obj.imgDir, obj.params.getProperty(AppParameters.IMG_BASE_FILE));\r
         if (obj.exifBase) {\r
             ImageMetadata meta = Imaging.getMetadata(baseFile);\r
             JpegImageMetadata jpegMetadata = (JpegImageMetadata)meta;\r
@@ -150,25 +144,15 @@ public class ImportPicture extends Thread {
             }\r
                String dateTimeOriginal = exif.getFieldValue(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL)[0];\r
                long lastModifyTime = (new SimpleDateFormat("yyyy:MM:dd HH:mm:ss")).parse(dateTimeOriginal).getTime();\r
-               jptime = new Date(lastModifyTime);\r
+               imgtime = new Date(lastModifyTime);\r
         }\r
         else {\r
-            jptime = new Date(baseFile.lastModified());\r
-        }\r
-\r
-        String timeStr = argv[2];\r
-        try {\r
-            dfjp.setTimeZone(TimeZone.getTimeZone("JST"));\r
-            Date t = dfjp.parse(timeStr);\r
-            obj.delta = t.getTime() - jptime.getTime();\r
-        }\r
-        catch (ParseException e) {\r
-            System.out.println("'"+ timeStr +"' の書式が違います("+ TIME_FORMAT_STRING +")");\r
-            return;\r
+            imgtime = new Date(baseFile.lastModified());\r
         }\r
 \r
         // 出力ファイル\r
-        obj.outDir = new File(argv[3]);\r
+        // argv[3] --> AppParameters.IMG_OUTPUT に置き換え\r
+        obj.outDir = new File(obj.params.getProperty(AppParameters.IMG_OUTPUT_FOLDER));\r
 \r
         // その他のパラメータを読み取る\r
        String paramStr = obj.params.getProperty(AppParameters.GPX_GPXSPLIT);\r
@@ -178,7 +162,7 @@ public class ImportPicture extends Thread {
         \r
        paramStr = obj.params.getProperty(AppParameters.GPX_NO_FIRST_NODE);\r
        if ((paramStr != null) && (paramStr.equals(Boolean.toString(true)))) {\r
-               obj.param_GpxNoFirstNode = true;\r
+               ImportPicture.param_GpxNoFirstNode = true;\r
        }\r
        \r
        paramStr = obj.params.getProperty(AppParameters.GPX_REUSE);\r
@@ -263,8 +247,9 @@ public class ImportPicture extends Thread {
         System.out.println(" - param: gpxDir = '"+ (obj.gpxDir == null ? "" : obj.gpxDir.getAbsolutePath()) +"'");\r
         System.out.println(" - param: number of gpxFiles = '"+ obj.gpxFiles.size() +"'");\r
         System.out.println(" - param: "+ AppParameters.GPX_GPXSPLIT +"="+ obj.param_GpxSplit);\r
-        System.out.println(" - param: "+ AppParameters.GPX_NO_FIRST_NODE +"="+ obj.param_GpxNoFirstNode);        \r
+        System.out.println(" - param: "+ AppParameters.GPX_NO_FIRST_NODE +"="+ ImportPicture.param_GpxNoFirstNode);        \r
         System.out.println(" - param: "+ AppParameters.GPX_REUSE +"="+ obj.param_GpxReuse);\r
+        System.out.println(" - param: "+ AppParameters.IMG_TIME +"="+ obj.params.getProperty(AppParameters.IMG_TIME) );\r
         System.out.println(" - param: "+ AppParameters.IMG_BASE_FILE +"="+ obj.params.getProperty(AppParameters.IMG_BASE_FILE) );\r
         System.out.println(" - param: "+ AppParameters.GPX_BASETIME +"="+ obj.params.getProperty(AppParameters.GPX_BASETIME) );\r
         System.out.println(" - param: "+ AppParameters.IMG_OUTPUT +"="+ obj.params.getProperty(AppParameters.IMG_OUTPUT));     \r
@@ -274,6 +259,18 @@ public class ImportPicture extends Thread {
         System.out.println(" - param: "+ AppParameters.GPX_OUTPUT_WPT +"="+ obj.param_GpxOutputWpt);\r
         System.out.println(" - param: "+ AppParameters.GPX_OVERWRITE_MAGVAR +"="+ Complementation.param_GpxOverwriteMagvar);\r
         System.out.println(" - param: "+ AppParameters.GPX_OUTPUT_SPEED +"="+ Complementation.param_GpxOutputSpeed);\r
+\r
+        String timeStr = obj.params.getProperty(AppParameters.IMG_TIME);\r
+        try {\r
+            //dfjp.setTimeZone(TimeZone.getTimeZone("JST"));\r
+            Date t = dfuk.parse(timeStr);\r
+            obj.delta = t.getTime() - imgtime.getTime();\r
+        }\r
+        catch (ParseException e) {\r
+            System.out.println("'"+ timeStr +"' の書式が違います("+ TIME_FORMAT_STRING +")");\r
+            return;\r
+        }\r
+\r
         obj.start();\r
         try {\r
             obj.join();\r
@@ -292,10 +289,8 @@ public class ImportPicture extends Thread {
     public ArrayList<File> gpxFiles = new ArrayList<>();\r
     public AppParameters params;\r
        public boolean param_GpxSplit = false;\r
-       public boolean param_GpxNoFirstNode = false;\r
+       public static boolean param_GpxNoFirstNode = false;\r
        public boolean param_GpxReuse = false;\r
-       //public boolean Complementation.param_GpxOutputSpeed = false;\r
-       //public boolean Complementation.param_GpxOverwriteMagvar = false;\r
        public boolean param_GpxOutputWpt = true;\r
        public boolean param_ImgOutputAll = false;\r
        public String param_GpxSourceFolder = ".";\r
@@ -348,7 +343,6 @@ public class ImportPicture extends Thread {
     void procGPXfile(File gpxFile) throws ParserConfigurationException, SAXException, IOException, ParseException, ImageReadException, ImageWriteException, TransformerException {\r
         DocumentBuilderFactory factory;\r
         DocumentBuilder        builder;\r
-        Node gpx;\r
 \r
         String fileName = gpxFile.getName();\r
         String iStr = fileName.substring(0, fileName.length() - 4);\r
@@ -366,98 +360,21 @@ public class ImportPicture extends Thread {
         factory.setIgnoringComments(true);\r
         factory.setValidating(true);\r
 \r
+        // GPXファイルをパースする\r
+        ElementMapTRKSEG mapTRKSEG = new ElementMapTRKSEG();\r
+        document = mapTRKSEG.parse(gpxFile);\r
+        \r
+        // パースされた mapTRKSEG の中身を出力する\r
+        mapTRKSEG.printinfo();\r
+        \r
         // GPX file --> Node root\r
-        DOMImplementation domImpl = builder.getDOMImplementation();\r
-        document = domImpl.createDocument("", "gpx", null);\r
-\r
-        /*\r
-         * <gpx>\r
-         *   <trk>\r
-         *     <name><![CDATA[Tracked with OSMTracker for Android?]]></name>\r
-         *     <cmt><![CDATA[警告: HDOP values aren't the HDOP as returned by the GPS device. They're approximated from the location accuracy in meters.]]></cmt>\r
-         *     <trkseg>\r
-         *       <trkpt lat="35.32123832" lon="139.56965631">\r
-         *         <ele>47.20000076293945</ele>\r
-         *         <time>2012-06-15T03:00:29Z</time>\r
-         *         <hdop>0.5</hdop>\r
-         *       </trkpt>\r
-         *     </trkseg>\r
-         *   </trk>\r
-         *   <wpt lat="35.2564461" lon="139.15437809"></wpt>\r
-         * </gpx>\r
-         */\r
-        TreeMap<Long,ElementMapTRKPT> mapTRKSEG = new TreeMap<Long, ElementMapTRKPT>();\r
-        Element trk = null;\r
-        gpx    = builder.parse(gpxFile).getFirstChild();\r
-        document = 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
-                \r
-                NodeList nodes1 = trk.getChildNodes();\r
-                for (int i1=0; i1 < nodes1.getLength(); i1++) {\r
-                    Node nodeTRKSEG = nodes1.item(i1);\r
-                    if (nodeTRKSEG.getNodeName().equals("trkseg")) {\r
-                       //Element newTRKSEG = document.createElement("trkseg");\r
-                        NodeList nodes2 = nodeTRKSEG.getChildNodes();\r
-                        \r
-                        ElementMapTRKPT mapTRKPT = new ElementMapTRKPT();\r
-                               Date trksegStartTime = new Date();                              // 対象とする開始時刻(現在時刻)\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
-                                Date time = mapTRKPT.put(getCopy(document, nodeTRKPT));\r
-                                       if (trksegStartTime.compareTo(time) < 0) {\r
-                                               trksegStartTime = time;\r
-                                       }\r
-                            }\r
-                        }\r
-\r
-                        // <trk>から<trkseg>を削除する。\r
-                        //trk.removeChild(nodeTRKSEG);\r
-\r
-                        // <trk>に、新たな<trkseg>を追加する。\r
-                        //trk.appendChild(newTRKSEG);\r
+        Node gpx = builder.parse(gpxFile).getFirstChild();\r
 \r
-                       System.out.println("\tdebug: mapTRKSEG.put(k=" + dfjp.format(trksegStartTime) +", mapTRKPT)");\r
-                        mapTRKSEG.put(trksegStartTime.getTime(), mapTRKPT);\r
-                        //newTRKSEG = null;\r
-                    }\r
-                }\r
-            }\r
-        }\r
-        \r
-        // mapTRKSEGに時間順に格納された<trkseg>を順次ひとつづつ処理する\r
+        // imgDir内の画像ファイルを処理する\r
                System.out.println("|--------------------------------|--------------------|--------------------|--------------|--------------|--------|------|------|");\r
-               System.out.println("| name                           | UpdateTime         | GPStime            |   Latitude   |   Longitude  | ele    |magvar| km/h |");\r
+               System.out.println("| name                           | Camera Time        | GPStime            |   Latitude   |   Longitude  | ele    |magvar| km/h |");\r
                System.out.println("|--------------------------------|--------------------|--------------------|--------------|--------------|--------|------|------|");\r
                proc(imgDir, delta, mapTRKSEG, exif, gpx);\r
-        for (Map.Entry<Long, ElementMapTRKPT> mapEntry : mapTRKSEG.entrySet()) {\r
-               System.out.println("\tdebug: k=" + dfjp.format(new Date(mapEntry.getKey().longValue())));\r
-               \r
-               ElementMapTRKPT mapPT = mapEntry.getValue();\r
-            \r
-            // <trkseg>の開始時刻と終了時刻を求める\r
-               long segStartTimeL = new Date().getTime();              // <trkseg>の開始時刻\r
-               long segEndTimeL = 0L;                                                  // 対象とする終了時刻\r
-               for (Entry<Date, Element> entryPT : mapPT.entrySet()) {\r
-                       Date key = entryPT.getKey();\r
-                       if (segStartTimeL > key.getTime()) {\r
-                            segStartTimeL = key.getTime();\r
-                       }\r
-                       if (segEndTimeL < key.getTime()) {\r
-                            segEndTimeL = key.getTime();\r
-                       }\r
-               }\r
-               \r
-               System.out.println("|------<trkpt>-------------------|"+ dfjp.format(new Date(segStartTimeL)) + "-->"+ dfjp.format(new Date(segEndTimeL)) +"|");\r
-               //proc(imgDir, delta, segStartTimeL, segEndTimeL, mapPT, exif, gpx);\r
-        }\r
                System.out.println("|--------------------------------|--------------------|--------------------|--------------|--------------|--------|------|------|");\r
 \r
         // 出力\r
@@ -484,7 +401,7 @@ public class ImportPicture extends Thread {
      * @throws ImageReadException \r
      * @throws ImageWriteException \r
      */\r
-    boolean proc(File dir, long delta, TreeMap<Long,ElementMapTRKPT> mapTRKSEG, boolean exifWrite, Node gpx) throws ParseException, ImageReadException, IOException, ImageWriteException {\r
+    boolean proc(File dir, long delta, ElementMapTRKSEG mapTRKSEG, boolean exifWrite, Node gpx) throws ParseException, ImageReadException, IOException, ImageWriteException {\r
         DecimalFormat yearFormatter = new DecimalFormat("0000");\r
         DecimalFormat monthFormatter = new DecimalFormat("00");\r
         DecimalFormat dayFormatter = new DecimalFormat("00");\r
@@ -524,31 +441,30 @@ public class ImportPicture extends Thread {
                long lastModifyTime = (new SimpleDateFormat("yyyy:MM:dd HH:mm:ss")).parse(dateTimeOriginal).getTime();\r
                itime = new Date(lastModifyTime);\r
             }\r
-            System.out.print(String.format("%20s ", dfjp.format(itime)));\r
+            System.out.print(String.format("%20s|", dfuk.format(itime)));\r
 \r
             // uktime <-- 画像撮影時刻に対応するGPX時刻(補正日時)\r
             Date uktime = new Date(itime.getTime() + delta);\r
-            System.out.print(String.format("%20s|", dfjp.format(uktime)));\r
-\r
-            /*\r
-            if ((uktime.getTime() < gpxStartTime) || (uktime.getTime() > gpxEndTime)) {\r
-                System.out.println(String.format("%20s ", "out of time."));\r
-                if (!this.param_ImgOutputAll) {\r
-                       continue;\r
-                }\r
-            }\r
-            */\r
+            System.out.print(String.format("%20s|", dfuk.format(uktime)));\r
 \r
                // 時刻uktimeにおける<magver>をtrkptに追加する\r
-            Element trkptE = mapTRKPT.get(uktime);\r
             String eleStr = "-";\r
             String magvarStr = "-";\r
             String speedStr = "-";\r
             double latitude = 90.5D;\r
             double longitude = 180.5D;\r
+            Element trkptE = null;\r
             TagTrkpt trkptT = null;\r
+\r
+            for (Map.Entry<Date,ElementMapTRKPT> map : mapTRKSEG.entrySet()) {\r
+               ElementMapTRKPT mapTRKPT = map.getValue();\r
+                trkptE = mapTRKPT.getValue(uktime);\r
+                if (trkptE != null) {\r
+                    break;\r
+                }\r
+            }\r
             if (trkptE == null) {\r
-                System.out.println(String.format("%20s ", "Out of GPX logging time."));\r
+                System.out.println(String.format("%-52s|", "  Out of GPX logging time."));\r
                 if (!this.param_ImgOutputAll) {\r
                        continue;\r
                 }\r
@@ -726,72 +642,10 @@ public class ImportPicture extends Thread {
      * 2012-06-10T05:09:46Z  (日本時間の'2012-06-10T14:09:46')\r
      */\r
     public static final String TIME_FORMAT_STRING = "yyyy-MM-dd'T'HH:mm:ss";\r
-    public static SimpleDateFormat dfjp = new SimpleDateFormat(TIME_FORMAT_STRING);\r
+    public static SimpleDateFormat dfjp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");\r
     public static SimpleDateFormat dfuk = new SimpleDateFormat(TIME_FORMAT_STRING +"'Z'");\r
 \r
     /**\r
-     * XMLエレメント<trkpt>をTIMEでキー付したHashMapを生成する<br>\r
-     * \r
-     * <trkseg>\r
-     *         <trkpt lat="34.976635" lon="138.466228">\r
-     *                 <ele>267.291</ele>\r
-     *                 <magvar>359</magvar>\r
-     *                 <speed></speed>\r
-     *                 <time>2016-07-02T08:25:18Z</time>\r
-     *         </trkpt>\r
-     * </trkseg>\r
-     * @return gpxStartTimeL : long 格納したエレメント<trkpt>の最小時刻(startTime)をかえす。呼び出し元はこの値を使ってエレメント<trkpt>を時系列にソートする\r
-     * @param trk      \r
-     * @param map\r
-     * @throws ParseException\r
-     */\r
-    /*\r
-    public long trkptMap(Element trkseg, TreeMap<Long,Element> map) throws ParseException {\r
-        dfuk.setTimeZone(TimeZone.getTimeZone("GMT"));\r
-               long gpxStartTimeL = (new Date()).getTime();            // 対象とする開始時刻(現在時刻)\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 timeL = dfuk.parse(timeStr).getTime();\r
-                                               long gpxTime = timeL;\r
-                                               if (gpxStartTimeL > gpxTime) {\r
-                                                       gpxStartTimeL = gpxTime;\r
-                                               }\r
-                                    map.put(timeL, getCopy(trkseg.getOwnerDocument(), trkpt));\r
-                                }\r
-                            }\r
-                        }\r
-                    }\r
-                }\r
-            }\r
-        }\r
-               return gpxStartTimeL;\r
-    }\r
-    */\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-    \r
-    /**\r
      * 対象は '*.JPG' のみ対象とする\r
      * @return \r
      * @param name\r