- package osm.jp.gpx;
- import java.text.ParseException;
- 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;
- /**
- * @param imaE
- * @param maeE
- * @code{
- * <trkpt lat="34.976635" lon="138.466228">
- * <ele>267.291</ele>
- * <magvar>359</magvar>
- * <speed></speed>
- * <time>2016-07-02T08:25:18Z</time>
- * </trkpt>
- * }
- *
- *
- * @throws ParseException
- */
- public Complementation(TagTrkpt imaE, TagTrkpt maeE) throws ParseException {
- this.imaTag = new TagTrkpt(imaE.trkpt);
- if (maeE != null) {
- this.maeTag = new TagTrkpt(maeE.trkpt);
- }
- }
- /**
- * 緯度・経度と時間差から速度(km/h)を求める
- *
- */
- 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 = GeoDistance.calcDistHubeny(imaTag.lat, imaTag.lon, maeTag.lat, maeTag.lon);
- String str = Double.toString((d * 3600) / (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 = str;
- }
- }
- /**
- * 経度(longitude)と経度から進行方向を求める
- * @throws ParseException
- */
- 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 {
- if (x >= 0) {
- rad = 90 - rad;
- }
- else {
- rad = 90 - rad;
- }
- }
- String str = Double.toString(rad);
- int iDot = str.indexOf('.');
- if (iDot > 0) {
- str = str.substring(0, iDot);
- }
- imaTag.appendElement("magvar", str);
- imaTag.magvarStr = str;
- }
- }
- }