OSDN Git Service

refact: class.ElementMapTRKPTを構造切り離し
authorhayashi <hayashi.yuu@gmail.com>
Thu, 22 Jun 2017 03:45:56 +0000 (12:45 +0900)
committerhayashi <hayashi.yuu@gmail.com>
Thu, 22 Jun 2017 03:45:56 +0000 (12:45 +0900)
importPicture/doc/ImportPicture.class.violet.html [new file with mode: 0644]
importPicture/src/osm/jp/gpx/ElementMapTRKPT.java [new file with mode: 0644]
importPicture/src/osm/jp/gpx/ImportPicture.java
importPicture/src/osm/jp/gpx/TimeComparator.java [new file with mode: 0644]
importPicture/test/osm/jp/gpx/ElementMapTRKPTTest.java [new file with mode: 0644]

diff --git a/importPicture/doc/ImportPicture.class.violet.html b/importPicture/doc/ImportPicture.class.violet.html
new file mode 100644 (file)
index 0000000..83be5c1
--- /dev/null
@@ -0,0 +1,1024 @@
+<HTML>
+<HEAD>
+<META name="description"
+       content="Violet UML Editor cross format document" />
+<META name="keywords" content="Violet, UML" />
+<META charset="UTF-8" />
+<SCRIPT type="text/javascript">
+       function switchVisibility() {
+               var obj = document.getElementById("content");
+               obj.style.display = (obj.style.display == "block") ? "none" : "block";
+       }
+</SCRIPT>
+</HEAD>
+<BODY>
+       This file was generated with Violet UML Editor 2.1.0.
+       &nbsp;&nbsp;(&nbsp;<A href=# onclick="switchVisibility()">View Source</A>&nbsp;/&nbsp;<A href="http://sourceforge.net/projects/violet/files/violetumleditor/" target="_blank">Download Violet</A>&nbsp;)
+       <BR />
+       <BR />
+       <SCRIPT id="content" type="text/xml"><![CDATA[<ClassDiagramGraph id="1">
+  <nodes id="2">
+    <ClassNode id="3">
+      <children id="4"/>
+      <location class="Point2D.Double" id="5" x="40.0" y="120.0"/>
+      <id id="6" value="845ab893-c07c-4f1e-bb2a-d3e836bdd1ca"/>
+      <revision>1</revision>
+      <backgroundColor id="7">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+        <alpha>255</alpha>
+      </backgroundColor>
+      <borderColor id="8">
+        <red>0</red>
+        <green>0</green>
+        <blue>0</blue>
+        <alpha>255</alpha>
+      </borderColor>
+      <textColor reference="8"/>
+      <name id="9" justification="1" size="3" underlined="false">
+        <text>ImportPicture</text>
+      </name>
+      <attributes id="10" justification="0" size="4" underlined="false">
+        <text>+ ex: Exception
+# LOGGING_PROPERTIES_DATA: String
++ logger: Logger
++ gpxDir: FIle
++ imgDir: File
++ outDir: File
++ delta: long = 0
++ exif: boolean = false
++ exifBase: boolean = false
++ gpxFiles: ArrayList&lt;File&gt; = new ArrayList()
++ params: AppParameters = null
++ param_GpxSplit: boolean = false
++ param_GpxNoFirstNode: boolean = false
++ param_GpxReuse: boolean = false
++ param_GpxOutputWpt: boolean = true
++ param_ImgOutputAll: boolean = false
++ param_GpxSourceFolder: String = &quot;.&quot;
++ DIFF_MAE_TIME: static final long = 3000
+- document: Document
++ TIME_FORMAT_STRING: String = &quot;yyyy-MM-dd&apos;T&apos;HH:mm:ss&quot;
++ dfjp: SimpleDateFormat = new SimpleDateFormat(TIME_FORMAT_STRING)
++ dfuk: SimpleDateFormat = new SimpleDateFormat(TIME_FORMAT_STRING +&quot;&apos;Z&apos;&quot;)</text>
+      </attributes>
+      <methods id="11" justification="0" size="4" underlined="false">
+        <text>+ main(): void
++ run(): viod
+- procGPXfile(): void
+- proc(): boolean
++ trkptMap(): long
++ trkpt(): Element
++ getTrkpt(): Element
++ getMaeTrkpt(): Element
++ checkFile(name: String): boolean
++ createWptTag(iFile: File, timestamp: long, trkpt: Element): Element
+- getShortPathName(dir: File, iFile: File): String
++ getCopy(doc: Document, node: Node): Element</text>
+      </methods>
+    </ClassNode>
+    <ClassNode id="12">
+      <children id="13"/>
+      <location class="Point2D.Double" id="14" x="220.0" y="20.0"/>
+      <id id="15" value="d5585fdf-9660-4fc3-9aff-e9887e844a70"/>
+      <revision>1</revision>
+      <backgroundColor reference="7"/>
+      <borderColor reference="8"/>
+      <textColor reference="8"/>
+      <name id="16" justification="1" size="3" underlined="false">
+        <text>java.lang.Thread</text>
+      </name>
+      <attributes id="17" justification="0" size="4" underlined="false">
+        <text></text>
+      </attributes>
+      <methods id="18" justification="0" size="4" underlined="false">
+        <text></text>
+      </methods>
+    </ClassNode>
+    <ClassNode id="19">
+      <children id="20"/>
+      <location class="Point2D.Double" id="21" x="670.0" y="250.0"/>
+      <id id="22" value="dba2c4c9-7691-44b6-85ed-2cc0fa4b35cb"/>
+      <revision>1</revision>
+      <backgroundColor reference="7"/>
+      <borderColor reference="8"/>
+      <textColor reference="8"/>
+      <name id="23" justification="1" size="3" underlined="false">
+        <text>FileSort</text>
+      </name>
+      <attributes id="24" justification="0" size="4" underlined="false">
+        <text></text>
+      </attributes>
+      <methods id="25" justification="0" size="4" underlined="false">
+        <text>+ compare(src File, target: File): int</text>
+      </methods>
+    </ClassNode>
+    <InterfaceNode id="26">
+      <children id="27"/>
+      <location class="Point2D.Double" id="28" x="700.0" y="110.0"/>
+      <id id="29" value="8db13f1b-2dfa-42d2-8d2a-3188f078003a"/>
+      <revision>1</revision>
+      <backgroundColor reference="7"/>
+      <borderColor reference="8"/>
+      <textColor reference="8"/>
+      <name id="30" justification="1" size="3" underlined="false">
+        <text>«java.util.Comparator»</text>
+      </name>
+      <methods id="31" justification="0" size="4" underlined="false">
+        <text>+ compare(o1: T, o2: T): int</text>
+      </methods>
+    </InterfaceNode>
+    <ClassNode id="32">
+      <children id="33"/>
+      <location class="Point2D.Double" id="34" x="730.0" y="480.0"/>
+      <id id="35" value="31c83ca6-e1e1-4535-bc40-449bfdde8f26"/>
+      <revision>1</revision>
+      <backgroundColor reference="7"/>
+      <borderColor reference="8"/>
+      <textColor reference="8"/>
+      <name id="36" justification="1" size="3" underlined="false">
+        <text>JpegFileFilter</text>
+      </name>
+      <attributes id="37" justification="0" size="4" underlined="false">
+        <text></text>
+      </attributes>
+      <methods id="38" justification="0" size="4" underlined="false">
+        <text>+ accept(dir: File, name: String): boolean</text>
+      </methods>
+    </ClassNode>
+    <InterfaceNode id="39">
+      <children id="40"/>
+      <location class="Point2D.Double" id="41" x="760.0" y="390.0"/>
+      <id id="42" value="8e9c8035-2445-48ac-97ef-2c04f46a68d0"/>
+      <revision>1</revision>
+      <backgroundColor reference="7"/>
+      <borderColor reference="8"/>
+      <textColor reference="8"/>
+      <name id="43" justification="1" size="3" underlined="false">
+        <text>« java.io.FilenameFilter »</text>
+      </name>
+      <methods id="44" justification="0" size="4" underlined="false">
+        <text></text>
+      </methods>
+    </InterfaceNode>
+  </nodes>
+  <edges id="45">
+    <InheritanceEdge id="46">
+      <start class="ClassNode" reference="3"/>
+      <end class="ClassNode" reference="12"/>
+      <startLocation class="Point2D.Double" id="47" x="100.0" y="110.0"/>
+      <endLocation class="Point2D.Double" id="48" x="60.0" y="20.0"/>
+      <transitionPoints id="49"/>
+      <id id="50" value="b34adea2-cbbc-4f3e-8a5b-02a8b3c51acf"/>
+      <revision>1</revision>
+      <bentStyle name="AUTO"/>
+      <startLabel></startLabel>
+      <middleLabel></middleLabel>
+      <endLabel></endLabel>
+    </InheritanceEdge>
+    <CompositionEdge id="51">
+      <start class="ClassNode" reference="19"/>
+      <end class="ClassNode" reference="3"/>
+      <startLocation class="Point2D.Double" id="52" x="80.0" y="60.0"/>
+      <endLocation class="Point2D.Double" id="53" x="430.0" y="80.0"/>
+      <transitionPoints id="54"/>
+      <id id="55" value="80415b6f-4eac-4a15-9f95-9f370b1a655c"/>
+      <revision>1</revision>
+      <bentStyle name="AUTO"/>
+      <startLabel></startLabel>
+      <middleLabel></middleLabel>
+      <endLabel></endLabel>
+    </CompositionEdge>
+    <InterfaceInheritanceEdge id="56">
+      <start class="ClassNode" reference="19"/>
+      <end class="InterfaceNode" reference="26"/>
+      <startLocation class="Point2D.Double" id="57" x="110.0" y="50.0"/>
+      <endLocation class="Point2D.Double" id="58" x="110.0" y="50.0"/>
+      <transitionPoints id="59"/>
+      <id id="60" value="85934579-2ddb-4dd6-96fd-65a675a7e429"/>
+      <revision>1</revision>
+      <bentStyle name="AUTO"/>
+      <startLabel></startLabel>
+      <middleLabel></middleLabel>
+      <endLabel></endLabel>
+    </InterfaceInheritanceEdge>
+    <CompositionEdge id="61">
+      <start class="ClassNode" reference="32"/>
+      <end class="ClassNode" reference="3"/>
+      <startLocation class="Point2D.Double" id="62" x="100.0" y="60.0"/>
+      <endLocation class="Point2D.Double" id="63" x="440.0" y="390.0"/>
+      <transitionPoints id="64"/>
+      <id id="65" value="0243e3a2-7a59-4aec-8f98-13b228b37461"/>
+      <revision>1</revision>
+      <bentStyle name="AUTO"/>
+      <startLabel></startLabel>
+      <middleLabel></middleLabel>
+      <endLabel></endLabel>
+    </CompositionEdge>
+    <InterfaceInheritanceEdge id="66">
+      <start class="ClassNode" reference="32"/>
+      <end class="InterfaceNode" reference="39"/>
+      <startLocation class="Point2D.Double" id="67" x="120.0" y="50.0"/>
+      <endLocation class="Point2D.Double" id="68" x="100.0" y="30.0"/>
+      <transitionPoints id="69"/>
+      <id id="70" value="857a37f4-3f78-41ef-bc47-ff561b842f3d"/>
+      <revision>1</revision>
+      <bentStyle name="AUTO"/>
+      <startLabel></startLabel>
+      <middleLabel></middleLabel>
+      <endLabel></endLabel>
+    </InterfaceInheritanceEdge>
+  </edges>
+</ClassDiagramGraph>]]></SCRIPT>
+       <BR />
+       <BR />
+       <IMG alt="embedded diagram image" src="data:image/png;base64,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\r
+jN988w2Pb2K9gPXCmVlvSUnJ6upq1lty1H/MRUQODg5EetQMh/r6+tnZWTGztra2vFQvEomI+ojb\r
+iRiJ1oi4iFrNzc1JzObmps2tu0Qi0dnZqX2USop/7+/v2xiYx+NZW1uTnAcGBrR4+fjll1+GQiEb\r
+SVUxphWTnwSq0CxVffXq1YMHD9TzXgV3hWwuejo5Oen8sTD7S7BNWUpGb9++rUxUrF1G3KznxC9h\r
+n0v/aPebJWD1Iwrgyo1tS0tLv/71r//jP/5DzhTNd//1X//1f/7nf+7evfv69WveX4b1AtYLeVuv\r
+Dd3d3epS63a71WxOtf3g4KDf75dIkae9vb3+/n5Ndqurq9U8ToeqJ1oTDoclK8lQPa4kftPQ0CBm\r
+U1paqk0qNeYm131NdxSNjY3qJbJWBiYm5/P5pKze3l5ROu0VBNJM/YNZVu/WNa1YNBoVG6urq7MR\r
+04K74swvwfZlqfkqSij14cvc51K69pylZMjrnOCajW1//vOff/azn/33f/93IBCoqam5devWyMgI\r
+vov1AtYLZ2+9JSUlaj6lyIf2nNA1O6XFnEKhkDSQI+Mq9rkM/7W1teLoBwcHEjjNTXGAyzm2yUEu\r
+P00l/n//939Zmw3rBa4M9MZ5WW88Hlf3dMVRpqamVKT+qfmrzsrKSmVlpZOVJuDS9vnbt28nJyfH\r
+x8fV6yAAruXYxv1drBe4MmC952u91x4ZSNbW1ugH+hyAsQ2wXuDKgPUCAABjG2C9wJUB671wqqur\r
+1RNUBTb+iy/U01GxWGxvb4+jgSs1AGMbYL3AlQHrvXSsra3V1dXV1NSc8nq0tbUViUQu+EVXl3AC\r
+MdYLwNgGZzzEApwDXBnOxnrPVnfO+yH6R48evXr1SsRXewdWwb/CDw8PnTyZd4Ytct7VF/YuAqwX\r
+AOuF87ioAnBluGLWK1+Njo6Wl5eLHYbDYTUfYGNjQ6RTYoLB4PT0tErp9XpnZmZKS0u3trZME0hW\r
+8Xjc4/GUlZVNTk4+ePCguLhYm6iQSCTko2SivTvWtFbignfu3JG/yWQy622vxnpaRWpbpVIpqc85\r
+tUiKa2xslE0CgYD2AmP9+2iNCbIKNfZJXvt4ZGREKiabm65/ZpRdrtQAjG2A9QJXhhttvR0dHUdH\r
+R/v7+21tbWoZtrm5OWVpi4uLfr9fpRT5i8Vi6t06pgkkq/7+fhHWpaUlUb2pqan19XXRMvWty+VS\r
+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" />
+</BODY>
+</HTML>
\ No newline at end of file
diff --git a/importPicture/src/osm/jp/gpx/ElementMapTRKPT.java b/importPicture/src/osm/jp/gpx/ElementMapTRKPT.java
new file mode 100644 (file)
index 0000000..15bc6d3
--- /dev/null
@@ -0,0 +1,141 @@
+package osm.jp.gpx;
+
+import java.text.ParseException;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.TreeMap;
+
+import org.w3c.dom.DOMException;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+@SuppressWarnings("serial")
+public class ElementMapTRKPT extends TreeMap<Date, Element> {
+       public static final long DIFF_MAE_TIME = 3000L; // before 3 secound
+
+       public ElementMapTRKPT() {
+               super(new TimeComparator());
+       }
+
+       /**
+        * 拡張put value:ElementをputするとElement内のtimeを読み取ってkeyとしてsuper.put(key,value)する。
+        * @param value
+        * @return      keyとして登録したtime:Date
+        * @throws ParseException 
+        * @throws DOMException 
+        */
+       public Date put(Element value) throws DOMException, ParseException {
+        NodeList nodes3 = value.getChildNodes();
+        for (int i3=0; i3 < nodes3.getLength(); i3++) {
+            Node node4 = nodes3.item(i3);
+            if (node4.getNodeName().equals("time")) {
+                NodeList nodes4 = node4.getChildNodes();      // 子ノードを取得
+                for (int i4=0; i4< nodes4.getLength(); i4++) {
+                    Node node5 = nodes4.item(i4);
+                    if (node5 != null) {
+                        if (node5.getNodeType() == Node.TEXT_NODE) {
+                            Date time = ImportPicture.dfuk.parse(node5.getNodeValue());
+                            this.put(time, value);
+                               return time;
+                        }
+                    }
+                }
+            }
+        }
+        return null;
+       }
+       
+       /**
+     * 指定時刻(jptime)のTRKPTエレメントを取り出す。
+     * 
+     * @param jptime   指定する日時
+     * @return エレメントTRKPT。指定時刻に対応するノードがないときはnullを返す。
+     * @throws ParseException
+     */
+    public Element get(Date jptime) throws ParseException {
+        Element imaE = getTrkpt(jptime);
+        if (imaE != null) {
+               Element maeE = getMaeTrkpt(new TagTrkpt(imaE));
+            if (maeE != null) {
+               Complementation comp = new Complementation(imaE, maeE);
+
+                // <MAGVAR>がなければ、
+                // 直前の位置と、現在地から進行方向を求める
+               // 経度(longitude)と経度から進行方向を求める
+                if (Complementation.param_GpxOverwriteMagvar) {
+                       comp.complementationMagvar();
+                }
+
+                // 緯度・経度と時間差から速度(km/h)を求める
+                if (Complementation.param_GpxOutputSpeed) {
+                       comp.complementationSpeed();
+                }
+                imaE = (Element)(comp.imaTag.trkpt.cloneNode(true));
+            }
+        }
+        return imaE;
+    }
+    
+    /**
+     * [map]から指定した時刻の<trkpt>エレメントを取り出す。
+     * GPX時刻との差が10分以上は無効
+     * 
+     * @param mapTRKPT
+     * @param jptime
+     * @return <trkpt>エレメント
+     * @throws ParseException
+     */
+    private Element getTrkpt(Date jptime) throws ParseException {
+        long sa = 2L * 3600000L;
+        long jpt = jptime.getTime();
+        
+        Element ret = null;
+
+        Set<Date> keySet = this.keySet();  //すべてのキー値を取得
+        Iterator<Date> keyIte = keySet.iterator();
+        while (keyIte.hasNext()) {
+            Date time = keyIte.next();
+            long t = time.getTime();
+
+            if (Math.abs(jpt - t) < sa) {
+                sa = Math.abs(jpt - t);
+                ret = super.get(time);
+            }
+        }
+
+       // GPX時刻との差が10分以内なら有効
+        if (sa < (60000L * 10L)) {
+            return ret;
+        }
+        return null;
+    }
+    
+    private Element getMaeTrkpt(TagTrkpt imaTrkpt) throws ParseException {
+        Element ret = null;
+        long diffTime = 2L * 3600000L;         // 2時間
+        long jpt = imaTrkpt.time.getTime() - DIFF_MAE_TIME;
+
+        Set<Date> keySet = this.keySet();  //すべてのキー値を取得
+        Iterator<Date> keyIte = keySet.iterator();
+        while (keyIte.hasNext()) {    //ループ。反復子iteratorによる キー 取得
+            Date time = keyIte.next();
+            long t = time.getTime();
+
+            if (Math.abs(jpt - t) < diffTime) {
+               diffTime = Math.abs(jpt - t);
+                ret = super.get(time);
+            }
+        }
+
+       // GPX時刻との差が10分以内なら有効
+        if (diffTime < (60000L * 10L)) {
+               // 元の時刻との差が1秒以上あること
+               if (diffTime < (imaTrkpt.time.getTime() - 1000)) {
+                return ret;
+               }
+        }
+        return null;
+    }
+}
index e622330..24a5a44 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;\r
 import java.util.Map.Entry;\r
 import java.util.Set;\r
 import java.util.TimeZone;\r
@@ -298,7 +299,6 @@ public class ImportPicture extends Thread {
        public boolean param_GpxOutputWpt = true;\r
        public boolean param_ImgOutputAll = false;\r
        public String param_GpxSourceFolder = ".";\r
-       public static final long DIFF_MAE_TIME = 3000L; // before 3 secound\r
        \r
     @Override\r
     public void run() {\r
@@ -349,7 +349,6 @@ 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
@@ -387,8 +386,7 @@ public class ImportPicture extends Thread {
          *   <wpt lat="35.2564461" lon="139.15437809"></wpt>\r
          * </gpx>\r
          */\r
-        TreeMap<Long,Element> mapTRKPT = new TreeMap<Long, Element>();\r
-        TreeMap<Long,Element> mapTRKSEG = new TreeMap<Long, Element>();\r
+        TreeMap<Long,ElementMapTRKPT> mapTRKSEG = new TreeMap<Long, ElementMapTRKPT>();\r
         Element trk = null;\r
         gpx    = builder.parse(gpxFile).getFirstChild();\r
         document = gpx.getOwnerDocument();\r
@@ -397,90 +395,68 @@ 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
                 for (int i1=0; i1 < nodes1.getLength(); i1++) {\r
                     Node nodeTRKSEG = nodes1.item(i1);\r
                     if (nodeTRKSEG.getNodeName().equals("trkseg")) {\r
-                       Element newTRKSEG = document.createElement("trkseg");\r
-                        Element trkseg = (Element) nodeTRKSEG;\r
-                        NodeList nodes2 = trkseg.getChildNodes();\r
-                               long trksegStartTimeL = (new Date()).getTime();         // 対象とする開始時刻(現在時刻)\r
+                       //Element newTRKSEG = document.createElement("trkseg");\r
+                        NodeList nodes2 = nodeTRKSEG.getChildNodes();\r
+                        \r
+                        ElementMapTRKPT mapTRKPT = new ElementMapTRKPT();\r
+                               Date trksegStartTime = new Date();                              // 対象とする開始時刻(現在時刻)\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
+                                Date time = mapTRKPT.put(getCopy(document, nodeTRKPT));\r
+                                       if (trksegStartTime.compareTo(time) < 0) {\r
+                                               trksegStartTime = time;\r
+                                       }\r
                             }\r
                         }\r
 \r
                         // <trk>から<trkseg>を削除する。\r
-                        trk.removeChild(nodeTRKSEG);\r
+                        //trk.removeChild(nodeTRKSEG);\r
 \r
                         // <trk>に、新たな<trkseg>を追加する。\r
-                        trk.appendChild(newTRKSEG);\r
+                        //trk.appendChild(newTRKSEG);\r
 \r
-                        mapTRKSEG.put(gpxStartTimeL, getCopy(document, newTRKSEG));\r
+                       System.out.println("\tdebug: mapTRKSEG.put(k=" + dfjp.format(trksegStartTime) +", mapTRKPT)");\r
+                        mapTRKSEG.put(trksegStartTime.getTime(), mapTRKPT);\r
+                        //newTRKSEG = null;\r
                     }\r
                 }\r
             }\r
         }\r
         \r
         // mapTRKSEGに時間順に格納された<trkseg>を順次ひとつづつ処理する\r
-        for (Entry<Long, Element> mapEntry : mapTRKSEG.entrySet()) {\r
-               Element newTRKSEG = mapEntry.getValue();\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, mapTRKSEG, exif, gpx);\r
+        for (Map.Entry<Long, ElementMapTRKPT> mapEntry : mapTRKSEG.entrySet()) {\r
+               System.out.println("\tdebug: k=" + dfjp.format(new Date(mapEntry.getKey().longValue())));\r
+               \r
+               ElementMapTRKPT mapPT = mapEntry.getValue();\r
             \r
-            // mapTRKPTに、<trkpt>を割り付ける\r
-            trkptMap(newTRKSEG, mapTRKPT);\r
-\r
             // <trkseg>の開始時刻と終了時刻を求める\r
-               long segStartTimeL = (new Date()).getTime();    // <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
+               for (Entry<Date, Element> entryPT : mapPT.entrySet()) {\r
+                       Date key = entryPT.getKey();\r
+                       if (segStartTimeL > key.getTime()) {\r
+                            segStartTimeL = key.getTime();\r
                        }\r
-                       if (segEndTimeL < gpxTime) {\r
-                            segEndTimeL = gpxTime;\r
+                       if (segEndTimeL < key.getTime()) {\r
+                            segEndTimeL = key.getTime();\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
+               //proc(imgDir, delta, segStartTimeL, segEndTimeL, mapPT, exif, gpx);\r
         }\r
                System.out.println("|--------------------------------|--------------------|--------------------|--------------|--------------|--------|------|------|");\r
 \r
@@ -508,7 +484,7 @@ public class ImportPicture extends Thread {
      * @throws ImageReadException \r
      * @throws ImageWriteException \r
      */\r
-    boolean proc(File dir, long delta, long gpxStartTime, long gpxEndTime, TreeMap<Long,Element> map, boolean exifWrite, Node gpx) throws ParseException, ImageReadException, IOException, ImageWriteException {\r
+    boolean proc(File dir, long delta, TreeMap<Long,ElementMapTRKPT> mapTRKSEG, boolean exifWrite, Node gpx) throws ParseException, ImageReadException, IOException, ImageWriteException {\r
         DecimalFormat yearFormatter = new DecimalFormat("0000");\r
         DecimalFormat monthFormatter = new DecimalFormat("00");\r
         DecimalFormat dayFormatter = new DecimalFormat("00");\r
@@ -519,7 +495,7 @@ public class ImportPicture extends Thread {
         for (File image : files) {\r
             System.out.print(String.format("|%-32s|", image.getName()));\r
             if (image.isDirectory()) {\r
-                ret = proc(image, delta, gpxStartTime, gpxEndTime, map, exifWrite, gpx);\r
+                ret = proc(image, delta, mapTRKSEG, exifWrite, gpx);\r
                 continue;\r
             }\r
             \r
@@ -529,6 +505,8 @@ public class ImportPicture extends Thread {
                continue;\r
             }\r
             \r
+            // itime <-- 画像ファイルの撮影時刻\r
+            //                 ファイルの更新日時/EXIFの撮影日時\r
             Date itime = new Date(image.lastModified());\r
             if (this.exifBase) {\r
                 ImageMetadata meta = Imaging.getMetadata(image);\r
@@ -546,20 +524,23 @@ public class ImportPicture extends Thread {
                long lastModifyTime = (new SimpleDateFormat("yyyy:MM:dd HH:mm:ss")).parse(dateTimeOriginal).getTime();\r
                itime = new Date(lastModifyTime);\r
             }\r
+            System.out.print(String.format("%20s ", dfjp.format(itime)));\r
 \r
-            // uktime <-- 画像撮影時刻に対応するGPX時刻\r
+            // uktime <-- 画像撮影時刻に対応するGPX時刻(補正日時)\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
             if ((uktime.getTime() < gpxStartTime) || (uktime.getTime() > gpxEndTime)) {\r
                 System.out.println(String.format("%20s ", "out of time."));\r
                 if (!this.param_ImgOutputAll) {\r
                        continue;\r
                 }\r
             }\r
+            */\r
 \r
                // 時刻uktimeにおける<magver>をtrkptに追加する\r
-            Element trkptE = trkpt(map, uktime);\r
+            Element trkptE = mapTRKPT.get(uktime);\r
             String eleStr = "-";\r
             String magvarStr = "-";\r
             String speedStr = "-";\r
@@ -574,10 +555,6 @@ public class ImportPicture extends Thread {
             }\r
             else {\r
                 trkptT = new TagTrkpt(trkptE);\r
-\r
-               //Element wpt = createWptTag(image, uktime.getTime(), trkptE);\r
-                //String latStr = trkptT.lat.toString();\r
-                //String lonStr = trkptT.lon.toString();\r
                 latitude = trkptT.lat;\r
                 longitude = trkptT.lon;\r
                 \r
@@ -768,6 +745,7 @@ public class ImportPicture extends Thread {
      * @param map\r
      * @throws ParseException\r
      */\r
+    /*\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
@@ -804,104 +782,14 @@ public class ImportPicture extends Thread {
         }\r
                return gpxStartTimeL;\r
     }\r
+    */\r
 \r
-    \r
-    /**\r
-     * <trkpt lat="35.32123832" lon="139.56965631">\r
-     *          <ele>47.20000076293945</ele>\r
-     *          <time>2012-06-15T03:00:29Z</time>\r
-     * </trkpt>\r
-     *DIFF_MAE_TIME\r
-     * @return\r
-     * @param map\r
-     * @param jptime   画像ファイルの撮影日時 ミリ秒(日本時間)\r
-     * @throws ParseException\r
-     */\r
-    public Element trkpt(TreeMap<Long,Element> map, Date jptime) throws ParseException {\r
-       // 指定した時刻のエレメント(imaTrkpt)を取得する\r
-        Element imaE = getTrkpt(map, jptime);\r
-        if (imaE != null) {\r
-               Element maeE = getMaeTrkpt(map, new TagTrkpt(imaE));\r
-            if (maeE != null) {\r
-               Complementation comp = new Complementation(imaE, maeE);\r
-\r
-                // <MAGVAR>がなければ、\r
-                // 直前の位置と、現在地から進行方向を求める\r
-               // 経度(longitude)と経度から進行方向を求める\r
-                if (Complementation.param_GpxOverwriteMagvar) {\r
-                       comp.complementationMagvar();\r
-                }\r
 \r
-                // 緯度・経度と時間差から速度(km/h)を求める\r
-                if (Complementation.param_GpxOutputSpeed) {\r
-                       comp.complementationSpeed();\r
-                }\r
-                imaE = (Element)(comp.imaTag.trkpt.cloneNode(true));\r
-            }\r
-        }\r
-        return imaE;\r
-    }\r
-\r
-    /**\r
-     * [map]から指定した時刻の<trkpt>エレメントを取り出す。\r
-     * GPX時刻との差が10分以上は無効\r
-     * \r
-     * @param map\r
-     * @param jptime\r
-     * @return\r
-     * @throws ParseException\r
-     */\r
-    public Element getTrkpt(TreeMap<Long,Element> map, Date jptime) throws ParseException {\r
-        long sa = 2L * 3600000L;\r
-        long jpt = jptime.getTime();\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;\r
 \r
-            if (Math.abs(jpt - t) < sa) {\r
-                sa = Math.abs(jpt - t);\r
-                ret = map.get(time);\r
-            }\r
-        }\r
-\r
-        if (sa < (60000L * 10L)) {\r
-               // GPX時刻との差が10分以内なら有効\r
-            return ret;\r
-        }\r
-        return null;\r
-    }\r
 \r
-    public Element getMaeTrkpt(TreeMap<Long,Element> map, TagTrkpt imaTrkpt) throws ParseException {\r
-        Element ret = null;\r
-        long diffTime = 2L * 3600000L;         // 2時間\r
-        long jpt = imaTrkpt.time.getTime() - DIFF_MAE_TIME;\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;\r
 \r
-            if (Math.abs(jpt - t) < diffTime) {\r
-               diffTime = Math.abs(jpt - t);\r
-                ret = map.get(time);\r
-            }\r
-        }\r
 \r
-        if (diffTime < (60000L * 10L)) {\r
-               // GPX時刻との差が10分以内なら有効\r
-               if (diffTime < (imaTrkpt.time.getTime() - 1000)) {\r
-                       // 元の時刻との差が1秒以上あること\r
-                return ret;\r
-               }\r
-        }\r
-        return null;\r
-    }\r
     \r
     /**\r
      * 対象は '*.JPG' のみ対象とする\r
diff --git a/importPicture/src/osm/jp/gpx/TimeComparator.java b/importPicture/src/osm/jp/gpx/TimeComparator.java
new file mode 100644 (file)
index 0000000..76c4547
--- /dev/null
@@ -0,0 +1,21 @@
+package osm.jp.gpx;
+
+import java.util.Comparator;
+import java.util.Date;
+
+/**
+ * java.util.Date型をコレクションのKEYにした時に、時間順に並べ替える
+ * 
+ * @author yuu
+ */
+public class TimeComparator implements Comparator<Date> 
+{
+       /**
+        * 日付順にソート
+        */
+       @Override
+       public int compare(Date arg0, Date arg1) {
+               return arg0.compareTo(arg1);
+       }
+
+}
diff --git a/importPicture/test/osm/jp/gpx/ElementMapTRKPTTest.java b/importPicture/test/osm/jp/gpx/ElementMapTRKPTTest.java
new file mode 100644 (file)
index 0000000..e021131
--- /dev/null
@@ -0,0 +1,71 @@
+package osm.jp.gpx;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Iterator;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.experimental.runners.Enclosed;
+import org.junit.runner.RunWith;
+
+@RunWith(Enclosed.class)
+public class ElementMapTRKPTTest {
+       public static class 時間順にプットされない場合 {
+               SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
+               ElementMapTRKPT map = null;
+               long timeL;
+               static String[] values = {
+                               "1970-01-01 08:59:59.999",
+                               "1970-01-01 09:00:00.000",
+                               "1970-01-01 09:00:00.001",
+                               "2018-10-25 07:59:59.999",
+                               "2018-10-25 08:00:00.000",
+                               "2018-10-25 08:00:00.001"
+               };
+                               
+               @Before
+               public void setUp() throws Exception {
+                       timeL = (sdf.parse("2018-10-25 08:00:00.000")).getTime();
+                       map = new ElementMapTRKPT();
+                       map.put(new Date(timeL), null);                 // 5-6: 2018-10-25 08:00:00.000
+                       map.put(new Date(timeL + 1L), null);    // 7: 2018-10-25 08:00:00.001
+                       map.put(new Date(timeL - 1L), null);    // 4: 2018-10-25 07:59:59.999
+                       map.put(new Date(1L), null);                    // 3: 1970-01-01 09:00:00.001
+                       map.put(new Date(0L), null);                    // 2: 1970-01-01 09:00:00.000
+                       map.put(new Date(-1L), null);                   // 1: 1970-01-01 08:59:59.999
+                       map.put(new Date(timeL), null);                 // 5-6: 2018-10-25 08:00:00.000
+               }
+               
+               @Test
+               public void 同一キーをPUTした場合() {
+                       assertThat(map.size(), is(6));
+               }
+
+               @Test
+               public void イテレータを使って読みだす() {
+                       assertThat(map.size(), is(6));
+
+                       int i = 0;
+                       for (Iterator<Date> itr = map.keySet().iterator(); itr.hasNext(); ) {
+                               Date key = itr.next();
+                               assertThat(sdf.format(key), is(values[i++]));
+                       }
+               }
+
+               @Test
+               public void 拡張FOR文を使って読みだす() {
+                       assertThat(map.size(), is(6));
+
+                       int i = 0;
+                       for (Date key : map.keySet()) {
+                               assertThat(sdf.format(key), is(values[i++]));
+                       }
+               }
+       }
+       
+
+}