}\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
// 第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
}\r
}\r
}\r
+ else {\r
+ obj.gpxFiles.add(obj.gpxDir); \r
+ }\r
\r
// その他のパラメータを読み取る\r
obj.params = new AppParameters();\r
@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
\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
* </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
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
/**\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
}\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