// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.data.osm.visitor;
import java.util.Collection;
import java.util.HashSet;
import org.openstreetmap.josm.data.osm.Node;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.data.osm.Relation;
import org.openstreetmap.josm.data.osm.RelationMember;
import org.openstreetmap.josm.data.osm.Way;
/**
* Collect all nodes a specific osm primitive has.
*
* @author imi
*/
public class AllNodesVisitor extends AbstractVisitor {
/**
* The resulting nodes collected so far.
*/
public Collection<Node> nodes = new HashSet<>();
/**
* Nodes have only itself as nodes.
*/
@Override
public void visit(Node n) {
nodes.add(n);
}
/**
* Ways have their way nodes.
*/
@Override
public void visit(Way w) {
if (w.isIncomplete()) return;
for (Node n : w.getNodes()) {
visit(n);
}
}
/**
* Relations may have any number of nodes.
* FIXME: do we want to collect nodes from segs/ways that are relation members?
* if so, use AutomatchVisitor!
*/
@Override
public void visit(Relation e) {
for (RelationMember m : e.getMembers()) {
if (m.isNode()) visit(m.getNode());
}
}
/**
* Replies all nodes contained by the given primitives
* @param osms The OSM primitives to inspect
* @return All nodes the given primitives have.
*/
public static Collection<Node> getAllNodes(Collection<? extends OsmPrimitive> osms) {
AllNodesVisitor v = new AllNodesVisitor();
for (OsmPrimitive osm : osms) {
osm.accept(v);
}
return v.nodes;
}
}