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
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
* <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
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
* <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
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
}\r
}\r
}\r
+ return gpxStartTimeL;\r
}\r
\r
\r