*\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
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
}\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
}\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
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
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
}\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
}\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
* @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
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
*/\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