OSDN Git Service

first commit
authorhayashi <hayashi.yuu@gmail.com>
Tue, 9 Oct 2012 14:46:18 +0000 (23:46 +0900)
committerhayashi <hayashi.yuu@gmail.com>
Tue, 9 Oct 2012 14:46:18 +0000 (23:46 +0900)
gpx2osm/build.xml [new file with mode: 0644]
gpx2osm/src/osm/jp/kokudo/bus/Gpx2osm.java [new file with mode: 0644]

diff --git a/gpx2osm/build.xml b/gpx2osm/build.xml
new file mode 100644 (file)
index 0000000..4263090
--- /dev/null
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" ?>\r
+<!DOCTYPE configuration>\r
+<project name="gpx2osm" default="all" basedir=".">\r
+\r
+       <target name="all" depends="release">\r
+       </target>\r
+\r
+       <!--\r
+       ソース以外にビルドに必要なライブラリ\r
+       -->\r
+       <tstamp>\r
+               <format property="verdate" pattern="yyyyMMdd"/>\r
+       </tstamp>\r
+    <property name="src" value="${basedir}/src" />\r
+    <property name="classes" value="${basedir}/classes" />\r
+       <property name="appname" value="gpx2osm"></property>\r
+       <property name="version" value="${verdate}"></property>\r
+\r
+       <!--\r
+       [STEP 1] クリーンナップ\r
+        -->\r
+       <target name="clean" description="前回作成したclassファイルを削除する">\r
+               <delete>\r
+                       <fileset dir="${classes}" includes="**/*.class" />\r
+                       <fileset dir="${src}" includes="**/*.class" />\r
+               </delete>\r
+       </target>\r
+\r
+       <!--\r
+       [STEP 2] コンパイル\r
+        -->\r
+       <target name="compile_src" depends="clean" description="コンパイル src">\r
+           <javac      optimize="off" debug="on" verbose="false" srcdir="${src}" destdir="${classes}" encoding="UTF-8" >\r
+                       <include name="**" />\r
+               <exclude name="**/*.smap" />\r
+               <classpath>\r
+                               <pathelement path="${src}"/>\r
+                       </classpath>\r
+               </javac>\r
+       </target>\r
+\r
+       <!--\r
+       [STEP 3] リンク\r
+        -->\r
+    <target name="create_run_jar" depends="compile_src" description="'${appname}.jar'を作成する">\r
+               <tstamp>\r
+                       <format property="ts" pattern="yyyy-MM-dd-HH:mm:ss-z"/>\r
+               </tstamp>\r
+               <jar destfile="${appname}.jar" >\r
+                       <manifest>\r
+                         <attribute name="Main-Class" value="osm.jp.gpx.ImportPicture" />\r
+                         <attribute name="Class-Path" value="${jar.runtime.classpath}" />\r
+                         <attribute name="Implementation-Title"   value="${appname}" />\r
+                         <attribute name="Implementation-Version" value="${ts}" />\r
+                         <attribute name="Implementation-Vendor"  value="${hayashi}" />\r
+                         <attribute name="Build-Id" value="${ts} (${user.name} [${os.name} ${os.version} ${os.arch}])" />\r
+                       </manifest>\r
+                       <zipfileset dir="${classes}"/>\r
+                       <zipfileset dir="${src}"/>\r
+        </jar>\r
+    </target>\r
+\r
+       <!--\r
+       [STEP 4] リンク\r
+        -->\r
+    <target name="release" depends="create_run_jar" description="'${appname}.zip'を作成する">\r
+       <zip destfile="${appname}.zip">\r
+               <fileset dir="." includes="${appname}.jar"/>\r
+               <fileset dir="." includes="${appname}.bat"/>\r
+               </zip>\r
+    </target>\r
+</project>\r
+\r
diff --git a/gpx2osm/src/osm/jp/kokudo/bus/Gpx2osm.java b/gpx2osm/src/osm/jp/kokudo/bus/Gpx2osm.java
new file mode 100644 (file)
index 0000000..cbab3cd
--- /dev/null
@@ -0,0 +1,482 @@
+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