// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.JunctionChecker.datastructure; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import org.openstreetmap.josm.data.osm.Node; import org.openstreetmap.josm.data.osm.Relation; import org.openstreetmap.josm.data.osm.RelationMember; import org.openstreetmap.josm.data.osm.Way; /** * @author joerg */ public class OSMGraph extends Graph { private final HashMap<Long, OSMWay> ways = new HashMap<>(); private HashMap<Long, OSMRelation> relations = new HashMap<>(); private final HashMap<Long, OSMNode> nodes = new HashMap<>(); public void addNode(OSMNode node) { nodes.put(node.getId(), node); } /** * gibt den Knoten mit der gesuchten OSM-ID zurück * @param id OSM-iD des Knotens! */ public OSMNode getNode(long id) { return nodes.get(id); } public void removeWay(OSMWay way) { while (ways.values().remove(way)); } public OSMNode[] getNodes() { OSMNode[] nodearray = new OSMNode[nodes.size()]; return nodes.values().toArray(nodearray); } public void addWay(OSMWay way) { ways.put(way.getId(), way); } public OSMWay getWay(long id) { return ways.get(id); } public OSMRelation getRelation(int id) { return relations.get(Long.valueOf(id)); } public HashMap<Long, OSMRelation> getRelationsAshashmap() { return relations; } public void setRelations(HashMap<Long, OSMRelation> relations) { this.relations = relations; } public OSMWay[] getWays() { OSMWay[] wayarray = new OSMWay[ways.size()]; return ways.values().toArray(wayarray); } public void addRelation(OSMRelation relation) { relations.put(relation.getId(), relation); } public OSMRelation[] getRelations() { OSMRelation[] relationarray = new OSMRelation[relations.size()]; return relations.values().toArray(relationarray); } public Collection<OSMRelation> getRelationsCollection() { return relations.values(); } public boolean hasNode(Long id) { return nodes.containsKey(id); } public ArrayList<Long> getIDsfromWay(int id) { OSMWay w = ways.get(Long.valueOf(id)); ArrayList<Long> ids = new ArrayList<>(); ids.add(w.getToNode().getId()); ids.add(w.getFromNode().getId()); return ids; } public void addNode(Node node) { OSMNode OSMnode = new OSMNode(); OSMnode.setId(node.getId()); OSMnode.setLatitude(node.getBBox().getTopLeft().lat()); OSMnode.setLongitude(node.getBBox().getTopLeft().lon()); OSMnode.setHashmap(new HashMap<>(node.getKeys())); nodes.put(OSMnode.getId(), OSMnode); } public void addWay(Way way) { OSMWay osmway = new OSMWay(); osmway.setId(way.getId()); Iterator<Node> it = way.getNodes().iterator(); while (it.hasNext()) { osmway.addNode(getNode(it.next().getId())); } osmway.setHashmap(new HashMap<>(way.getKeys())); ways.put(osmway.getId(), osmway); } public void addRelation(Relation relation) { OSMRelation osmrelation = new OSMRelation(); osmrelation.setId(relation.getId()); osmrelation.setHashmap(new HashMap<>(relation.getKeys())); RelationMember rmember; for (int i = 0; i < relation.getMembers().size(); i++) { rmember = relation.getMember(i); if (rmember.getMember() instanceof Node) { osmrelation.addMember(getNode(rmember.getMember().getId()), rmember.getRole()); } else if (rmember.getMember() instanceof Way) { osmrelation.addMember(getWay(rmember.getMember().getId()), rmember.getRole()); } } relations.put(osmrelation.getId(), osmrelation); } }