package org.artisanlogiciel.osm; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.FileInputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; public class OsmReader { private String sample; private HashMap refs; private List ways; public OsmReader(String sample) { this.sample = sample; refs = new HashMap<>(); ways = new ArrayList<>(); } public List getWays() { return ways; } public void read() { /* TODO get minlat and minlon **/ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); try { DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new FileInputStream(sample)); Element root = doc.getDocumentElement(); System.out.println(root); NodeList nList = doc.getElementsByTagName("node"); for (int temp = 0; temp < nList.getLength(); temp++) { org.w3c.dom.Node nNode = nList.item(temp); if (nNode.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) { Element e = (Element) nNode; long id = Long.valueOf(e.getAttribute("id")); double lat = Double.valueOf(e.getAttribute("lat")); double lon = Double.valueOf(e.getAttribute("lon")); Node node = new Node(new NodeRef(id), lat, lon); refs.put(node.getRef(),node); } } NodeList wList = doc.getElementsByTagName("way"); for (int temp = 0; temp < wList.getLength(); temp++) { org.w3c.dom.Node wNode = wList.item(temp); if (wNode.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) { Element e = (Element) wNode; try { long id = Long.valueOf(e.getAttribute("id")); List nodeRefList = new ArrayList<>(); NodeList nrList = e.getElementsByTagName("nd"); for (int temp2 = 0; temp2 < nrList.getLength(); temp2++) { org.w3c.dom.Node nrNode = nrList.item(temp2); if (nrNode.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) { Element nd = (Element) nrNode; long ref = Long.valueOf(nd.getAttribute("ref")); NodeRef nodeRef = new NodeRef(ref); Node node = refs.get(nodeRef); if ( node == null ) { System.out.println("unknown node id " + nodeRef); } else { nodeRefList.add(node.getRef()); } } } Way way = new Way(id, nodeRefList); ways.add(way); } catch (Exception bad) { System.err.println("Too bad way"); bad.printStackTrace(System.err); } } } } catch(Exception any) { System.err.println("Too bad"); any.printStackTrace(System.err); } } public void dump() { System.out.println(refs); System.out.println(ways); } public static void main(String pArgs[]) { String sample = "/home/plhardy/valbonne3D/valbonne_oct_2020.osm"; OsmReader osmreader = new OsmReader(sample); osmreader.read(); osmreader.dump(); } }