OSDN Git Service

debug: <trkseg>ごとに実行
[importpicture/importpicture.git] / importPicture / src / osm / jp / gpx / ImportPicture.java
index 0b38001..c7497ab 100644 (file)
@@ -11,6 +11,7 @@ import java.util.Comparator;
 import java.util.Date;\r
 import java.util.GregorianCalendar;\r
 import java.util.Iterator;\r
+import java.util.Map.Entry;\r
 import java.util.Set;\r
 import java.util.TimeZone;\r
 import java.util.TreeMap;\r
@@ -348,6 +349,7 @@ public class ImportPicture extends Thread {
         DocumentBuilderFactory factory;\r
         DocumentBuilder        builder;\r
         Node gpx;\r
+        boolean header = true;         // ファイルヘッダの部分を出力するかどうかを示すフラグ\r
 \r
         String fileName = gpxFile.getName();\r
         String iStr = fileName.substring(0, fileName.length() - 4);\r
@@ -385,10 +387,9 @@ public class ImportPicture extends Thread {
          *   <wpt lat="35.2564461" lon="139.15437809"></wpt>\r
          * </gpx>\r
          */\r
-        TreeMap<Long,Element> map = new TreeMap<Long, Element>();\r
-        TreeMap<Long,Element> mapTRKSEG = new TreeMap<>();\r
+        TreeMap<Long,Element> mapTRKPT = new TreeMap<Long, Element>();\r
+        TreeMap<Long,Element> mapTRKSEG = new TreeMap<Long, Element>();\r
         Element trk = null;\r
-        //Element maeTRKPT = null;\r
         gpx    = builder.parse(gpxFile).getFirstChild();\r
         document = gpx.getOwnerDocument();\r
         NodeList nodes = gpx.getChildNodes();\r
@@ -396,92 +397,92 @@ public class ImportPicture extends Thread {
             Node node2 = nodes.item(i);\r
             if (node2.getNodeName().equals("trk")) {\r
                 trk = (Element) node2;\r
+                long gpxStartTimeL = (new Date()).getTime();\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 = document.createElement("trkseg");\r
                         Element trkseg = (Element) nodeTRKSEG;\r
                         NodeList nodes2 = trkseg.getChildNodes();\r
+                               long trksegStartTimeL = (new Date()).getTime();         // 対象とする開始時刻(現在時刻)\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
+                                Element trkpt = (Element) nodeTRKPT;\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 timeL = dfuk.parse(timeStr).getTime();\r
+                                                               if (trksegStartTimeL > timeL) {\r
+                                                                       trksegStartTimeL = timeL;\r
+                                                               }\r
+                                                    mapTRKPT.put(timeL, getCopy(trkseg.getOwnerDocument(), trkpt));\r
+                                                }\r
+                                            }\r
+                                        }\r
+                                    }\r
+                                }\r
                                newTRKSEG.appendChild(getCopy(document, nodeTRKPT));\r
                             }\r
                         }\r
-                        mapTRKSEG.put(new Long(trksegCounter), getCopy(document, newTRKSEG));\r
 \r
                         // <trk>から<trkseg>を削除する。\r
                         trk.removeChild(nodeTRKSEG);\r
+\r
+                        // <trk>に、新たな<trkseg>を追加する。\r
+                        trk.appendChild(newTRKSEG);\r
+\r
+                        mapTRKSEG.put(gpxStartTimeL, getCopy(document, newTRKSEG));\r
                     }\r
                 }\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に、<trkpt>を割り付ける\r
-                    trkptMap(newTRKSEG, map);\r
-                }\r
             }\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
-               /*\r
-                * SPEEDをGPXに設定する\r
-                * 条件: SPEEDを書き出すフラグがONの時\r
-                * 条件: オリジナルのSPEEDがある場合「上書きする/変更しない」(GPX_OUTPUT_SPEED)\r
-                */\r
-               /*\r
-        TreeMap<Long,Element> map2 = new TreeMap<Long, Element>();\r
-               if (Boolean.parseBoolean(params.getProperty(AppParameters.GPX_OUTPUT_SPEED))) {\r
-                       for (Long timeL : keySet) {\r
-                   Element trkptE = trkpt(map, new Date(timeL));\r
-                   if (trkptE != null) {\r
-                       map2.put(timeL, trkptE);\r
-                   }\r
-                   else {\r
-                       map2.put(timeL, map.get(timeL));\r
-                   }\r
-                       }\r
-               }\r
-               else {\r
-                       map2 = (TreeMap<Long, Element>) map.clone();\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| km/h |");\r
-               System.out.println("------------------------|--------------------|--------------------|--------------|--------------|--------|------|------|");\r
-               proc(imgDir, delta, gpxStartTime, gpxEndTime, map, exif, gpx);\r
-               System.out.println("------------------------|--------------------|--------------------|--------------|--------------|--------|------|------|");\r
+        // mapTRKSEGに時間順に格納された<trkseg>を順次ひとつづつ処理する\r
+        for (Entry<Long, Element> mapEntry : mapTRKSEG.entrySet()) {\r
+               Element newTRKSEG = mapEntry.getValue();\r
+            \r
+            // mapTRKPTに、<trkpt>を割り付ける\r
+            trkptMap(newTRKSEG, mapTRKPT);\r
+\r
+            // <trkseg>の開始時刻と終了時刻を求める\r
+               long segStartTimeL = (new Date()).getTime();    // <trkseg>の開始時刻\r
+               long segEndTimeL = 0L;                                                  // 対象とする終了時刻\r
+               Set<Long> keySet = mapTRKPT.keySet();                   //すべてのキー値を取得\r
+               for (Long timeLong : keySet) {\r
+                       long gpxTime = timeLong;\r
+                       if (segStartTimeL > gpxTime) {\r
+                            segStartTimeL = gpxTime;\r
+                       }\r
+                       if (segEndTimeL < gpxTime) {\r
+                            segEndTimeL = gpxTime;\r
+                       }\r
+               }\r
+               \r
+               if (header) {\r
+                       System.out.println("|--------------------------------|--------------------|--------------------|--------------|--------------|--------|------|------|");\r
+                       System.out.println("| name                           | UpdateTime         | GPStime            |   Latitude   |   Longitude  | ele    |magvar| km/h |");\r
+                       System.out.println("|--------------------------------|--------------------|--------------------|--------------|--------------|--------|------|------|");\r
+                       header = false;\r
+               }\r
+               System.out.println("|------<trkpt>-------------------|"+ dfjp.format(new Date(segStartTimeL)) + "-->"+ dfjp.format(new Date(segEndTimeL)) +"|");\r
+               proc(imgDir, delta, segStartTimeL, segEndTimeL, mapTRKPT, exif, gpx);\r
+        }\r
+               System.out.println("|--------------------------------|--------------------|--------------------|--------------|--------------|--------|------|------|");\r
 \r
         // 出力\r
         outputFile.getParentFile().mkdirs();\r
@@ -762,13 +763,14 @@ public class ImportPicture extends Thread {
      *                 <time>2016-07-02T08:25:18Z</time>\r
      *         </trkpt>\r
      * </trkseg>\r
-     * \r
-     * @param trk\r
+     * @return gpxStartTimeL : long 格納したエレメント<trkpt>の最小時刻(startTime)をかえす。呼び出し元はこの値を使ってエレメント<trkpt>を時系列にソートする\r
+     * @param trk      \r
      * @param map\r
      * @throws ParseException\r
      */\r
-    public void trkptMap(Element trkseg, TreeMap<Long,Element> map) throws ParseException {\r
+    public long trkptMap(Element trkseg, TreeMap<Long,Element> map) throws ParseException {\r
         dfuk.setTimeZone(TimeZone.getTimeZone("GMT"));\r
+               long gpxStartTimeL = (new Date()).getTime();            // 対象とする開始時刻(現在時刻)\r
 \r
         NodeList nodes2 = trkseg.getChildNodes();\r
         for (int i2=0; i2 < nodes2.getLength(); i2++) {\r
@@ -787,8 +789,12 @@ public class ImportPicture extends Thread {
                             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
+                                    long timeL = dfuk.parse(timeStr).getTime();\r
+                                               long gpxTime = timeL;\r
+                                               if (gpxStartTimeL > gpxTime) {\r
+                                                       gpxStartTimeL = gpxTime;\r
+                                               }\r
+                                    map.put(timeL, getCopy(trkseg.getOwnerDocument(), trkpt));\r
                                 }\r
                             }\r
                         }\r
@@ -796,6 +802,7 @@ public class ImportPicture extends Thread {
                 }\r
             }\r
         }\r
+               return gpxStartTimeL;\r
     }\r
 \r
     \r