用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()+"
");
                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()+"      "+"
");
                        else if(attribute.getName().equals("k"))
                            sb.append(s + "         "+attribute.getValue()+"
");
                    }
                }
                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("输出完成!");
   }
}
原文地址:https://www.cnblogs.com/gaopeng527/p/5127693.html