// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.JunctionChecker.reader; import java.io.File; import java.util.HashMap; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import org.openstreetmap.josm.plugins.JunctionChecker.datastructure.OSMEntity; import org.openstreetmap.josm.plugins.JunctionChecker.datastructure.OSMGraph; import org.openstreetmap.josm.plugins.JunctionChecker.datastructure.OSMNode; import org.openstreetmap.josm.plugins.JunctionChecker.datastructure.OSMRelation; import org.openstreetmap.josm.plugins.JunctionChecker.datastructure.OSMWay; /** * @author joerg */ public class OSMXMLReader extends XMLReader { private OSMGraph osmgraph = new OSMGraph(); public OSMXMLReader(String filename) { super(filename); } public OSMXMLReader(File file) { super(file); } private void readAttributes(OSMEntity entity) { String temp = parser.getAttributeValue(null, "changeset"); if (temp != null) { entity.setChangeset(Integer.parseInt(temp)); } entity.setId(Long.parseLong(parser.getAttributeValue(null, "id"))); entity.setTimestamp(parser.getAttributeValue(null, "timestamp")); temp = parser.getAttributeValue(null, "uid"); if (temp != null) entity.setUid(Integer.parseInt(temp)); temp = parser.getAttributeValue(null, "uid"); if (temp != null) { entity.setUid(Integer.parseInt(temp)); } entity.setUser(parser.getAttributeValue(null, "user")); temp = parser.getAttributeValue(null, "visible"); if (temp != null) { if (temp.equals("true") || temp.equals("1")) { entity.setVisible(true); } } else { entity.setVisible(false); } temp = parser.getAttributeValue(null, "version"); if (temp != null) { entity.setversion(Integer.parseInt(temp)); } } private void readMember(OSMRelation relation) { if (parser.getAttributeValue(null, "type").equals("node")) { relation.addMember(osmgraph.getNode(Integer.parseInt(parser .getAttributeValue(null, "ref"))), parser .getAttributeValue(null, "role")); } else if (parser.getAttributeValue(null, "type").equals("way")) { relation.addMember(osmgraph.getWay(Long.parseLong(parser .getAttributeValue(null, "ref"))), parser .getAttributeValue(null, "role")); } else if (parser.getAttributeValue(null, "type").equals("relation")) { relation.addMember(osmgraph.getRelation(Integer.parseInt(parser .getAttributeValue(null, "ref"))), parser .getAttributeValue(null, "role")); } } @Override public void parseXML() { String xmlelement; OSMNode node = new OSMNode(); OSMWay way = new OSMWay(); OSMRelation relation = new OSMRelation(); HashMap<String, String> hashmap = new HashMap<>(); try { while (parser.hasNext()) { switch (parser.getEventType()) { case XMLStreamConstants.START_ELEMENT: xmlelement = parser.getLocalName(); if (xmlelement.equals("node")) { node = new OSMNode(); hashmap = new HashMap<>(); readAttributes(node); node.setLatitude(Double.parseDouble(parser .getAttributeValue(null, "lat"))); node.setLongitude(Double.parseDouble(parser .getAttributeValue(null, "lon"))); } if (xmlelement.equals("way")) { way = new OSMWay(); hashmap = new HashMap<>(); readAttributes(way); } if (xmlelement.equals("relation")) { relation = new OSMRelation(); hashmap = new HashMap<>(); readAttributes(relation); } if (xmlelement.equals("member")) { readMember(relation); } if (xmlelement.equals("bounds")) { osmgraph.setBbbottom(Double.parseDouble(parser .getAttributeValue(null, "minlat"))); osmgraph.setBbtop(Double.parseDouble(parser .getAttributeValue(null, "maxlat"))); osmgraph.setBbleft(Double.parseDouble(parser .getAttributeValue(null, "minlon"))); osmgraph.setBbright(Double.parseDouble(parser .getAttributeValue(null, "maxlon"))); } if (xmlelement.equals("nd")) { way.addNode(osmgraph.getNode(Integer.parseInt(parser .getAttributeValue(0)))); } if (xmlelement.equals("tag")) { hashmap.put(parser.getAttributeValue(null, "k"), parser .getAttributeValue(null, "v")); } if (xmlelement.equals("relation")) { relation = new OSMRelation(); hashmap = new HashMap<>(); readAttributes(relation); } //TODO: kann wohl wech! /* if (xmlelement.equals("member")) { relation.addMember(parser.getAttributeValue(null, "type"), Integer.parseInt(parser .getAttributeValue(null, "ref")), parser .getAttributeValue(null, "role")); } */ break; case XMLStreamConstants.END_ELEMENT: if (parser.getLocalName().equals("node")) { node.setHashmap(hashmap); osmgraph.addNode(node); } if (parser.getLocalName().equals("way")) { way.setHashmap(hashmap); osmgraph.addWay(way); } if (parser.getLocalName().equals("relation")) { relation.setHashmap(hashmap); osmgraph.addRelation(relation); } break; } parser.next(); } } catch (XMLStreamException e) { e.printStackTrace(); } } public void setOSMGraph(OSMGraph osmgraph) { this.osmgraph = osmgraph; } public OSMGraph getOSMGraph() { return osmgraph; } }