--- /dev/null
+package osm.jp.kokudo.bus;\r
+import javax.xml.parsers.*;\r
+import javax.xml.transform.OutputKeys;\r
+import javax.xml.transform.Transformer;\r
+import javax.xml.transform.TransformerException;\r
+import javax.xml.transform.TransformerFactory;\r
+import javax.xml.transform.dom.DOMSource;\r
+import javax.xml.transform.stream.StreamResult;\r
+\r
+import org.w3c.dom.*;\r
+import org.xml.sax.*;\r
+\r
+import java.io.*;\r
+\r
+public class Gpx2osm {\r
+\r
+ /** メイン\r
+ * @throws TransformerException\r
+ * @throws IOException\r
+ * @throws SAXException\r
+ * @throws ParserConfigurationException */\r
+ public static void main(String[] argv) throws ParserConfigurationException, SAXException, IOException, TransformerException\r
+ {\r
+ File tempfile = new File("temp.xml");\r
+ if (argv.length > 0) {\r
+ tempfile = new File(argv[0]);\r
+ }\r
+\r
+ File dir = new File(".");\r
+ File[] files = dir.listFiles();\r
+ int counter = 0;\r
+ for (File iFile : files) {\r
+ if (checkFile(iFile)) {\r
+ counter++;\r
+ Gpx2osm.proc(iFile, tempfile);\r
+ }\r
+ }\r
+ System.out.println("["+ counter +"]つのファイルを処理しました。");\r
+ }\r
+\r
+ public static Document document;\r
+ public static void proc (File iFile, File tempfile) throws ParserConfigurationException, SAXException, IOException, TransformerException {\r
+ int iCounter = 0;\r
+ DocumentBuilderFactory factory;\r
+ DocumentBuilder builder;\r
+ Node root;\r
+ way = null;\r
+\r
+ String fileName = iFile.getName();\r
+ String iStr = fileName.substring(0, fileName.length() - 4);\r
+\r
+ File outputFile = new File(iStr +".osm");\r
+ System.out.println(iStr + " => "+ outputFile.getName());\r
+\r
+ try {\r
+ factory = DocumentBuilderFactory.newInstance();\r
+ builder = factory.newDocumentBuilder();\r
+ factory.setIgnoringElementContentWhitespace(true);\r
+ factory.setIgnoringComments(true);\r
+ factory.setValidating(true);\r
+\r
+ // GPX file --> Node root\r
+ root = builder.parse(iFile).getFirstChild();\r
+\r
+ // TEMP XML file --> Node temp\r
+ Node temp = builder.parse(tempfile).getFirstChild();\r
+\r
+ // OSM file --> Node osmnode\r
+ DOMImplementation domImpl = builder.getDOMImplementation();\r
+ document = domImpl.createDocument("", "osm", null);\r
+ Element osmnode = document.getDocumentElement();\r
+ NamedNodeMap nodeMap = temp.getAttributes();\r
+ if (null != nodeMap) {\r
+ for (int j=0; j < nodeMap.getLength(); j++ ) {\r
+ osmnode.setAttribute(nodeMap.item(j).getNodeName(), nodeMap.item(j).getNodeValue());\r
+ }\r
+ }\r
+\r
+ iCounter = showNodes(osmnode, temp, root, iCounter, "");\r
+\r
+ // 出力\r
+ DOMSource source = new DOMSource(osmnode);\r
+ FileOutputStream os = new FileOutputStream(outputFile);\r
+ StreamResult result = new StreamResult(os);\r
+ TransformerFactory transFactory = TransformerFactory.newInstance();\r
+ Transformer transformer = transFactory.newTransformer();\r
+ transformer.setOutputProperty(OutputKeys.INDENT, "yes");\r
+ transformer.setOutputProperty(OutputKeys.METHOD, "xml");\r
+ transformer.transform(source, result);\r
+ }\r
+ finally {\r
+ System.out.println("WPT数["+ iCounter +"]");\r
+ }\r
+ }\r
+\r
+ public static int showNodes(Element osmnode, Node temp, Node node, int iCounter, String space) throws IOException {\r
+ NodeList nodes = node.getChildNodes();\r
+ for (int i=0; i < nodes.getLength(); i++) {\r
+ Node node2 = nodes.item(i);\r
+ if (node2.getNodeName().equals("wpt")) {\r
+ iCounter = showWPT(osmnode, temp, node2, iCounter);\r
+ }\r
+ else {\r
+ iCounter = showNodes(osmnode, temp, node2, iCounter, space + " ");\r
+ }\r
+ }\r
+ return iCounter;\r
+ }\r
+\r
+ public static Element way = null;\r
+\r
+\r
+ /**\r
+ * <wpt/> ノードを処理する\r
+ *\r
+ * <wpt lat="35.44804477" lon="139.6348507">\r
+ * <ele>48.70000076293945</ele>\r
+ * <time>2012-03-20T00:26:30Z</time>\r
+ * <name><![CDATA[Picture (6.0m)]]></name>\r
+ * <link href="2012-03-20_09-26-30.jpg">\r
+ * <text>2012-03-20_09-26-30.jpg</text>\r
+ * </link>\r
+ * <sat>9</sat>\r
+ * </wpt>\r
+ *\r
+ * @param w\r
+ * @param node\r
+ * @throws IOException\r
+ */\r
+ public static int showWPT(Element osmnode, Node temp, Node node, int iCounter) throws IOException {\r
+ String nameStr = "";\r
+ String latStr = "";\r
+ String lonStr = "";\r
+ String timeStr = "";\r
+\r
+ NamedNodeMap nodeMap = node.getAttributes();\r
+ if ( null != nodeMap ) {\r
+ for (int j=0; j<nodeMap.getLength(); j++ ) {\r
+ if (nodeMap.item(j).getNodeName().equals("lat")) {\r
+ latStr = nodeMap.item(j).getNodeValue();\r
+ }\r
+ else if (nodeMap.item(j).getNodeName().equals("lon")) {\r
+ lonStr = nodeMap.item(j).getNodeValue();\r
+ }\r
+ }\r
+ }\r
+\r
+ NodeList nodes = node.getChildNodes();\r
+ for (int i=0; i < nodes.getLength(); i++) {\r
+ Node node2 = nodes.item(i);\r
+ if (node2.getNodeName().equals("time")) {\r
+ timeStr = node2.getTextContent();\r
+ }\r
+ else if (node2.getNodeName().equals("name")) {\r
+ nameStr = node2.getTextContent();\r
+ }\r
+ }\r
+\r
+ if (nameStr.startsWith("Picture")) {\r
+ System.out.println("'"+ nameStr +"' : スキップ");\r
+ }\r
+ else if (nameStr.startsWith("Voice recording")) {\r
+ System.out.println("'"+ nameStr +"' : スキップ");\r
+ }\r
+ else {\r
+ System.out.println("name : '"+ nameStr +"'");\r
+ iCounter--;\r
+\r
+ Element onode;\r
+ if ((onode = getOsmNode(temp, nameStr)) != null) {\r
+ System.out.println("'"+ nameStr +"' : <"+ onode.getNodeName() +" id=\""+ iCounter +"\" timestamp=\""+ timeStr +"\" lat=\""+ latStr +"\" lon=\""+ lonStr +"\">");\r
+ if (onode.getNodeName().equals("node")) {\r
+ // Template.xml からの回答が NODE の場合\r
+ onode.setAttribute("id", Integer.toString(iCounter));\r
+ onode.setAttribute("timestamp", timeStr);\r
+ onode.setAttribute("lat", latStr);\r
+ onode.setAttribute("lon", lonStr);\r
+ onode.appendChild(getSourceTag(timeStr));\r
+ osmnode.appendChild(onode);\r
+ if (nameStr.startsWith("W:")) {\r
+ if (way != null) {\r
+ Element nd = document.createElement("nd");\r
+ nd.setAttribute("ref", Integer.toString(iCounter));\r
+ way.appendChild(getCopy(nd));\r
+ }\r
+ }\r
+ }\r
+ else {\r
+ // Template.xml からの回答が WAY の場合\r
+ // ノードを作成して、出力する。\r
+ Element nod = document.createElement("node");\r
+ nod.setAttribute("id", Integer.toString(iCounter));\r
+ nod.setAttribute("timestamp", timeStr);\r
+ nod.setAttribute("lat", latStr);\r
+ nod.setAttribute("lon", lonStr);\r
+ nod.appendChild(getSourceTag(timeStr));\r
+ osmnode.appendChild(nod);\r
+\r
+ // WAYを作成する\r
+ iCounter--;\r
+ if (way == null) {\r
+ if (nameStr.equals("W:END")) {\r
+ // WAY が記録されていないときに「W:END」を押しても何もしない\r
+ way = null;\r
+ }\r
+ else {\r
+ // 「W:END」以外が押された場合は、WAYエレメントを新規に作成して\r
+ // WAYに先のNDノードを登録する\r
+ way = document.createElement("way");\r
+ way.setAttribute("id", Integer.toString(iCounter));\r
+ Element nd = document.createElement("nd");\r
+ nd.setAttribute("ref", Integer.toString(iCounter + 1));\r
+ way.appendChild(getCopy(nd));\r
+\r
+ // 回答ノードの内容をWAYに転記する\r
+ NodeList nlist = onode.getChildNodes();\r
+ for (int i=0; i < nlist.getLength(); i++) {\r
+ way.appendChild(getCopy(nlist.item(i)));\r
+ }\r
+ }\r
+ }\r
+ else {\r
+ way.setAttribute("id", Integer.toString(iCounter));\r
+ Element nd = document.createElement("nd");\r
+ nd.setAttribute("ref", Integer.toString(iCounter + 1));\r
+ way.appendChild(getCopy(nd));\r
+\r
+ if (updateWay(osmnode, onode)) {\r
+ iCounter--;\r
+ way = document.createElement("way");\r
+ way.setAttribute("id", Integer.toString(iCounter));\r
+ way.appendChild(getCopy(nd));\r
+ NodeList nlist = onode.getChildNodes();\r
+ for (int i=0; i < nlist.getLength(); i++) {\r
+ way.appendChild(getCopy(nlist.item(i)));\r
+ }\r
+ }\r
+ else {\r
+ NodeList nlist = onode.getChildNodes();\r
+ for (int i=0; i < nlist.getLength(); i++) {\r
+ way.appendChild(getCopy(nlist.item(i)));\r
+ }\r
+ }\r
+\r
+ if (nameStr.equals("W:END")) {\r
+ osmnode.appendChild(getCopy(way));\r
+ way = null;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ showWay();\r
+\r
+ return iCounter;\r
+ }\r
+\r
+ static void showWay() {\r
+ if (way == null) {\r
+ System.out.println("way = null");\r
+ return;\r
+ }\r
+ NodeList nlist = way.getChildNodes();\r
+ System.out.println("<"+ way.getNodeName() +">");\r
+ for (int i=0; i < nlist.getLength(); i++) {\r
+ Node node2 = nlist.item(i);\r
+ System.out.print(" <"+ node2.getNodeName() +" ");\r
+ NamedNodeMap nodeMap = node2.getAttributes();\r
+ if (null != nodeMap) {\r
+ for (int j = 0; j < nodeMap.getLength(); j++ ) {\r
+ System.out.print(nodeMap.item(j).getNodeName() +"='"+ nodeMap.item(j).getNodeValue() +"' ");\r
+ }\r
+ }\r
+ System.out.println("/>");\r
+ }\r
+ System.out.println("</"+ way.getNodeName() +">");\r
+ System.out.println();\r
+ }\r
+\r
+ /**\r
+ * 既存のWAYエレメントの状態を見ながら、WAYにNODEの内容を転記する。\r
+ * 以下の場合は、WAYをOSMに出力して、NODEを新たなWAYとする。\r
+ * ・'bridge=yes'属性のON/OFF\r
+ * @return WAY が切り替わるときはTRUE。そのままWAYを継続するときはFALSE。\r
+ * @param osmnode\r
+ * @param way\r
+ * @param node\r
+ */\r
+ public static boolean updateWay(Element osmnode, Element onode) {\r
+ if (isBridge(onode) && !isBridge(way)) {\r
+ osmnode.appendChild(getCopy(way));\r
+ return true;\r
+ }\r
+ String highway1 = getHighway(onode);\r
+ String highway2 = getHighway(way);\r
+ if (!highway1.equals("") && !highway1.equals(highway2)) {\r
+ osmnode.appendChild(getCopy(way));\r
+ return true;\r
+ }\r
+\r
+ NodeList nlist = onode.getChildNodes();\r
+ for (int i=0; i < nlist.getLength(); i++) {\r
+ Node node2 = nlist.item(i);\r
+ if (node2.getNodeName().equals("tag")) {\r
+ NamedNodeMap nodeMap = node2.getAttributes();\r
+ if (null != nodeMap) {\r
+ String k = "";\r
+ String v = "";\r
+ for (int j = 0; j < nodeMap.getLength(); j++ ) {\r
+ if (nodeMap.item(j).getNodeName().equals("k")) {\r
+ k = nodeMap.item(j).getNodeValue();\r
+ continue;\r
+ }\r
+ if (nodeMap.item(j).getNodeName().equals("v")) {\r
+ v = nodeMap.item(j).getNodeValue();\r
+ }\r
+ }\r
+ String wv = getTag(way, k, v);\r
+ if (wv != null) {\r
+ osmnode.appendChild(getCopy(way)); //\r
+ return true;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ return false;\r
+ }\r
+\r
+ public static boolean isBridge(Element node) {\r
+ boolean bridge = false;\r
+ boolean yes = false;\r
+ NodeList nlist = node.getChildNodes();\r
+ for (int i=0; i < nlist.getLength(); i++) {\r
+ Node node2 = nlist.item(i);\r
+ if (node2.getNodeName().equals("tag")) {\r
+ NamedNodeMap nodeMap = node2.getAttributes();\r
+ if (null != nodeMap) {\r
+ for (int j = 0; j < nodeMap.getLength(); j++ ) {\r
+ if (nodeMap.item(j).getNodeName().equals("k") && nodeMap.item(j).getNodeValue().equals("bridge")) {\r
+ bridge = true;\r
+ continue;\r
+ }\r
+ if (nodeMap.item(j).getNodeName().equals("v") && nodeMap.item(j).getNodeValue().equals("yes")) {\r
+ yes = true;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ if (bridge && yes) {\r
+ return true;\r
+ }\r
+ else {\r
+ return false;\r
+ }\r
+ }\r
+\r
+ public static String getHighway(Element node) {\r
+ NodeList nlist = node.getChildNodes();\r
+ for (int i=0; i < nlist.getLength(); i++) {\r
+ Node node2 = nlist.item(i);\r
+ if (node2.getNodeName().equals("tag")) {\r
+ NamedNodeMap nodeMap = node2.getAttributes();\r
+ if (null != nodeMap) {\r
+ boolean highway = false;\r
+ String v = "";\r
+ for (int j = 0; j < nodeMap.getLength(); j++ ) {\r
+ if (nodeMap.item(j).getNodeName().equals("k") && nodeMap.item(j).getNodeValue().equals("highway")) {\r
+ highway = true;\r
+ }\r
+ if (nodeMap.item(j).getNodeName().equals("v")) {\r
+ v = nodeMap.item(j).getNodeValue();\r
+ }\r
+ }\r
+ if (highway) {\r
+ return v;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ return "";\r
+ }\r
+\r
+ /**\r
+ * 更新が必要ないならNULL\r
+ * @param node\r
+ * @param key\r
+ * @param value\r
+ * @return\r
+ */\r
+ public static String getTag(Element node, String key, String value) {\r
+ NodeList nlist = node.getChildNodes();\r
+ for (int i=0; i < nlist.getLength(); i++) {\r
+ Node node2 = nlist.item(i);\r
+ if (node2.getNodeName().equals("tag")) {\r
+ NamedNodeMap nodeMap = node2.getAttributes();\r
+ if (null != nodeMap) {\r
+ boolean kk = false;\r
+ String v = "";\r
+ for (int j = 0; j < nodeMap.getLength(); j++ ) {\r
+ if (nodeMap.item(j).getNodeName().equals("k") && nodeMap.item(j).getNodeValue().equals(key)) {\r
+ kk = true;\r
+ }\r
+ if (nodeMap.item(j).getNodeName().equals("v")) {\r
+ v = nodeMap.item(j).getNodeValue();\r
+ }\r
+ }\r
+ if (kk) {\r
+ if (!v.equals(value)) {\r
+ return v;\r
+ }\r
+ else {\r
+ return null;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ return value;\r
+ }\r
+\r
+ public static Element getOsmNode(Node temp, String name) {\r
+ NodeList nodes = temp.getChildNodes();\r
+ for (int i=0; i < nodes.getLength(); i++) {\r
+ Node node2 = nodes.item(i);\r
+ NamedNodeMap nodeMap = node2.getAttributes();\r
+ if (null != nodeMap) {\r
+ for (int j=0; j < nodeMap.getLength(); j++ ) {\r
+ if (nodeMap.item(j).getNodeName().equals("gpxname")) {\r
+ if (nodeMap.item(j).getNodeValue().equals(name)) {\r
+ return getCopy(node2);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ return null;\r
+ }\r
+\r
+ public static Element getSourceTag(String timestampStr) {\r
+ int i;\r
+ if ((i = timestampStr.indexOf("T")) >= 0) {\r
+ timestampStr = timestampStr.substring(0, i);\r
+ }\r
+ Element tag = document.createElement("tag");\r
+ tag.setAttribute("k", "source");\r
+ tag.setAttribute("v", "survey "+ timestampStr);\r
+ return getCopy(tag);\r
+ }\r
+\r
+ public static Element getCopy(Node node) {\r
+ Element root = document.createElement(node.getNodeName());\r
+\r
+ NamedNodeMap nodeMap = node.getAttributes();\r
+ if (null != nodeMap) {\r
+ for (int j=0; j < nodeMap.getLength(); j++ ) {\r
+ root.setAttribute(nodeMap.item(j).getNodeName(), nodeMap.item(j).getNodeValue());\r
+ }\r
+ }\r
+\r
+ NodeList nodes = node.getChildNodes();\r
+ for (int i=0; i < nodes.getLength(); i++) {\r
+ Node node2 = nodes.item(i);\r
+ if (node2.getNodeType() == Node.ELEMENT_NODE) {\r
+ root.appendChild(getCopy(node2));\r
+ }\r
+ }\r
+\r
+ return root;\r
+ }\r
+\r
+ static boolean checkFile(File f) {\r
+ String name = f.getName();\r
+ if (!name.endsWith(".gpx")) {\r
+ return false;\r
+ }\r
+ return true;\r
+ }\r
+\r
+\r
+}
\ No newline at end of file