1 package osm.jp.kiban25000;
\r
3 import javax.xml.parsers.*;
\r
4 import org.w3c.dom.*;
\r
5 import org.xml.sax.*;
\r
7 import java.util.Iterator;
\r
8 import java.util.TreeMap;
\r
11 * ====基盤地図情報のダウンロード====
\r
13 * まず最初に、基盤地図情報をダウンロードします。
\r
15 * 国土地理院の基盤地図情報ダウンロードページから、ログイン画面へ進みログインして、「基盤地図情報 縮尺レベル25000 JPGIS形式」を選択し、対象の地域のファイルをダウンロードします。(「JPGIS(GML)形式」ではありません)
\r
16 * http://fgd.gsi.go.jp/download/
\r
18 * 対象地域と項目の選択方法は、ダウンロードページの指示に従ってください。
\r
20 * 「基盤地図情報項目」では「行政区画の境界線及び代表点」を選択してください。
\r
21 * 「FG-JPS-39-05-Z001.zip」というような「FG-JPS-xx-05-Z001.zip」という形式のZIPファイルがダウンロードされます。
\r
23 * ダウンロードした圧縮ファイルを解凍しておきます。
\r
24 * 解凍すると「FG-JPS-44209-CommBdry-20091109-0001.xml」というような「FG-JPS-xxxx-CommBdry-xxxxxxxx-xxxx.xml」という形式のXMLファイルが出来上がります。
\r
28 public class ConvAdmPt25000 {
\r
30 String admCodeStr = "";
\r
32 boolean link = true;
\r
33 TreeMap<String, AdmPt> admMap = null;
\r
41 * <AdmPt id="K6_1" uuid="fgoid:10-00150-11-1002-1530">
\r
42 <fid>fgoid:10-00150-11-1002-1530</fid>
\r
45 <jps:date8601>2008-03-31</jps:date8601>
\r
50 <jps:date8601>2999-12-31</jps:date8601>
\r
56 <jps:date8601>2011-01-31</jps:date8601>
\r
60 <orgGILvl>25000</orgGILvl>
\r
63 <pos id="K6_2" uuid="fgoid:10-00150-11-1002-1530-g">
\r
64 <jps:CRS uuidref="fguuid:jgd2000.bl"/>
\r
66 <jps:coordinate>37.055674 139.338021</jps:coordinate>
\r
71 <name>福島県南会津郡檜枝岐村</name>
\r
72 <admCode>07364</admCode>
\r
81 public static void main(String[] argv)
\r
83 boolean link = true;
\r
84 for (String arg : argv) {
\r
85 if (arg.equals("-nolink")) {
\r
90 File dir = new File(".");
\r
91 File[] files = dir.listFiles();
\r
93 for (File iFile : files) {
\r
94 if (checkFile(iFile)) {
\r
96 ConvAdmPt25000 t = new ConvAdmPt25000(iFile, link);
\r
100 System.out.println("["+ counter +"]つのファイルを処理しました。");
\r
103 public ConvAdmPt25000 (File iFile, boolean link) {
\r
104 this.inputFile = iFile;
\r
108 public void runner() {
\r
109 DocumentBuilderFactory factory;
\r
110 DocumentBuilder builder;
\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
119 fileName = fileName + "-";
\r
121 fileName = fileName + nameAry[i];
\r
123 this.admCodeStr = nameAry[2];
\r
127 File outputFile = new File(iStr.substring(0, iStr.length() - 4) +".gpx");
\r
128 BufferedWriter wGpx = null;
\r
130 File htmlFile = new File(iStr.substring(0, iStr.length() - 4) +".html");
\r
131 BufferedWriter wHtml = null;
\r
133 File wikiFile = new File(iStr.substring(0, iStr.length() - 4) +".txt");
\r
134 BufferedWriter wWiki = null;
\r
136 File csvFile = new File(iStr.substring(0, iStr.length() - 4) +".csv");
\r
137 BufferedWriter wCsv = null;
\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
145 wGpx.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
\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
150 wWiki.write("=== "+ admCodeStr +": "+ getCodeName(Integer.parseInt(admCodeStr)) +" ===");
\r
152 wWiki.write("{| class=\"wikitable sortable\"");
\r
154 wWiki.write("|- ");
\r
156 wWiki.write("! style=\"width:70px\" | admCode");
\r
158 wWiki.write("! | name");
\r
160 wWiki.write("! style=\"width:70px\" | type");
\r
162 wWiki.write("! | 備考/最終更新日");
\r
165 wCsv.write("\"都道府県コード\",\"都道府県名\",\"admCode\",\"Name\",\"type\",\"LAT\",\"LON\",\"備考/最終更新日\"");
\r
168 wHtml.write("<!DOCTYPE html>");
\r
170 wHtml.write("<html><head><meta charset=\"utf-8\" /></head>");
\r
172 wHtml.write("<body><table border='1'>");
\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
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
188 //---------------------------------------
\r
189 admMap = new TreeMap<String, AdmPt>();
\r
190 showNodes(root, "");
\r
191 //---------------------------------------
\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
198 wWiki.write("|- ");
\r
200 wWiki.write("| " + adm.code);
\r
202 wWiki.write("| " + adm.name);
\r
204 wWiki.write("| " + adm.type);
\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
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
221 wGpx.write("<wpt lat=\""+ adm.latStr +"\" lon=\""+ adm.lonStr +"\">");
\r
223 wGpx.write(" <time>"+ adm.dateStr +"T00:00:00Z</time>");
\r
225 wGpx.write(" <name><![CDATA["+ adm.name +"]]></name>");
\r
227 wGpx.write("</wpt>");
\r
231 wGpx.write("</gpx>");
\r
234 wHtml.write("</table></body></html>");
\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
248 if (wGpx != null) {
\r
253 catch (IOException e) {
\r
254 e.printStackTrace();
\r
257 if (wWiki != null) {
\r
261 catch (IOException e) {
\r
262 e.printStackTrace();
\r
265 if (wCsv != null) {
\r
269 catch (IOException e) {
\r
270 e.printStackTrace();
\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
284 showNodes(node2, space + " ");
\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
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
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
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
337 else if (node2.getNodeName().equals("type")) {
\r
338 typeStr = node2.getTextContent();
\r
341 else if (node2.getNodeName().equals("name")) {
\r
342 nameStr = node2.getTextContent();
\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
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
369 * 例 [FG-JPS-07-AdmPt25000-20110131-0001.xml]
\r
374 static boolean checkFile(File f) {
\r
375 String name = f.getName();
\r
376 if (!name.startsWith("FG-JPS-")) {
\r
379 if (!name.toUpperCase().endsWith(".XML")) {
\r
382 if (name.toUpperCase().indexOf("-ADMPT25000-") < 0) {
\r
388 public static String getCodeName(int code) {
\r