用java解析在OpenStreetMap上下載的地圖數據


采用dom4j解析下載的xml文件,java程序如下:

package gao.map.preprocess;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * 處理從OpenStreetMap下載的原始數據,將抽取的數據輸出為txt文件
 * @author Administrator
 *
 */
public class OpenStreetMap {
    //遍歷當前節點下的所有節點  
    @SuppressWarnings("unchecked")
    public static void listNodes(Element node){  
        System.out.println("當前節點的名稱:" + node.getName());  
        //首先獲取當前節點的所有屬性節點  
        List<Attribute> list = node.attributes();  
        //遍歷屬性節點  
        for(Attribute attribute : list){  
            System.out.println("屬性"+attribute.getName() +":" + attribute.getValue());  
        }  
        //如果當前節點內容不為空,則輸出  
        if(!(node.getTextTrim().equals(""))){  
             System.out.println( node.getName() + ":" + node.getText());    
        }  
        //同時迭代當前節點下面的所有子節點  
        //使用遞歸  
        Iterator<Element> iterator = node.elementIterator();  
        while(iterator.hasNext()){  
            Element e = iterator.next();  
            listNodes(e);  
        }  
    }  
    
    @SuppressWarnings("unchecked")
    public static void main(String[] args) throws IOException,
            DocumentException {
        // 點信息
        File pointFile = new File("D:\\BaiduYunDownload\\紐約出租數據\\15年1-6黃車-綠車數據\\yellow_tripdata_2015-06.csv\\Point.txt");
        // 弧信息
        File arcFile = new File("D:\\BaiduYunDownload\\紐約出租數據\\15年1-6黃車-綠車數據\\yellow_tripdata_2015-06.csv\\Arc.txt");
        FileOutputStream fosPoint = new FileOutputStream(pointFile);
        FileOutputStream fosArc = new FileOutputStream(arcFile);
        OutputStreamWriter oswPoint = new OutputStreamWriter(fosPoint);
        OutputStreamWriter oswArc = new OutputStreamWriter(fosArc);
        BufferedWriter bwPoint = new BufferedWriter(oswPoint);
        BufferedWriter bwArc = new BufferedWriter(oswArc);
        SAXReader reader = new SAXReader();
        
        // 要讀取的原始地圖數據
        String path = "D:\\BaiduYunDownload\\紐約出租數據\\15年1-6黃車-綠車數據\\yellow_tripdata_2015-06.csv\\map";
        Document document = reader.read(new File(path));
        
        // 獲取根節點元素對象 osm
        Element root = document.getRootElement();
        // 遍歷osm下的所有子節點
        Iterator<Element> iterator = root.elementIterator();  
        while(iterator.hasNext()){  
            Element e = iterator.next(); 
//            if(e.getName().equals("node")||e.getName().equals("way"))
//                listNodes(e);
            //輸出點信息
            if(e.getName().equals("node")){
                StringBuilder sb = new StringBuilder();
                //首先獲取當前節點的所有屬性節點  
                List<Attribute> list = e.attributes();  
                //遍歷屬性節點  
                for(Attribute attribute : list){
                    if(attribute.getName().equals("id"))
                        sb.append(attribute.getValue()+"      ");
                    if(attribute.getName().equals("lat"))
                        sb.append(attribute.getValue()+"      ");
                    if(attribute.getName().equals("lon"))
                        sb.append(attribute.getValue());
                }  
                bwPoint.write(sb.toString()+"\r\n");
                bwPoint.flush();
                System.out.println(sb.toString());
            }else if(e.getName().equals("way")){  //輸出弧信息
                StringBuilder sb = new StringBuilder();
                String s = "";
                //首先獲取當前節點的所有屬性節點  
                List<Attribute> list = e.attributes();  
                //遍歷屬性節點  
                for(Attribute attribute : list){
                    if(attribute.getName().equals("id"))
                        s += attribute.getValue()+"      ";
                    if(attribute.getName().equals("version"))
                        s += attribute.getValue()+"      ";
                }
                //遍歷子節點
                Iterator<Element> iter = e.elementIterator();  
                while(iter.hasNext()){  
                    Element element = iter.next();  
                    //首先獲取當前節點的所有屬性節點  
                    List<Attribute> list1 = element.attributes();  
                    //遍歷屬性節點  
                    for(Attribute attribute : list1){
                        if(attribute.getName().equals("ref"))
                            sb.append(s + attribute.getValue()+"      "+"\r\n");
                        else if(attribute.getName().equals("k"))
                            sb.append(s + "         "+attribute.getValue()+"\r\n");
                    }
                }
                bwArc.write(sb.toString());
                bwArc.flush();
                System.out.print(sb.toString());
            }
        } 
       bwPoint.close();
       oswPoint.close();
       fosPoint.close();
       bwArc.close();
       oswArc.close();
       fosArc.close();
       System.out.println("輸出完成!");
   }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM