package osm.jp.gpx;
import java.text.ParseException;
public class Complementation {
public static final Double R = (6378137D + 6356752.314D)/2D; // 6367444.657m
public TagTrkpt imaTag = null;
public TagTrkpt maeTag = null;
//public static boolean param_GpxOutputSpeed = false;
//public static boolean param_GpxOverwriteMagvar = false;
/**
* @param imaE
* @param maeE
* @throws java.text.ParseException
* @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 = imaE.clone();
if (maeE != null) {
this.maeTag = maeE.clone();
}
}
/**
* 緯度・経度と時間差から速度(km/h)を求める
*
*/
public void complementationSpeed() {
if (imaTag.speedStr != null) {
try {
Double.parseDouble(imaTag.speedStr);
}
catch (NumberFormatException e) {
// 数字以外なら<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.speedStr = str;
}
}
/**
* 経度(longitude)と経度から進行方向を求める
* @throws ParseException
*/
public void complementationMagvar() throws ParseException {
if (imaTag.magvarStr != null) {
try {
Double.parseDouble(imaTag.magvarStr);
}
catch (NumberFormatException e) {
// 数字以外なら<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.magvarStr = str;
}
}
}