import java.io.*;\r
import java.text.ParseException;\r
import java.text.SimpleDateFormat;\r
+import java.util.ArrayList;\r
+import java.util.Arrays;\r
+import java.util.Comparator;\r
import java.util.Date;\r
import java.util.HashMap;\r
import java.util.Iterator;\r
import org.xml.sax.SAXException;\r
\r
public class ImportPicture {\r
+ public static File gpxDir = new File(".");\r
\r
/** メイン\r
* 画像ファイルをGPXファイルに取り込みます。\r
csvfile = new File(argv[0]);\r
}\r
\r
- File dir = new File(".");\r
if (argv.length > 1) {\r
- dir = new File(argv[1]);\r
+ gpxDir = new File(argv[1]);\r
}\r
\r
if (argv.length < 4) {\r
- System.out.println("> java -jar importPicture.jar <outputfile> <targetDir> <time base image> <time> <gpx>");\r
- System.out.println("> java -jar importPicture.jar list.csv . IMG_01234.JPG 2012-06-15T12:52:22 鎌倉宮_2012-06-15_12-00-16.gpx");\r
+ System.out.println("> java -jar importPicture.jar <outputfile> <targetDir> <time base image> <time> (gpx)");\r
+ System.out.println("> java -jar importPicture.jar list.csv . IMG_01234.JPG 2012-06-15T12:52:22");\r
+ }\r
+ \r
+ // 第5引数が指定されなければ、指定されたディレクトリ内のGPXファイルすべてを対象とする\r
+ ArrayList<File> gpxFiles = new ArrayList<File>();\r
+ if (argv.length > 4) {\r
+ gpxFiles.add(new File(gpxDir, argv[4]));\r
+ }\r
+ else {\r
+ File[] files = gpxDir.listFiles();\r
+ for (int i=0; i < files.length; i++) {\r
+ if (files[i].isFile()) {\r
+ String filename = files[i].getName().toUpperCase();\r
+ if (filename.endsWith(".GPX")) {\r
+ if (!filename.endsWith("_.GPX")) {\r
+ gpxFiles.add(files[i]);\r
+ }\r
+ }\r
+ }\r
+ }\r
}\r
\r
/**\r
*/\r
DocumentBuilderFactory factory;\r
DocumentBuilder builder;\r
-\r
Node gpx;\r
- File gpxFile = new File(argv[4]);\r
-\r
- String fileName = gpxFile.getName();\r
- String iStr = fileName.substring(0, fileName.length() - 4);\r
-\r
- File outputFile = new File(iStr +"_.gpx");\r
- System.out.println(iStr + " => "+ outputFile.getName());\r
-\r
+ \r
try {\r
- factory = DocumentBuilderFactory.newInstance();\r
- builder = factory.newDocumentBuilder();\r
- factory.setIgnoringElementContentWhitespace(true);\r
- factory.setIgnoringComments(true);\r
- factory.setValidating(true);\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">\r
- </wpt>\r
- </gpx>\r
- */\r
- Element trk = null;\r
- gpx = builder.parse(gpxFile).getFirstChild();\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
+ for (int gpxCnt = 0; gpxCnt < gpxFiles.size(); gpxCnt++) {\r
+ File gpxFile = gpxFiles.get(gpxCnt);\r
+ String fileName = gpxFile.getName();\r
+ String iStr = fileName.substring(0, fileName.length() - 4);\r
+ \r
+ File outputFile = new File(gpxFile.getParent(), iStr +"_.gpx");\r
+ System.out.println(iStr + " => "+ outputFile.getName());\r
+\r
+ factory = DocumentBuilderFactory.newInstance();\r
+ builder = factory.newDocumentBuilder();\r
+ factory.setIgnoringElementContentWhitespace(true);\r
+ factory.setIgnoringComments(true);\r
+ factory.setValidating(true);\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">\r
+ </wpt>\r
+ </gpx>\r
+ */\r
+ Element trk = null;\r
+ gpx = builder.parse(gpxFile).getFirstChild();\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
}\r
- }\r
-\r
- if (trk != null) {\r
- HashMap<Long,Element> map = trkptMap(trk);\r
- File baseFile = new File(dir, argv[2]);\r
- Date jptime = new Date(baseFile.lastModified());\r
-\r
- PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(csvfile)));\r
- String timeStr = argv[3];\r
- try {\r
- Date t = dfjp.parse(timeStr);\r
- long delta = t.getTime() - jptime.getTime();\r
- System.out.println("時差: "+ (delta / 1000) +"(sec)");\r
- pw.println("時差: "+ (delta / 1000) +"(sec)");\r
- ImportPicture.proc(dir, csvfile, delta);\r
-\r
- pw.println("\"name\",\"orignal\",\"gpstime\"");\r
- File[] files = dir.listFiles();\r
- for (File image : files) {\r
- String imageName = image.getName();\r
- if (checkFile(imageName)) {\r
- Date itime = new Date(image.lastModified());\r
- Date uktime = new Date(itime.getTime() + delta);\r
- pw.print("\""+ fileName +"\",");\r
- pw.print("\""+ dfjp.format(itime) +"\",");\r
- pw.println("\""+ dfjp.format(uktime) +"\"");\r
\r
- Element trkpt = trkpt(map, uktime);\r
- if (trkpt != null) {\r
- Element wpt = createWptTag(dir, image, uktime.getTime(), trkpt);\r
- Element temp = getCopy(gpx.getOwnerDocument(), wpt);\r
- gpx.appendChild(temp);\r
+ if (trk != null) {\r
+ HashMap<Long,Element> map = trkptMap(trk);\r
+ File baseFile = new File(gpxDir, argv[2]);\r
+ Date jptime = new Date(baseFile.lastModified());\r
+\r
+ PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(csvfile)));\r
+ String timeStr = argv[3];\r
+ try {\r
+ Date t = dfjp.parse(timeStr);\r
+ long delta = t.getTime() - jptime.getTime();\r
+ \r
+ /*\r
+ * GPXへ割りつける開始時刻と終了時刻を求める\r
+ */\r
+ long gpxStartTime = (new Date()).getTime(); // 対象とする開始時刻\r
+ long gpxEndTime = 0L; // 対象とする終了時刻\r
+ Set<Long> keySet = map.keySet(); //すべてのキー値を取得\r
+ for (Iterator<Long> keyIte = keySet.iterator(); keyIte.hasNext();) {\r
+ Long timeLong = (Long)keyIte.next();\r
+ long gpxTime = timeLong.longValue();\r
+ if (gpxStartTime > gpxTime) {\r
+ gpxStartTime = gpxTime;\r
+ }\r
+ if (gpxEndTime < gpxTime) {\r
+ gpxEndTime = gpxTime;\r
}\r
}\r
+ \r
+ System.out.println("時差: "+ (delta / 1000) +"(sec)");\r
+ pw.println(" 時差: "+ (delta / 1000) +"(sec)");\r
+ pw.println(" Target GPX: ["+ gpxFile.getName() +"]");\r
+ pw.println("GPX start time: "+ dfjp.format(new Date(gpxStartTime).getTime()));\r
+ pw.println(" GPX end time: "+ dfjp.format(new Date(gpxEndTime).getTime()));\r
+\r
+ pw.println("\"name\",\"orignal\",\"gpstime\"");\r
+ proc(gpxDir, delta, gpxStartTime, gpxEndTime, map, pw, gpx);\r
+ }\r
+ catch (ParseException e) {\r
+ System.out.println("'"+ timeStr +"' の書式が違います(yyyy-MM-dd'T'HH:mm:ss)");\r
+ }\r
+ finally {\r
+ pw.close();\r
}\r
}\r
- catch (ParseException e) {\r
- System.out.println("'"+ timeStr +"' の書式が違います(yyyy-MM-dd'T'HH:mm:ss)");\r
- }\r
- finally {\r
- pw.close();\r
- }\r
- }\r
\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
+ // 出力\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
+ }\r
}\r
catch (ParserConfigurationException e) {\r
e.printStackTrace();\r
finally {\r
}\r
}\r
+ \r
+ /**\r
+ * 再帰メソッド\r
+ * @throws ParseException \r
+ */\r
+ static void proc(File dir, long delta, long gpxStartTime, long gpxEndTime, HashMap<Long,Element> map, PrintWriter pw, Node gpx) throws ParseException {\r
+ File[] files = dir.listFiles();\r
+ Arrays.sort(files, new FileSort());\r
+ for (File image : files) {\r
+ if (image.isDirectory()) {\r
+ proc(image, delta, gpxStartTime, gpxEndTime, map, pw, gpx);\r
+ }\r
+ else {\r
+ String imageName = image.getName();\r
+ if (checkFile(imageName)) {\r
+ Date itime = new Date(image.lastModified());\r
+ Date uktime = new Date(itime.getTime() + delta);\r
+ if ((uktime.getTime() >= gpxStartTime) && (uktime.getTime() <= gpxEndTime)) {\r
+ Element trkpt = trkpt(map, uktime);\r
+ if (trkpt != null) {\r
+ pw.print("\""+ image.getName() +"\",");\r
+ pw.print("\""+ dfjp.format(itime) +"\",");\r
+ pw.println("\""+ dfjp.format(uktime) +"\"");\r
+\r
+ Element wpt = createWptTag(image, uktime.getTime(), trkpt);\r
+ Element temp = getCopy(gpx.getOwnerDocument(), wpt);\r
+ gpx.appendChild(temp);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ }\r
\r
static Document document;\r
\r
static SimpleDateFormat dfjp = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");\r
static SimpleDateFormat dfuk = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.UK);\r
\r
+ /**\r
+ * XMLエレメント<trkpt>をTIMEでキー付したHashMapを生成する<br>\r
+ * \r
+ * <trk><trkseg><trkpt><time>2014-01-01T00:59:09Z</time></trkpt></trkseg></trk>\r
+ * \r
+ * @param trk\r
+ * @return\r
+ * @throws ParseException\r
+ */\r
public static HashMap<Long,Element> trkptMap(Element trk) throws ParseException {\r
HashMap<Long,Element> map = new HashMap<Long,Element>();\r
\r
Element ret = null;\r
\r
Set<Long> keySet = map.keySet(); //すべてのキー値を取得\r
- Iterator<Long> keyIte = keySet.iterator();\r
- while (keyIte.hasNext()) { //ループ。反復子iteratorによる キー 取得\r
- Long time = keyIte.next();\r
- long t = time.longValue();\r
+ Iterator<Long> keyIte = keySet.iterator();\r
+ while (keyIte.hasNext()) { //ループ。反復子iteratorによる キー 取得\r
+ Long time = keyIte.next();\r
+ long t = time.longValue();\r
if (Math.abs(jpt - t) < sa) {\r
sa = Math.abs(jpt - t);\r
ret = map.get(time);\r
}\r
- }\r
+ }\r
\r
- if (sa < (60000L * 10L)) {\r
+ if (sa < (60000L * 10L)) {\r
System.out.println(dfuk.format(jpt) +" ("+ sa +")");\r
return ret;\r
}\r
- return null;\r
- }\r
-\r
- /**\r
- *\r
- * <wpt lat="35.25714922" lon="139.15490497">\r
- * <ele>62.099998474121094</ele>\r
- * <time>2012-06-11T00:44:38Z</time>\r
- * <name><![CDATA[写真]]></name>\r
- * <link href="2012-06-11_09-44-38.jpg">\r
- * <text>2012-06-11_09-44-38.jpg</text>\r
- * </link>\r
- * </wpt>\r
- *\r
- * @param dir\r
- * @param csvfile\r
- * @param delta\r
- * @throws IOException\r
- */\r
- public static void proc (File dir, File csvfile, long delta) throws IOException {\r
- int counter = 0;\r
- PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(csvfile)));\r
- pw.println("\"name\",\"orignal\",\"gpstime\"");\r
-\r
- try {\r
- File[] files = dir.listFiles();\r
- for (File iFile : files) {\r
- String fileName = iFile.getName();\r
- if (checkFile(fileName)) {\r
- counter++;\r
- Date jptime = new Date(iFile.lastModified());\r
- Date uktime = new Date(jptime.getTime() + delta);\r
- pw.print("\""+ fileName +"\",");\r
- pw.print("\""+ dfjp.format(jptime) +"\",");\r
- pw.println("\""+ dfjp.format(uktime) +"\"");\r
- }\r
- }\r
- }\r
- finally {\r
- pw.close();\r
- System.out.println("Image file count = "+ counter);\r
- }\r
- System.out.println("SUCESS 'ListUpdateTime' => '"+ csvfile.getAbsolutePath() +"' !");\r
+ return null;\r
}\r
\r
/**\r
* @param delta\r
* @throws IOException\r
*/\r
- public static Element createWptTag(File dir, File iFile, long timestamp, Element trkpt) {\r
+ public static Element createWptTag(File iFile, long timestamp, Element trkpt) {\r
Element wpt = document.createElement("wpt");\r
\r
NamedNodeMap nodeMap = trkpt.getAttributes();\r
wpt.appendChild(name);\r
\r
Element link = document.createElement("link");\r
- link.setAttribute("href", dir.getName() + "/"+ iFile.getName());\r
+ link.setAttribute("href", getShortPathName(gpxDir, iFile));\r
Element text = document.createElement("text");\r
text.setTextContent(iFile.getName());\r
link.appendChild(text);\r
\r
return wpt;\r
}\r
+ \r
+ static String getShortPathName(File dir, File iFile) {\r
+ String dirPath = dir.getAbsolutePath();\r
+ String filePath = iFile.getAbsolutePath();\r
+ if (filePath.startsWith(dirPath)) {\r
+ return filePath.substring(dirPath.length()+1);\r
+ }\r
+ else {\r
+ return filePath;\r
+ }\r
+ }\r
\r
public static Element getCopy(Document doc, Node node) {\r
Element root = doc.createElement(node.getNodeName());\r
}\r
return root;\r
}\r
+ \r
+ /**\r
+ * ファイル名の順序に並び替えるためのソートクラス\r
+ * \r
+ * @author hayashi\r
+ */\r
+ static class FileSort implements Comparator<File>{\r
+ public int compare(File src, File target){\r
+ int diff = src.getName().compareTo(target.getName());\r
+ return diff;\r
+ }\r
+ }\r
+\r
}
\ No newline at end of file