OSDN Git Service

new commit
[osm-ja/ConvAdmPt.git] / src / osm / jp / kiban25000 / ConvAdmPt25000.java
1 package osm.jp.kiban25000;\r
2 \r
3 import javax.xml.parsers.*;\r
4 import org.w3c.dom.*;\r
5 import org.xml.sax.*;\r
6 import java.io.*;\r
7 import java.util.Iterator;\r
8 import java.util.TreeMap;\r
9 \r
10 /**\r
11  * ====基盤地図情報のダウンロード====\r
12  *\r
13  * まず最初に、基盤地図情報をダウンロードします。\r
14  *\r
15  * 国土地理院の基盤地図情報ダウンロードページから、ログイン画面へ進みログインして、「基盤地図情報 縮尺レベル25000 JPGIS形式」を選択し、対象の地域のファイルをダウンロードします。(「JPGIS(GML)形式」ではありません)\r
16  * http://fgd.gsi.go.jp/download/\r
17  *\r
18  * 対象地域と項目の選択方法は、ダウンロードページの指示に従ってください。\r
19  *\r
20  * 「基盤地図情報項目」では「行政区画の境界線及び代表点」を選択してください。\r
21  *              「FG-JPS-39-05-Z001.zip」というような「FG-JPS-xx-05-Z001.zip」という形式のZIPファイルがダウンロードされます。\r
22  *\r
23  * ダウンロードした圧縮ファイルを解凍しておきます。\r
24  * 解凍すると「FG-JPS-44209-CommBdry-20091109-0001.xml」というような「FG-JPS-xxxx-CommBdry-xxxxxxxx-xxxx.xml」という形式のXMLファイルが出来上がります。\r
25  * @author yuu\r
26  *\r
27  */\r
28 public class ConvAdmPt25000 {\r
29         File inputFile;\r
30         String admCodeStr = "";\r
31         int iCounter = 0;\r
32         boolean link = true;\r
33         TreeMap<String, AdmPt> admMap = null;\r
34 \r
35         /**\r
36          *  メイン\r
37          *\r
38          * <GI>\r
39          * <dataset>\r
40          *\r
41          * <AdmPt id="K6_1" uuid="fgoid:10-00150-11-1002-1530">\r
42                  <fid>fgoid:10-00150-11-1002-1530</fid>\r
43                  <lfSpanFr>\r
44                   <jps:position>\r
45                    <jps:date8601>2008-03-31</jps:date8601>\r
46                   </jps:position>\r
47                  </lfSpanFr>\r
48                  <lfSpanTo>\r
49                   <jps:position>\r
50                    <jps:date8601>2999-12-31</jps:date8601>\r
51                   </jps:position>\r
52                  </lfSpanTo>\r
53 \r
54                 <devDate>\r
55                   <jps:position>\r
56                     <jps:date8601>2011-01-31</jps:date8601>\r
57                   </jps:position>\r
58                 </devDate>\r
59 \r
60                 <orgGILvl>25000</orgGILvl>\r
61                 <vis>表示</vis>\r
62 \r
63                 <pos id="K6_2" uuid="fgoid:10-00150-11-1002-1530-g">\r
64                   <jps:CRS uuidref="fguuid:jgd2000.bl"/>\r
65                   <jps:position>\r
66                     <jps:coordinate>37.055674 139.338021</jps:coordinate>\r
67                   </jps:position>\r
68                 </pos>\r
69 \r
70                 <type>その他</type>\r
71                 <name>福島県南会津郡檜枝岐村</name>\r
72                 <admCode>07364</admCode>\r
73 \r
74                 </AdmPt>\r
75 \r
76                 </dataset>\r
77 \r
78                 </GI>\r
79 \r
80          */\r
81         public static void main(String[] argv)\r
82         {\r
83                 boolean link = true;\r
84                 for (String arg : argv) {\r
85                         if (arg.equals("-nolink")) {\r
86                                 link = false;\r
87                         }\r
88                 }\r
89 \r
90                 File dir = new File(".");\r
91                 File[] files = dir.listFiles();\r
92                 int counter = 0;\r
93                 for (File iFile : files) {\r
94                         if (checkFile(iFile)) {\r
95                                 counter++;\r
96                                 ConvAdmPt25000 t = new ConvAdmPt25000(iFile, link);\r
97                                 t.runner();\r
98                         }\r
99                 }\r
100                 System.out.println("["+ counter +"]つのファイルを処理しました。");\r
101         }\r
102 \r
103         public ConvAdmPt25000 (File iFile, boolean link) {\r
104                 this.inputFile = iFile;\r
105                 this.link = link;\r
106         }\r
107 \r
108         public void runner() {\r
109                 DocumentBuilderFactory factory;\r
110                 DocumentBuilder        builder;\r
111                 Node root;\r
112 \r
113                 this.iCounter = 0;\r
114                 String iStr = this.inputFile.getName();\r
115                 String[] nameAry = iStr.split("-");\r
116                 String fileName = "";\r
117                 for (int i=0; i < nameAry.length; i++) {\r
118                         if (i != 0) {\r
119                                 fileName = fileName + "-";\r
120                         }\r
121                         fileName = fileName + nameAry[i];\r
122                         if (i == 2) {\r
123                                 this.admCodeStr = nameAry[2];\r
124                         }\r
125                 }\r
126 \r
127                 File outputFile = new File(iStr.substring(0, iStr.length() - 4) +".gpx");\r
128                 BufferedWriter wGpx = null;\r
129 \r
130                 File htmlFile = new File(iStr.substring(0, iStr.length() - 4) +".html");\r
131                 BufferedWriter wHtml = null;\r
132 \r
133                 File wikiFile = new File(iStr.substring(0, iStr.length() - 4) +".txt");\r
134                 BufferedWriter wWiki = null;\r
135 \r
136                 File csvFile = new File(iStr.substring(0, iStr.length() - 4) +".csv");\r
137                 BufferedWriter wCsv = null;\r
138 \r
139                 try {\r
140                         wGpx = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile), "UTF-8"));\r
141                         wHtml = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(htmlFile), "UTF-8"));\r
142                         wWiki = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(wikiFile), "UTF-8"));\r
143                         wCsv = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(csvFile), "UTF-8"));\r
144 \r
145                         wGpx.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");\r
146                         wGpx.newLine();\r
147                         wGpx.write("<gpx xmlns=\"http://www.topografix.com/GPX/1/1\" version=\"1.1\" creator=\"osmtracker-android\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd \">");\r
148                         wGpx.newLine();\r
149 \r
150                         wWiki.write("=== "+ admCodeStr +": "+ getCodeName(Integer.parseInt(admCodeStr)) +" ===");\r
151                         wWiki.newLine();\r
152                         wWiki.write("{| class=\"wikitable sortable\"");\r
153                         wWiki.newLine();\r
154                         wWiki.write("|- ");\r
155                         wWiki.newLine();\r
156                         wWiki.write("! style=\"width:70px\" | admCode");\r
157                         wWiki.newLine();\r
158                         wWiki.write("! | name");\r
159                         wWiki.newLine();\r
160                         wWiki.write("! style=\"width:70px\" | type");\r
161                         wWiki.newLine();\r
162                         wWiki.write("! | 備考/最終更新日");\r
163                         wWiki.newLine();\r
164 \r
165                         wCsv.write("\"都道府県コード\",\"都道府県名\",\"admCode\",\"Name\",\"type\",\"LAT\",\"LON\",\"備考/最終更新日\"");\r
166                         wCsv.newLine();\r
167 \r
168                         wHtml.write("<!DOCTYPE html>");\r
169                         wHtml.newLine();\r
170                         wHtml.write("<html><head><meta charset=\"utf-8\" /></head>");\r
171                         wHtml.newLine();\r
172                         wHtml.write("<body><table border='1'>");\r
173                         wHtml.newLine();\r
174                         wHtml.write("<tr>");\r
175                         wHtml.write("<td>admCode</td>");\r
176                         wHtml.write("<td>name</td>");\r
177                         wHtml.write("<td></td>");\r
178                         wHtml.write("</tr>");\r
179                         wHtml.newLine();\r
180 \r
181                         factory = DocumentBuilderFactory.newInstance();\r
182                         builder = factory.newDocumentBuilder();\r
183                         factory.setIgnoringElementContentWhitespace(true);\r
184                         factory.setIgnoringComments(true);\r
185                         factory.setValidating(true);\r
186                         root    = builder.parse(inputFile.getName());\r
187 \r
188                         //---------------------------------------\r
189                         admMap = new TreeMap<String, AdmPt>();\r
190                         showNodes(root, "");\r
191                         //---------------------------------------\r
192 \r
193                         Iterator<String> it = admMap.keySet().iterator();\r
194                 while (it.hasNext()) {\r
195                     String code = (String) it.next();\r
196                     AdmPt adm = admMap.get(code);\r
197 \r
198                     wWiki.write("|- ");\r
199                                 wWiki.newLine();\r
200                                 wWiki.write("| " + adm.code);\r
201                                 wWiki.newLine();\r
202                                 wWiki.write("| " + adm.name);\r
203                                 wWiki.newLine();\r
204                                 wWiki.write("| " + adm.type);\r
205                                 wWiki.newLine();\r
206                                 wWiki.write("| ");\r
207                                 wWiki.newLine();\r
208                                 \r
209                                 wCsv.write("\""+ admCodeStr +"\",\""+ getCodeName(Integer.parseInt(admCodeStr)) +"\",");\r
210                                 wCsv.write("\""+ adm.code +"\",\""+ adm.name +"\",\""+ adm.type +"\",");\r
211                                 wCsv.write("\""+ adm.latStr +"\",\""+ adm.lonStr +"\",\""+ adm.dateStr +"\"");\r
212                                 wCsv.newLine();\r
213 \r
214                                 wHtml.write("<tr>");\r
215                                 wHtml.write("<td>"+ adm.code +"</td>");\r
216                                 wHtml.write("<td>"+ adm.name +"</td>");\r
217                                 wHtml.write("<td>"+ adm.type +"</td>");\r
218                                 wHtml.write("</tr>");\r
219                                 wHtml.newLine();\r
220 \r
221                                 wGpx.write("<wpt lat=\""+ adm.latStr +"\" lon=\""+ adm.lonStr +"\">");\r
222                                 wGpx.newLine();\r
223                                 wGpx.write(" <time>"+ adm.dateStr +"T00:00:00Z</time>");\r
224                                 wGpx.newLine();\r
225                                 wGpx.write(" <name><![CDATA["+ adm.name +"]]></name>");\r
226                                 wGpx.newLine();\r
227                                 wGpx.write("</wpt>");\r
228                                 wGpx.newLine();\r
229                 }\r
230 \r
231                         wGpx.write("</gpx>");\r
232                         wGpx.newLine();\r
233 \r
234                         wHtml.write("</table></body></html>");\r
235                         wHtml.newLine();\r
236 \r
237                         wWiki.write("|}");\r
238                         wWiki.newLine();\r
239 \r
240                 } catch (ParserConfigurationException e0) {\r
241                         System.out.println(e0.getMessage());\r
242                 } catch (SAXException e1){\r
243                         System.out.println(e1.getMessage());\r
244                 } catch (IOException e2) {\r
245                         System.out.println(e2.getMessage());\r
246                 }\r
247                 finally {\r
248                         if (wGpx != null) {\r
249                                 try {\r
250                                         wGpx.close();\r
251                                         wHtml.close();\r
252                                 }\r
253                                 catch (IOException e) {\r
254                                         e.printStackTrace();\r
255                                 }\r
256                         }\r
257                         if (wWiki != null) {\r
258                                 try {\r
259                                         wWiki.close();\r
260                                 }\r
261                                 catch (IOException e) {\r
262                                         e.printStackTrace();\r
263                                 }\r
264                         }\r
265                         if (wCsv != null) {\r
266                                 try {\r
267                                         wCsv.close();\r
268                                 }\r
269                                 catch (IOException e) {\r
270                                         e.printStackTrace();\r
271                                 }\r
272                         }\r
273                 }\r
274         }\r
275 \r
276         public void showNodes(Node node, String space) throws IOException {\r
277                 NodeList nodes = node.getChildNodes();\r
278                 for (int i=0; i<nodes.getLength(); i++) {\r
279                         Node node2 = nodes.item(i);\r
280                         if (node2.getNodeName().equals("AdmPt")) {\r
281                                 showAdmPt(node2);\r
282                         }\r
283                         else {\r
284                                 showNodes(node2, space + "    ");\r
285                         }\r
286                 }\r
287         }\r
288 \r
289         public void showAdmPt(Node node) throws IOException {\r
290                 String positionStr = "";\r
291                 String typeStr = "";\r
292                 String nameStr = "";\r
293                 String latStr = "";\r
294                 String lonStr = "";\r
295                 String dateStr = "";\r
296                 String codeStr = "";\r
297 \r
298                 NodeList nodes = node.getChildNodes();\r
299                 for (int i=0; i < nodes.getLength(); i++) {\r
300                         Node node2 = nodes.item(i);\r
301                         if (node2.getNodeName().equals("admCode")) {\r
302                                 codeStr = node2.getTextContent();\r
303                         }\r
304                         else if (node2.getNodeName().equals("pos")) {\r
305                                 NodeList nodes3 = node2.getChildNodes();\r
306                                 for (int j=0; j < nodes3.getLength(); j++) {\r
307                                         Node node3 = nodes3.item(j);\r
308                                         if (node3.getNodeName().equals("jps:position")) {\r
309                                                 NodeList nodes4 = node3.getChildNodes();\r
310                                                 for (int k=0; k < nodes4.getLength(); k++) {\r
311                                                         Node node4 = nodes4.item(k);\r
312                                                         if (node4.getNodeName().equals("jps:coordinate")) {\r
313                                                                 positionStr = node4.getTextContent();\r
314                                                                 String[] str4Ary = positionStr.split(" ");\r
315                                                                 latStr = str4Ary[0];\r
316                                                                 lonStr = str4Ary[1];\r
317                                                         }\r
318                                                 }\r
319                                         }\r
320                                 }\r
321                         }\r
322                         else if (node2.getNodeName().equals("devDate")) {\r
323                                 NodeList nodes3 = node2.getChildNodes();\r
324                                 for (int j=0; j < nodes3.getLength(); j++) {\r
325                                         Node node3 = nodes3.item(j);\r
326                                         if (node3.getNodeName().equals("jps:position")) {\r
327                                                 NodeList nodes4 = node3.getChildNodes();\r
328                                                 for (int k=0; k < nodes4.getLength(); k++) {\r
329                                                         Node node4 = nodes4.item(k);\r
330                                                         if (node4.getNodeName().equals("jps:date8601")) {\r
331                                                                 dateStr = node4.getTextContent();\r
332                                                         }\r
333                                                 }\r
334                                         }\r
335                                 }\r
336                         }\r
337                         else if (node2.getNodeName().equals("type")) {\r
338                                 typeStr = node2.getTextContent();\r
339 \r
340                         }\r
341                         else if (node2.getNodeName().equals("name")) {\r
342                                 nameStr = node2.getTextContent();\r
343                         }\r
344                 }\r
345 \r
346                 if (admMap.get(codeStr) == null) {\r
347                         AdmPt adm = new AdmPt();\r
348                         adm.code = codeStr;\r
349                         adm.name = nameStr;\r
350                         adm.type = typeStr;\r
351                         adm.latStr = latStr;\r
352                         adm.lonStr = lonStr;\r
353                         adm.dateStr = dateStr;\r
354                         admMap.put(codeStr, adm);\r
355                 }\r
356         }\r
357 \r
358         class AdmPt {\r
359                 public String code;\r
360                 public String name;\r
361                 public String type;\r
362                 public String latStr;\r
363                 public String lonStr;\r
364                 public String dateStr;\r
365         }\r
366 \r
367         /**\r
368          *\r
369          * 例 [FG-JPS-07-AdmPt25000-20110131-0001.xml]\r
370          *\r
371          * @param f\r
372          * @return\r
373          */\r
374         static boolean checkFile(File f) {\r
375                 String name = f.getName();\r
376                 if (!name.startsWith("FG-JPS-")) {\r
377                         return false;\r
378                 }\r
379                 if (!name.toUpperCase().endsWith(".XML")) {\r
380                         return false;\r
381                 }\r
382                 if (name.toUpperCase().indexOf("-ADMPT25000-") < 0) {\r
383                         return false;\r
384                 }\r
385                 return true;\r
386         }\r
387 \r
388         public static String getCodeName(int code) {\r
389                 switch (code) {\r
390                 case 1:\r
391                         return "北海道";\r
392                 case 2:\r
393                         return "青森県";\r
394                 case 3:\r
395                         return "岩手県";\r
396                 case 4:\r
397                         return "宮城県";\r
398                 case 5:\r
399                         return "秋田県";\r
400                 case 6:\r
401                         return "山形県";\r
402                 case 7:\r
403                         return "福島県";\r
404                 case 8:\r
405                         return "茨城県";\r
406                 case 9:\r
407                         return "栃木県";\r
408                 case 10:\r
409                         return "群馬県";\r
410                 case 11:\r
411                         return "埼玉県";\r
412                 case 12:\r
413                         return "千葉県";\r
414                 case 13:\r
415                         return "東京都";\r
416                 case 14:\r
417                         return "神奈川県";\r
418                 case 15:\r
419                         return "新潟県";\r
420                 case 16:\r
421                         return "富山県";\r
422                 case 17:\r
423                         return "石川県";\r
424                 case 18:\r
425                         return "福井県";\r
426                 case 19:\r
427                         return "山梨県";\r
428                 case 20:\r
429                         return "長野県";\r
430                 case 21:\r
431                         return "岐阜県";\r
432                 case 22:\r
433                         return "静岡県";\r
434                 case 23:\r
435                         return "愛知県";\r
436                 case 24:\r
437                         return "三重県";\r
438                 case 25:\r
439                         return "滋賀県";\r
440                 case 26:\r
441                         return "京都府";\r
442                 case 27:\r
443                         return "大阪府";\r
444                 case 28:\r
445                         return "兵庫県";\r
446                 case 29:\r
447                         return "奈良県";\r
448                 case 30:\r
449                         return "和歌山";\r
450                 case 31:\r
451                         return "鳥取県";\r
452                 case 32:\r
453                         return "島根県";\r
454                 case 33:\r
455                         return "岡山県";\r
456                 case 34:\r
457                         return "広島県";\r
458                 case 35:\r
459                         return "山口県";\r
460                 case 36:\r
461                         return "徳島県";\r
462                 case 37:\r
463                         return "香川県";\r
464                 case 38:\r
465                         return "愛媛県";\r
466                 case 39:\r
467                         return "高知県";\r
468                 case 40:\r
469                         return "福岡県";\r
470                 case 41:\r
471                         return "佐賀県";\r
472                 case 42:\r
473                         return "長崎県";\r
474                 case 43:\r
475                         return "熊本県";\r
476                 case 44:\r
477                         return "大分県";\r
478                 case 45:\r
479                         return "宮崎県";\r
480                 case 46:\r
481                         return "鹿児島";\r
482                 case 47:\r
483                         return "沖縄県";\r
484                 }\r
485                 return "";\r
486         }\r
487 \r
488 }