#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
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;
+
/**
*
* @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);
+ }
}
/**
* @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;
- }
-
}
\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
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
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
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
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
}\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
}\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
* <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
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
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
--- /dev/null
+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);
+ }
+}