Newer
Older
adjustgpx-core / src / osm / jp / gpx / ElementMapTRKPT.java
@haya4 haya4 on 18 Aug 2019 5 KB Java11 - AdjustTime2
  1. package osm.jp.gpx;
  2.  
  3. import java.text.ParseException;
  4. import java.util.Date;
  5. import java.util.TreeMap;
  6.  
  7. import org.w3c.dom.DOMException;
  8.  
  9. @SuppressWarnings("serial")
  10. public class ElementMapTRKPT extends TreeMap<Date, TagTrkpt> {
  11. public static final long DIFF_MAE_TIME = 3000L; // before 3 secound
  12.  
  13. public ElementMapTRKPT() {
  14. super(new TimeComparator());
  15. }
  16.  
  17. /**
  18. * 拡張put value:ElementをputするとElement内のtimeを読み取ってkeyとしてthis.put(key,value)する。
  19. * @param tag
  20. * @code{
  21. * <trkpt lat="36.4260153752" lon="138.0117778201">
  22. * <ele>614.90</ele>
  23. * <time>2017-05-21T23:02:16Z</time>
  24. * <hdop>0.5</hdop>
  25. * </trkpt>
  26. * }
  27. * @return keyとして登録したtime:Date
  28. * @throws ParseException
  29. * @throws DOMException
  30. */
  31. public Date put(TagTrkpt tag) throws DOMException, ParseException {
  32. this.put(tag.time, tag);
  33. return tag.time;
  34. }
  35.  
  36. /**
  37. * 指定時刻(jptime)のTRKPTエレメントを取り出す。
  38. *
  39. * @param jptime 指定する日時
  40. * @return エレメントTRKPT。指定時刻に対応するノードがないときはnullを返す。
  41. * @throws ParseException
  42. */
  43. public TagTrkpt getValue(Date jptime) throws ParseException {
  44. TagTrkpt imaE = getTrkpt(jptime);
  45. if (imaE != null) {
  46. TagTrkpt maeE = getMaeTrkpt(imaE.time);
  47. if (maeE != null) {
  48. Complementation comp = new Complementation(imaE, maeE);
  49.  
  50. // <MAGVAR>がなければ、
  51. // 直前の位置と、現在地から進行方向を求める
  52. // 経度(longitude)と経度から進行方向を求める
  53. if (Complementation.param_GpxOverwriteMagvar) {
  54. comp.complementationMagvar();
  55. }
  56.  
  57. // 緯度・経度と時間差から速度(km/h)を求める
  58. if (Complementation.param_GpxOutputSpeed) {
  59. comp.complementationSpeed();
  60. }
  61. //return (TagTrkpt)(comp.imaTag.trkpt.cloneNode(true));
  62. return (TagTrkpt)(comp.imaTag);
  63. }
  64. return imaE;
  65. }
  66. return null;
  67. }
  68. /**
  69. * [map]から指定した時刻の<trkpt>エレメントを取り出す。
  70. * 取り出すエレメントは、指定した時刻と同一時刻、もしくは、直近・直前の時刻のエレメントとする。
  71. * 指定した時刻以前のエレメントが存在しない場合は null を返す。
  72. * 指定した時刻と直近・直前のエレメントの時刻との乖離が プロパティ[OVER_TIME_LIMIT=3000(ミリ秒)]より大きい場合には null を返す。
  73. *
  74. * @param jptime
  75. * @return <trkpt>エレメント。対象のエレメントが存在しなかった場合には null。
  76. * @throws ParseException
  77. */
  78. private TagTrkpt getTrkpt(Date jptime) throws ParseException {
  79. Date keyTime = null;
  80. for (Date key : this.keySet()) {
  81. int flag = jptime.compareTo(key);
  82. if (flag < 0) {
  83. if (keyTime != null) {
  84. return this.get(keyTime);
  85. }
  86. return null;
  87. }
  88. else if (flag == 0) {
  89. return this.get(key);
  90. }
  91. else if (flag > 0) {
  92. keyTime = new Date(key.getTime());
  93. }
  94. }
  95. if (keyTime != null) {
  96. if (Math.abs(keyTime.getTime() - jptime.getTime()) <= OVER_TIME_LIMIT) {
  97. return this.get(keyTime);
  98. }
  99. }
  100. return null;
  101. }
  102. /**
  103. * ロガーの最終取得時刻を超えた場合、どこまでを有効とするかを設定する。
  104. * この設定がないと、最終取得時刻を超えたものは全て有効になってしまう。
  105. * OVER_TIME_LIMITは、GPSロガーの位置取得間隔()よりも長くする必要がある。長すぎても良くない。
  106. */
  107. public static long OVER_TIME_LIMIT = 3000; // ミリ秒(msec)
  108. private TagTrkpt getMaeTrkpt(Date time) throws ParseException {
  109. Date maeTime = null;
  110. for (Date key : this.keySet()) {
  111. int flag = time.compareTo(key);
  112. if (flag > 0) {
  113. maeTime = new Date(key.getTime());
  114. }
  115. else if (flag == 0) {
  116. if (maeTime == null) {
  117. return null;
  118. }
  119. return this.get(maeTime);
  120. }
  121. else {
  122. // time は key より古い
  123. if (maeTime == null) {
  124. return null;
  125. }
  126. if (Math.abs(maeTime.getTime() - time.getTime()) > OVER_TIME_LIMIT) {
  127. return null;
  128. }
  129. return this.get(maeTime);
  130. }
  131. }
  132. return null;
  133. }
  134. public void printinfo() {
  135. Date firstTime = null;
  136. Date lastTime = null;
  137. for (Date key : this.keySet()) {
  138. if (firstTime == null) {
  139. firstTime = new Date(key.getTime());
  140. }
  141. lastTime = new Date(key.getTime());
  142. }
  143. System.out.println(String.format("| <trkseg/> |%20s|%20s|", ImportPicture.toUTCString(firstTime), ImportPicture.toUTCString(lastTime)));
  144. }
  145. }