OSDN Git Service

「ソースGPXのMAGVARを無視する」
[importpicture/importpicture.git] / importPicture / src / osm / jp / gpx / ImportPicture.java
index 96da752..f37aa2d 100644 (file)
@@ -92,11 +92,11 @@ public class ImportPicture extends Thread {
      *\r
      * @param argv\r
      * argv[-] = dummy\r
-     * argv[0] = 画像ファイルが格納されているディレクトリ\r
-     * argv[1] = 時刻補正の基準とする画像ファイル\r
-     * argv[2] = 基準画像ファイルの精確な撮影日時 "yyyy-MM-dd'T'HH:mm:ss"\r
-     * argv[3] = [noEXIF] EXIF情報の書き換えを行わない / EXIF情報の書き換えを行う(出力先フォルダ)\r
-     * argv[4] = 撮影位置をロギングしたGPXファイル\r
+     * argv[0] = 画像ファイルが格納されているディレクトリ          --> imgDir\r
+     * argv[1] = 時刻補正の基準とする画像ファイル                              --> baseFile\r
+     * argv[2] = 基準画像ファイルの精確な撮影日時 "yyyy-MM-dd'T'HH:mm:ss"      --> timeStr\r
+     * argv[3] = 出力先フォルダ                                                         --> outDir\r
+     * argv[4] = 撮影位置をロギングしたGPXファイル                              --> gpxDir\r
      * \r
      * @throws IOException\r
      * @throws ImageReadException \r
@@ -120,9 +120,33 @@ public class ImportPicture extends Thread {
             return;\r
         }\r
 \r
+        obj.params = new AppParameters();\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
-        jptime = new Date(baseFile.lastModified());\r
+        if (obj.exifBase) {\r
+            ImageMetadata meta = Imaging.getMetadata(baseFile);\r
+            JpegImageMetadata jpegMetadata = (JpegImageMetadata)meta;\r
+            if (jpegMetadata == null) {\r
+                System.out.println("'"+ baseFile.getAbsolutePath() +"' にEXIF情報がありません");\r
+                return;\r
+            }\r
+            TiffImageMetadata exif = jpegMetadata.getExif();\r
+            if (exif == null) {\r
+                System.out.println("'"+ baseFile.getAbsolutePath() +"' にEXIF情報がありません");\r
+                return;\r
+            }\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
+        }\r
+        else {\r
+            jptime = new Date(baseFile.lastModified());\r
+        }\r
+\r
         String timeStr = argv[2];\r
         try {\r
             dfjp.setTimeZone(TimeZone.getTimeZone("JST"));\r
@@ -131,36 +155,44 @@ public class ImportPicture extends Thread {
         }\r
         catch (ParseException e) {\r
             System.out.println("'"+ timeStr +"' の書式が違います("+ TIME_FORMAT_STRING +")");\r
+            return;\r
         }\r
 \r
-        // \r
-        if (argv[3].toUpperCase().equals("NOEXIF")) {\r
-            obj.exif = false;\r
-            obj.outDir = null;\r
-        }\r
-        else {\r
-            obj.exif = true;\r
-            obj.outDir = new File(argv[3]);\r
-        }\r
+        // 出力ファイル\r
+        obj.outDir = new File(argv[3]);\r
 \r
         // その他のパラメータを読み取る\r
-        obj.params = new AppParameters();\r
        String paramStr = obj.params.getProperty(AppParameters.GPX_GPXSPLIT);\r
-       if ((paramStr != null) && (paramStr.toUpperCase().equals("ON"))) {\r
+       if ((paramStr != null) && (paramStr.equals(Boolean.toString(true)))) {\r
                obj.param_GpxSplit = true;\r
        }\r
         \r
        paramStr = obj.params.getProperty(AppParameters.GPX_NO_FIRST_NODE);\r
-       if ((paramStr != null) && (paramStr.toUpperCase().equals("ON"))) {\r
+       if ((paramStr != null) && (paramStr.equals(Boolean.toString(true)))) {\r
                obj.param_GpxNoFirstNode = true;\r
        }\r
        \r
        paramStr = obj.params.getProperty(AppParameters.GPX_REUSE);\r
-       if ((paramStr != null) && (paramStr.toUpperCase().equals("ON"))) {\r
+       if ((paramStr != null) && (paramStr.equals(Boolean.toString(true)))) {\r
                obj.param_GpxReuse = true;\r
        }\r
         \r
-        // 第6引数が指定されなければ、指定されたディレクトリ内のGPXファイルすべてを対象とする\r
+       paramStr = obj.params.getProperty(AppParameters.GPX_OUTPUT_WPT);\r
+       if ((paramStr != null) && (paramStr.equals(Boolean.toString(true)))) {\r
+               obj.param_GpxOutputWpt = true;\r
+       }\r
+       \r
+       paramStr = obj.params.getProperty(AppParameters.GPX_OVERWRITE_MAGVAR);\r
+       if ((paramStr != null) && (paramStr.equals(Boolean.toString(true)))) {\r
+               obj.param_GpxOverwriteMagvar = true;\r
+       }\r
+\r
+       paramStr = obj.params.getProperty(AppParameters.GPX_OUTPUT_SPEED);\r
+       if ((paramStr != null) && (paramStr.equals(Boolean.toString(true)))) {\r
+               obj.param_GpxOutputSpeed = true;\r
+       }\r
+\r
+       // 第6引数が指定されなければ、指定されたディレクトリ内のGPXファイルすべてを対象とする\r
         if (argv.length >= 5) {\r
             obj.gpxDir = new File(argv[4]);\r
             if (!obj.gpxDir.exists()) {\r
@@ -191,18 +223,22 @@ public class ImportPicture extends Thread {
             }\r
         }\r
         else {\r
-            obj.gpxFiles.add(obj.gpxDir);            \r
+            obj.gpxFiles.add(obj.gpxDir);\r
         }\r
         \r
-       \r
-        System.out.println(" - param: number of gpxFiles = '"+ obj.gpxFiles.size() +"'");\r
         System.out.println(" - param: imgDir = '"+ obj.imgDir.getAbsolutePath() +"'");\r
         System.out.println(" - param: outDir = '"+ (obj.outDir == null ? "" : obj.outDir.getAbsolutePath()) +"'");\r
+        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_REUSE +"="+ obj.param_GpxReuse);        \r
         System.out.println(" - param: "+ AppParameters.GPX_BASETIME +"="+ obj.params.getProperty(AppParameters.GPX_BASETIME) );\r
-        \r
+        System.out.println(" - param: "+ AppParameters.IMG_OUTPUT +"="+ obj.params.getProperty(AppParameters.IMG_OUTPUT));     \r
+        System.out.println(" - param: "+ AppParameters.IMG_OUTPUT_EXIF +"= '"+ String.valueOf(obj.exif) +"'");\r
+        System.out.println(" - param: "+ AppParameters.GPX_OUTPUT_WPT +"="+ obj.param_GpxOutputWpt);\r
+        System.out.println(" - param: "+ AppParameters.GPX_OVERWRITE_MAGVAR +"="+ obj.param_GpxOverwriteMagvar);\r
+        System.out.println(" - param: "+ AppParameters.GPX_OUTPUT_SPEED +"="+ obj.param_GpxOutputSpeed);\r
         obj.start();\r
         try {\r
             obj.join();                            \r
@@ -214,11 +250,15 @@ public class ImportPicture extends Thread {
     public File outDir;\r
     public long delta = 0;\r
     public boolean exif = false;\r
+    public boolean exifBase = false;\r
     public ArrayList<File> gpxFiles = new ArrayList<>();\r
     public AppParameters params;\r
        public boolean param_GpxSplit = false;\r
        public boolean param_GpxNoFirstNode = false;\r
        public boolean param_GpxReuse = false;\r
+       public boolean param_GpxOutputSpeed = false;\r
+       public boolean param_GpxOverwriteMagvar = false;\r
+       public boolean param_GpxOutputWpt = true;\r
        \r
     @Override\r
     public void run() {\r
@@ -241,14 +281,18 @@ public class ImportPicture extends Thread {
         Node gpx;\r
 \r
         try {\r
-               \r
-            outDir = new File(outDir, imgDir.getName());\r
+               if (params.getProperty(AppParameters.IMG_OUTPUT).equals(Boolean.toString(true))) {\r
+                outDir = new File(outDir, imgDir.getName());\r
+               }\r
+               else {\r
+                outDir = gpxDir;\r
+               }\r
 \r
             for (File gpxFile : this.gpxFiles) {\r
                 String fileName = gpxFile.getName();\r
                 String iStr = fileName.substring(0, fileName.length() - 4);\r
 \r
-                File outputFile = new File(imgDir, iStr +"_.gpx");\r
+                File outputFile = new File(outDir, iStr +"_.gpx");\r
                 System.out.println(gpxFile.getAbsolutePath() + " => "+ outputFile.getAbsolutePath());\r
                 System.out.println("           時差: "+ (delta / 1000) +"(sec)");\r
                 System.out.println("    Target GPX: ["+ gpxFile.getAbsolutePath() +"]");\r
@@ -405,6 +449,23 @@ public class ImportPicture extends Thread {
             }\r
             \r
             Date itime = new Date(image.lastModified());\r
+            if (this.exifBase) {\r
+                ImageMetadata meta = Imaging.getMetadata(image);\r
+                JpegImageMetadata jpegMetadata = (JpegImageMetadata)meta;\r
+                if (jpegMetadata == null) {\r
+                    System.out.println("'"+ image.getAbsolutePath() +"' にEXIF情報がありません");\r
+                    continue;\r
+                }\r
+                TiffImageMetadata exif = jpegMetadata.getExif();\r
+                if (exif == null) {\r
+                    System.out.println("'"+ image.getAbsolutePath() +"' にEXIF情報がありません");\r
+                    continue;\r
+                }\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
+               itime = new Date(lastModifyTime);\r
+            }\r
+\r
             Date uktime = new Date(itime.getTime() + delta);\r
             System.out.print(String.format("%20s ", dfjp.format(itime)));\r
             System.out.print(String.format("%20s|", dfjp.format(uktime)));\r
@@ -560,8 +621,10 @@ public class ImportPicture extends Thread {
                 }\r
             }\r
 \r
-            Element temp = getCopy(gpx.getOwnerDocument(), wpt);\r
-            gpx.appendChild(temp);\r
+            if (Boolean.parseBoolean(params.getProperty(AppParameters.GPX_OUTPUT_WPT))) {\r
+                Element temp = getCopy(gpx.getOwnerDocument(), wpt);\r
+                gpx.appendChild(temp);\r
+            }\r
         }\r
         return ret;\r
     }\r
@@ -625,7 +688,7 @@ public class ImportPicture extends Thread {
      * @param jptime   画像ファイルの撮影日時 ミリ秒(日本時間)\r
      * @throws ParseException\r
      */\r
-    public static Element trkpt(TreeMap<Long,Element> map, Date jptime) throws ParseException {\r
+    public Element trkpt(TreeMap<Long,Element> map, Date jptime) throws ParseException {\r
         Double R = 20000000 / Math.PI;\r
         long sa = 2L * 3600000L;\r
         long jpt = jptime.getTime();\r
@@ -652,7 +715,7 @@ public class ImportPicture extends Thread {
                         break;\r
                     }\r
                 }\r
-                if (magvar == null) {\r
+                if ((magvar == null) || param_GpxOverwriteMagvar) {\r
                     if (mae != null) {\r
                         Double maeLAT = null;\r
                         Double maeLON = null;\r
@@ -909,7 +972,7 @@ public class ImportPicture extends Thread {
      */\r
        class JpegFileFilter implements FilenameFilter{\r
        public boolean accept(File dir, String name) {\r
-                       if (name.matches(".*\\.JPG$")) {\r
+                       if (name.toUpperCase().matches(".*\\.JPG$")) {\r
                                return true;\r
                        }\r
                        return false;\r