OSDN Git Service

3秒間隔でspeedとmagvarを算出する
authoryuuhayashi <hayashi.yuu@gmail.com>
Sat, 29 Oct 2016 03:18:49 +0000 (12:18 +0900)
committeryuuhayashi <hayashi.yuu@gmail.com>
Sat, 29 Oct 2016 03:18:49 +0000 (12:18 +0900)
AdjustTime.ini
importPicture/src/osm/jp/gpx/Complementation.java
importPicture/src/osm/jp/gpx/ImportPicture.java
importPicture/src/osm/jp/gpx/TagTrkpt.java [new file with mode: 0644]

index 979341a..fae4bfb 100644 (file)
@@ -1,11 +1,16 @@
 #by AdjustTime
-#Thu Jun 30 23:11:20 JST 2016
+#Sat Oct 29 09:48:44 JST 2016
 GPX.BASETIME=EXIF_TIME
-GPX.noFirstNode=ON
+IMG.OUTPUT_EXIF=true
+GPX.OUTPUT_SPEED=true
+GPX.OUTPUT_WPT=false
+GPX.noFirstNode=true
+IMG.OUTPUT=true
 GPX.gpxSplit=ON
-IMG.TIME=2016-01-03T15\:14\:04
-GPX.REUSE=ON
-IMG.BASE_FILE=S2690002.JPG
-IMG.SOURCE_FOLDER=/media/yuu/public/osm/GPXs/\u7DBE\u702C\u5E02\u5409\u5CA1_20160103
-GPX.SOURCE_FOLDER=/media/yuu/public/osm/GPXs/\u7DBE\u702C\u5E02\u5409\u5CA1_20160103
-IMG.OUTPUT_FOLDER=/media/yuu/public/osm/GPXs/\u7DBE\u702C\u5E02\u5409\u5CA1_20160103
+GPX.OVERWRITE_MAGVAR=true
+IMG.TIME=2016-08-14T11\:45\:47
+GPX.REUSE=false
+IMG.BASE_FILE=IMG_0182.jpg
+IMG.SOURCE_FOLDER=/media/yuu/public/osm/GPXs/Taibousaki
+GPX.SOURCE_FOLDER=/media/yuu/public/osm/GPXs/Taibousaki
+IMG.OUTPUT_FOLDER=/media/yuu/public/osm/GPXs/Taibousaki
index a70daaf..24a753c 100644 (file)
@@ -1,13 +1,18 @@
 package osm.jp.gpx;
 
 import java.text.ParseException;
-
 import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
 
 public class Complementation {
+    public static final Double R = (6378137D + 6356752.314D)/2D;       // 6367444.657m
+    //public static final double dLat = 0.00453D;                      // 1km距離を表す緯度(差分)
+    //public static final double dLon = 0.005588D;             // 1km距離を表す経度(差分)
+    
+    public TagTrkpt imaTag = null;
+    public TagTrkpt maeTag = null;
+    public static boolean param_GpxOutputSpeed = false;
+    public static boolean param_GpxOverwriteMagvar = false;
+    
 
     /**
      * 
@@ -23,98 +28,39 @@ public class Complementation {
      * @throws ParseException
      */
        public Complementation(Element imaE, Element maeE) throws ParseException {
-        // <MAGVAR>がなければ、
-        // 直前の位置と、現在地から進行方向を求める
-        NodeList nodes3 = imaE.getChildNodes();
-        magvar = null;
-        speed = null;
-        for (int i3=0; i3 < nodes3.getLength(); i3++) {
-            Node node4 = nodes3.item(i3);
-            String nodename = node4.getNodeName().toLowerCase();
-            if (nodename.equals("magvar")) {
-               magvar = (Element)node4;
-                break;
-            }
-            else if (nodename.equals("speed")) {
-               speed = (Element)node4;
-                break;
-            }
-            else if (nodename.equals("time")) {
-                String timeStr = ((Element)node4).getTextContent();
-                setImaTIME(ImportPicture.dfuk.parse(timeStr).getTime());
-                break;
-            }
-        }
-        
-        NamedNodeMap nodeMap = imaE.getAttributes();
-        for (int j=0; j < nodeMap.getLength(); j++ ) {
-            switch (nodeMap.item(j).getNodeName()) {
-                case "lat":
-                    String latStr = nodeMap.item(j).getNodeValue();
-                    imaLAT = new Double(latStr);
-                    break;
-                case "lon":
-                    String lonStr = nodeMap.item(j).getNodeValue();
-                    imaLON = new Double(lonStr);
-                    break;
-            }
-        }
-
+               this.imaTag = new TagTrkpt(imaE);
         if (maeE != null) {
-            nodes3 = maeE.getChildNodes();
-            for (int i3=0; i3 < nodes3.getLength(); i3++) {
-                Node node4 = nodes3.item(i3);
-                if (node4.getNodeName().toLowerCase().equals("time")) {
-                    String timeStr = node4.getTextContent();
-                    setMaeTIME(ImportPicture.dfuk.parse(timeStr).getTime());
-                    break;
-                }
-            }
-
-            nodeMap = maeE.getAttributes();
-            for (int j=0; j < nodeMap.getLength(); j++ ) {
-                switch (nodeMap.item(j).getNodeName()) {
-                    case "lat":
-                        String latStr = nodeMap.item(j).getNodeValue();
-                        maeLAT = new Double(latStr);
-                        break;
-                    case "lon":
-                        String lonStr = nodeMap.item(j).getNodeValue();
-                        maeLON = new Double(lonStr);
-                        break;
-                }
-            }
+               this.maeTag = new TagTrkpt(maeE);
         }
        }
 
-    public static final Double R = (6378137D + 6356752.314D)/2D;       // 6367444.657m
-    //public static final double dLat = 0.00453D;                      // 1km距離を表す緯度(差分)
-    //public static final double dLon = 0.005588D;             // 1km距離を表す経度(差分)
-
-    public long imaTIME = 0L;
-    public long maeTIME = 0L;
-    public Double maeLAT = null;
-    public Double maeLON = null;
-    public Double imaLAT = null;
-    public Double imaLON =null;
-    public Element magvar = null;
-    public Element speed = null;
-    
     
     /**
      * 緯度・経度と時間差から速度(m/sec)を求める
      * 
      */
-    public void complementationSpeed(Element imaE) throws ParseException {
-        Element speed = imaE.getOwnerDocument().createElement("speed");
-       double d = Coords.calcDistHubeny(imaLAT, imaLON, maeLAT, maeLON);
-        String str = Double.toString((d * 1000) / (imaTIME - maeTIME));
-        int iDot = str.indexOf('.');
-        if (iDot > 0) {
-            str = str.substring(0, iDot+2);
-        }
-        speed.setTextContent(str);
-        imaE.appendChild(speed);
+    public void complementationSpeed() {
+       if (imaTag.speedStr != null)  {
+               try {
+               Double.parseDouble(imaTag.speedStr);
+               }
+               catch (NumberFormatException e) {
+                       // 数字以外なら<speed>エレメントを削除する
+                       imaTag.removeElement("speed");
+                       imaTag.speedStr = null;
+               }
+       }
+       
+       if (imaTag.speedStr == null)  {
+               double d = Coords.calcDistHubeny(imaTag.lat, imaTag.lon, maeTag.lat, maeTag.lon);
+            String str = Double.toString((d * 1000) / (imaTag.time.getTime() - maeTag.time.getTime()));
+            int iDot = str.indexOf('.');
+            if (iDot > 0) {
+                str = str.substring(0, iDot+2);
+            }
+            imaTag.appendElement("speed", str);
+            imaTag.speedStr = new String(str);
+       }
     }
 
     /**
@@ -128,90 +74,48 @@ public class Complementation {
      * @param maeTIME
      * @throws ParseException
      */
-    public void complementationMagvar(Element imaE) throws ParseException {
-        Double r = Math.cos(Math.toRadians((imaLAT + maeLAT) / 2)) * R;
-        Double x = Math.toRadians(imaLON - maeLON) * r;
-        Double y = Math.toRadians(imaLAT - maeLAT) * R;
-        double rad = Math.toDegrees(Math.atan2(y, x));
-        
-        if (y >= 0) {
-            if (x >= 0) {
-                rad = 0 - (rad - 90);
-            }
-            else {
-                rad = 360 - (rad - 90);
-            }
-        }
-        else {
-            if (x >= 0) {
-                rad = 90 - rad;
+    public void complementationMagvar() throws ParseException {
+       if (imaTag.magvarStr != null) {
+               try {
+               Double.parseDouble(imaTag.magvarStr);
+               }
+               catch (NumberFormatException e) {
+                       // 数字以外なら<magvar>エレメントを削除する
+                       imaTag.removeElement("magvar");
+                       imaTag.magvarStr = null;
+               }
+       }
+       
+       if (imaTag.magvarStr == null) {
+            Double r = Math.cos(Math.toRadians((imaTag.lat + maeTag.lat) / 2)) * R;
+            Double x = Math.toRadians(imaTag.lon - maeTag.lon) * r;
+            Double y = Math.toRadians(imaTag.lat - maeTag.lat) * R;
+            double rad = Math.toDegrees(Math.atan2(y, x));
+            
+            if (y >= 0) {
+                if (x >= 0) {
+                    rad = 0 - (rad - 90);
+                }
+                else {
+                    rad = 360 - (rad - 90);
+                }
             }
             else {
-                rad = 90 - rad;
+                if (x >= 0) {
+                    rad = 90 - rad;
+                }
+                else {
+                    rad = 90 - rad;
+                }
             }
-        }
 
-        Element magvar = imaE.getOwnerDocument().createElement("magvar");
-        String str = Double.toString(rad);
-        int iDot = str.indexOf('.');
-        if (iDot > 0) {
-            str = str.substring(0, iDot);
-        }
-        magvar.setTextContent(str);
-        imaE.appendChild(magvar);
+            String str = Double.toString(rad);
+            int iDot = str.indexOf('.');
+            if (iDot > 0) {
+                str = str.substring(0, iDot);
+            }
+            imaTag.appendElement("magvar", str);
+            imaTag.magvarStr = new String(str);
+       }
     }
-
-       public long getImaTIME() {
-               return imaTIME;
-       }
-
-       public void setImaTIME(long imaTIME) {
-               this.imaTIME = imaTIME;
-       }
-
-       public long getMaeTIME() {
-               return maeTIME;
-       }
-
-       public void setMaeTIME(long maeTIME) {
-               this.maeTIME = maeTIME;
-       }
-
-       public Double getMaeLAT() {
-               return maeLAT;
-       }
-
-       public void setMaeLAT(Double maeLAT) {
-               this.maeLAT = maeLAT;
-       }
-
-       public Double getMaeLON() {
-               return maeLON;
-       }
-
-       public void setMaeLON(Double maeLON) {
-               this.maeLON = maeLON;
-       }
-
-       public int getMagvar() {
-        String magvarStr = magvar.getTextContent();
-               return Integer.getInteger(magvarStr);
-       }
-
-       public Double getImaLAT() {
-               return imaLAT;
-       }
-
-       public void setImaLAT(Double imaLAT) {
-               this.imaLAT = imaLAT;
-       }
-
-       public Double getImaLON() {
-               return imaLON;
-       }
-
-       public void setImaLON(Double imaLON) {
-               this.imaLON = imaLON;
-       }
-
 }
index c28da45..c03faaf 100644 (file)
@@ -184,12 +184,12 @@ public class ImportPicture extends Thread {
        \r
        paramStr = obj.params.getProperty(AppParameters.GPX_OVERWRITE_MAGVAR);\r
        if ((paramStr != null) && (paramStr.equals(Boolean.toString(true)))) {\r
-               obj.param_GpxOverwriteMagvar = true;\r
+               Complementation.param_GpxOverwriteMagvar = true;\r
        }\r
 \r
        paramStr = obj.params.getProperty(AppParameters.GPX_OUTPUT_SPEED);\r
        if ((paramStr != null) && (paramStr.equals(Boolean.toString(true)))) {\r
-               obj.param_GpxOutputSpeed = true;\r
+               Complementation.param_GpxOutputSpeed = true;\r
        }\r
 \r
        paramStr = obj.params.getProperty(AppParameters.GPX_SOURCE_FOLDER);\r
@@ -246,8 +246,8 @@ public class ImportPicture extends Thread {
         System.out.println(" - param: "+ AppParameters.IMG_OUTPUT_EXIF +"= "+ String.valueOf(obj.exif));\r
         System.out.println(" - param: "+ AppParameters.GPX_SOURCE_FOLDER +"="+ obj.param_GpxSourceFolder);\r
         System.out.println(" - param: "+ AppParameters.GPX_OUTPUT_WPT +"="+ obj.param_GpxOutputWpt);\r
-        System.out.println(" - param: "+ AppParameters.GPX_OVERWRITE_MAGVAR +"="+ obj.param_GpxOverwriteMagvar);\r
-        System.out.println(" - param: "+ AppParameters.GPX_OUTPUT_SPEED +"="+ obj.param_GpxOutputSpeed);\r
+        System.out.println(" - param: "+ AppParameters.GPX_OVERWRITE_MAGVAR +"="+ Complementation.param_GpxOverwriteMagvar);\r
+        System.out.println(" - param: "+ AppParameters.GPX_OUTPUT_SPEED +"="+ Complementation.param_GpxOutputSpeed);\r
         obj.start();\r
         try {\r
             obj.join();                            \r
@@ -265,10 +265,11 @@ public class ImportPicture extends Thread {
        public boolean param_GpxSplit = false;\r
        public boolean param_GpxNoFirstNode = false;\r
        public boolean param_GpxReuse = false;\r
-       public boolean param_GpxOutputSpeed = false;\r
-       public boolean param_GpxOverwriteMagvar = false;\r
+       //public boolean Complementation.param_GpxOutputSpeed = false;\r
+       //public boolean Complementation.param_GpxOverwriteMagvar = false;\r
        public boolean param_GpxOutputWpt = true;\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
@@ -357,7 +358,7 @@ public class ImportPicture extends Thread {
         TreeMap<Long,Element> map = new TreeMap<>();\r
         TreeMap<Long,Element> mapTRKSEG = new TreeMap<>();\r
         Element trk = null;\r
-        Element maeTRKPT = null;\r
+        //Element maeTRKPT = null;\r
         gpx    = builder.parse(gpxFile).getFirstChild();\r
         Document doc = gpx.getOwnerDocument();\r
         NodeList nodes = gpx.getChildNodes();\r
@@ -381,26 +382,6 @@ public class ImportPicture extends Thread {
                                if (param_GpxNoFirstNode && (i2 == 0)) {\r
                                        continue;\r
                                }\r
-                               if (param_GpxOutputSpeed || param_GpxOverwriteMagvar) {\r
-                                       Complementation cmp = new Complementation((Element)nodeTRKPT, maeTRKPT);\r
-                                       if (param_GpxOutputSpeed) {\r
-                                               if (cmp.speed != null) {\r
-                                                       nodeTRKPT.removeChild(cmp.speed);\r
-                                               }\r
-                                               if (maeTRKPT != null) {\r
-                                                       cmp.complementationSpeed((Element)nodeTRKPT);\r
-                                               }\r
-                                       }\r
-                                       if (param_GpxOverwriteMagvar) {\r
-                                               if (cmp.magvar != null) {\r
-                                                       nodeTRKPT.removeChild(cmp.magvar);\r
-                                               }\r
-                                               if (maeTRKPT != null) {\r
-                                                       cmp.complementationMagvar((Element)nodeTRKPT);\r
-                                               }\r
-                                       }\r
-                               }\r
-                                maeTRKPT = getCopy(doc, nodeTRKPT);\r
                                newTRKSEG.appendChild(getCopy(doc, nodeTRKPT));\r
                             }\r
                         }\r
@@ -523,40 +504,36 @@ public class ImportPicture extends Thread {
             }\r
 \r
                // 時刻uktimeにおける<magver>をtrkptに追加する\r
-            Element trkpt = trkpt(map, uktime);\r
-            if (trkpt == null) {\r
+            Element trkptE = trkpt(map, uktime);\r
+            if (trkptE == null) {\r
                 System.out.println(String.format("%20s ", "Out of GPX logging time."));\r
                continue;\r
             }\r
-            \r
-            Element wpt = createWptTag(image, uktime.getTime(), trkpt);\r
-            String latStr = wpt.getAttribute("lat");\r
-            String lonStr = wpt.getAttribute("lon");\r
-            double latitude = Double.parseDouble(latStr);\r
-            double longitude = Double.parseDouble(lonStr);\r
+\r
+            TagTrkpt 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
+            double latitude = trkptT.lat;\r
+            double longitude = trkptT.lon;\r
             \r
             String eleStr = "-";\r
+            if (trkptT.eleStr != null) {\r
+               eleStr = new String(trkptT.eleStr);\r
+            }\r
+            \r
             String magvarStr = "-";\r
+            if (trkptT.magvarStr != null) {\r
+               magvarStr = new String(trkptT.magvarStr);\r
+            }\r
+            \r
             String speedStr = "-";\r
-            NodeList nodes = wpt.getChildNodes();      // 子ノードを取得\r
-            for (int i4 = 0; i4 < nodes.getLength(); i4++) {\r
-                Node node = nodes.item(i4);\r
-                if (node != null) {\r
-                    switch (node.getNodeName()) {\r
-                        case "ele":\r
-                            eleStr = node.getFirstChild().getNodeValue();\r
-                            break;\r
-                        case "magvar":\r
-                            magvarStr = node.getFirstChild().getNodeValue();\r
-                            break;\r
-                        case "speed":\r
-                            speedStr = node.getFirstChild().getNodeValue();\r
-                            break;\r
-                    }\r
-                }\r
+            if (trkptT.speedStr != null) {\r
+               speedStr = new String(trkptT.speedStr);\r
             }\r
 \r
-            System.out.print(String.format("%12s %12s|", latStr, lonStr));\r
+            System.out.print(String.format("%12s %12s|", (new Double(latitude)).toString(), (new Double(longitude)).toString()));\r
             System.out.println(String.format("%8s|%6s|%s|", eleStr, magvarStr, speedStr));\r
             ret = true;\r
 \r
@@ -675,7 +652,7 @@ public class ImportPicture extends Thread {
             }\r
 \r
             if (Boolean.parseBoolean(params.getProperty(AppParameters.GPX_OUTPUT_WPT))) {\r
-                Element temp = getCopy(gpx.getOwnerDocument(), wpt);\r
+                Element temp = getCopy(gpx.getOwnerDocument(), trkptT.trkpt);\r
                 gpx.appendChild(temp);\r
             }\r
         }\r
@@ -744,16 +721,51 @@ public class ImportPicture extends Thread {
      *          <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
+                // 緯度・経度と時間差から速度(m/sec)を求める\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
-        Element mae = null;\r
 \r
         Set<Long> keySet = map.keySet();  //すべてのキー値を取得\r
         Iterator<Long> keyIte = keySet.iterator();\r
@@ -764,26 +776,7 @@ public class ImportPicture extends Thread {
             if (Math.abs(jpt - t) < sa) {\r
                 sa = Math.abs(jpt - t);\r
                 ret = map.get(time);\r
-\r
-                // <MAGVAR>がなければ、\r
-                // 直前の位置と、現在地から進行方向を求める\r
-                Element magvar = null;\r
-\r
-                if (mae != null) {\r
-                       Complementation obj = new Complementation(ret, mae);\r
-\r
-                    // 経度(longitude)と経度から進行方向を求める\r
-                    if ((magvar == null) || param_GpxOverwriteMagvar) {\r
-                       obj.complementationMagvar(ret);\r
-                    }\r
-\r
-                    // 緯度・経度と時間差から速度(m/sec)を求める\r
-                       obj.complementationSpeed(ret);\r
-                       \r
-                       magvar = obj.magvar;\r
-                }\r
             }\r
-            mae = map.get(time);\r
         }\r
 \r
         if (sa < (60000L * 10L)) {\r
@@ -793,7 +786,33 @@ public class ImportPicture extends Thread {
         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
      * @return \r
diff --git a/importPicture/src/osm/jp/gpx/TagTrkpt.java b/importPicture/src/osm/jp/gpx/TagTrkpt.java
new file mode 100644 (file)
index 0000000..453adf5
--- /dev/null
@@ -0,0 +1,122 @@
+package osm.jp.gpx;
+
+import java.text.ParseException;
+import java.util.Date;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * 
+ * <trkpt lat="35.32123832" lon="139.56965631">
+ *             <ele>47.20000076293945</ele>
+ *             <time>2012-06-15T03:00:29Z</time>
+ *             <magvar></magvar>
+ *             <speed></speed>
+ *     </trkpt>
+ *
+ * @author yuu
+ *
+ */
+public class TagTrkpt {
+       public Element trkpt = null;
+       public Double lat = null;
+       public Double lon = null;
+       public String eleStr = null;
+       public Date time = null;
+       public String magvarStr = null;
+       public String speedStr = null;
+
+       public TagTrkpt(Element trkpt) {
+               this.trkpt = (Element) trkpt.cloneNode(true);
+               
+        NamedNodeMap nodeMap = trkpt.getAttributes();
+        for (int j=0; j < nodeMap.getLength(); j++ ) {
+            switch (nodeMap.item(j).getNodeName()) {
+                case "lat":
+                    String latStr = nodeMap.item(j).getNodeValue();
+                    this.lat = new Double(latStr);
+                    break;
+                case "lon":
+                    String lonStr = nodeMap.item(j).getNodeValue();
+                    this.lon = new Double(lonStr);
+                    break;
+            }
+        }
+               
+        NodeList nodes1 = trkpt.getChildNodes();
+        for (int i1=0; i1 < nodes1.getLength(); i1++) {
+            Node node1 = nodes1.item(i1);
+            NodeList nodes2 = node1.getChildNodes();
+            switch (node1.getNodeName()) {
+            case "ele":
+                for (int i2=0; i2 < nodes2.getLength(); i2++) {
+                    Node node2 = nodes2.item(i2);
+                    if (node2 != null) {
+                        if (node2.getNodeType() == Node.TEXT_NODE) {
+                            this.eleStr = node2.getNodeValue();
+                        }
+                    }
+                }
+                break;
+            case "time":
+                for (int i2=0; i2 < nodes2.getLength(); i2++) {
+                    Node node2 = nodes2.item(i2);
+                    if (node2 != null) {
+                        if (node2.getNodeType() == Node.TEXT_NODE) {
+                            try {
+                                                               this.time = ImportPicture.dfuk.parse(node2.getNodeValue());
+                                                       } catch (ParseException e) {
+                                                               this.time = null;
+                                                       }
+                        }
+                    }
+                }
+                break;
+            case "magvar":
+                for (int i2=0; i2 < nodes2.getLength(); i2++) {
+                    Node node2 = nodes2.item(i2);
+                    if (node2 != null) {
+                        if (node2.getNodeType() == Node.TEXT_NODE) {
+                            this.magvarStr = node2.getNodeValue();
+                        }
+                    }
+                }
+                break;
+            case "speed":
+                for (int i2=0; i2 < nodes2.getLength(); i2++) {
+                    Node node2 = nodes2.item(i2);
+                    if (node2 != null) {
+                        if (node2.getNodeType() == Node.TEXT_NODE) {
+                            this.speedStr = node2.getNodeValue();
+                        }
+                    }
+                }
+                break;
+            }
+        }
+       }
+       
+    public void removeElement(String eleName) {
+               Node child;
+               for (child = trkpt.getFirstChild(); child != null; child = child.getNextSibling()) {
+                   NodeList nodeList = child.getChildNodes();
+                   for(int i = 0; i < nodeList.getLength(); i++) {
+                               Node grandChild = child.getChildNodes().item(i);
+                               if (grandChild.getNodeName().equals(eleName)) {
+                           child.removeChild(grandChild);
+                               }
+                   }
+               }
+    }
+    
+    public void appendElement(String eleName, String valueStr) {
+        Document doc = trkpt.getOwnerDocument();
+        Element newElement = doc.createElement(eleName);
+        newElement.setTextContent(valueStr);
+        trkpt.appendChild(newElement);
+    }
+}