OSDN Git Service

FIX: JOSMでのファイルパスを修正
[importpicture/importpicture.git] / importPicture / src / osm / jp / gpx / ImportPicture.java
index 67e2e3e..c3ae229 100644 (file)
@@ -2,6 +2,9 @@ package osm.jp.gpx;
 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
@@ -21,6 +24,7 @@ import org.w3c.dom.*;
 import org.xml.sax.SAXException;\r
 \r
 public class ImportPicture {\r
+       public static File gpxDir = new File(".");\r
 \r
        /** メイン\r
         * 画像ファイルをGPXファイルに取り込みます。\r
@@ -46,14 +50,32 @@ public class ImportPicture {
                        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
@@ -72,105 +94,109 @@ public class ImportPicture {
                 */\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
@@ -189,6 +215,40 @@ public class ImportPicture {
                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
@@ -198,6 +258,15 @@ public class ImportPicture {
        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
@@ -243,63 +312,21 @@ public class ImportPicture {
                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
@@ -332,7 +359,7 @@ public class ImportPicture {
         * @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
@@ -387,7 +414,7 @@ public class ImportPicture {
                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
@@ -395,6 +422,17 @@ public class ImportPicture {
 \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
@@ -425,4 +463,17 @@ public class ImportPicture {
                }\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