Changeset 30725 in osm for applications/editors
- Timestamp:
- 2014-10-16T02:11:23+02:00 (11 years ago)
- Location:
- applications/editors/josm/plugins/junctionchecking
- Files:
-
- 1 added
- 1 deleted
- 41 edited
-
.settings/org.eclipse.jdt.ui.prefs (added)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/ChannelDiGraphLayer.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/DigraphCreationTask.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/JunctionCheckDialog.java (modified) (2 diffs)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/JunctionCheckTask.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/JunctionCheckerMapMode.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/JunctionSearchTask.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/PrepareJunctionCheckorSearch.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/commandlineinterface/CLI.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/connectedness/BacktrackingColors.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/connectedness/DiGraphSealer.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/connectedness/StrongConnectednessCalculator.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/converting/ChannelDigraphBuilder.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/converting/NodesConnectionProducer.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/converting/PseudoChannelRemover.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/converting/TurnRestrictionChecker.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/datastructure/BasicChannel.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/datastructure/Channel.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/datastructure/ChannelDiGraph.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/datastructure/Graph.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/datastructure/LeadsTo.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/datastructure/OSMEntity.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/datastructure/OSMGraph.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/datastructure/OSMNode.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/datastructure/OSMRelation.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/datastructure/OSMWay.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/filter/ExecuteFilter.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/filter/Filter.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/junctionchecking/BackPropagation.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/junctionchecking/Combination.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/junctionchecking/JCheck.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/junctionchecking/JMinimality.java (modified) (2 diffs)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/junctionchecking/JPrepare.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/junctionchecking/JProcess.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/junctionchecking/JunctionChecker.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/junctionchecking/TRDFS.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/reader/ColorSchemeXMLReader.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/reader/OSMXMLReader.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/reader/XMLFilterReader.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/reader/XMLReader.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/testing (deleted)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/util/RelationProducer.java (modified) (1 diff)
-
src/org/openstreetmap/josm/plugins/JunctionChecker/writing/OSMXMLWriter.java (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/ChannelDiGraphLayer.java
r26509 r30725 36 36 public class ChannelDiGraphLayer extends Layer implements LayerChangeListener, PropertyChangeListener{ 37 37 38 private ChannelDiGraph digraph;39 private static final int POINTSIZE = 5;//original 340 private static final float LINEWIDTH = 4; //original 241 private final ColorSchemeXMLReader cXMLReader;42 private static final Shape ARROW_HEAD;43 44 static {45 Polygon head = new Polygon();46 head.addPoint( 0, 0);47 head.addPoint(-15, +4);48 head.addPoint(-15, -4);49 ARROW_HEAD = head;50 }51 52 //die Farben für die zu zeichnenden Elemente53 private Color twoWayChannelColor;54 private Color oneWayChannelColor;55 private Color toNodeColor;56 private Color fromNodeColor;57 private Color nsccChannelColor;58 private Color selectedChannelColor;59 private Color partOfJunctionColor;60 61 public ChannelDiGraphLayer(ColorSchemeXMLReader cXMLReader){62 super("ChannelDiGraphLayer");63 MapView.addLayerChangeListener(this);64 this.cXMLReader = cXMLReader;65 initColors();66 }67 68 public void initColors() {69 twoWayChannelColor = cXMLReader.getColor("TwoWayChannel");70 oneWayChannelColor = cXMLReader.getColor("OneWayChannel");71 toNodeColor = cXMLReader.getColor("ToNode");72 fromNodeColor = cXMLReader.getColor("FromNode");73 nsccChannelColor = cXMLReader.getColor("NotConnectedChannel");74 selectedChannelColor = cXMLReader.getColor("selectedChannel");75 partOfJunctionColor = cXMLReader.getColor("partOfJunction");76 }77 78 @Override79 public Icon getIcon() {80 return ImageProvider.get("dialogs", "junctionchecker");81 }82 83 @Override84 public Object getInfoComponent() {85 return null;86 }87 88 @Override89 public Action[] getMenuEntries() {90 Action[] action = new Action[0];91 return action;92 }93 94 @Override95 public String getToolTipText() {96 return tr ("Channel-Digraph created from the active OSM-Layer");97 }98 99 @Override100 public boolean isMergable(Layer other) {101 return false;102 }103 104 @Override105 public void mergeFrom(Layer from) {106 }107 108 @Override109 public void paint(Graphics2D g, MapView mv, Bounds box) {110 if (digraph != null) {111 for (int i = 0; i < digraph.getChannels().size(); i++) {112 paintChannel(digraph.getChannelAtPosition(i), g, mv);113 }114 }115 }116 117 private void paintChannel(final Channel channel, final Graphics2D g, final MapView mv) {118 Point fromPoint = getCoord(channel.getFromNode(), mv);119 g.setColor(fromNodeColor);120 g.fillOval(fromPoint.x - POINTSIZE, fromPoint.y - POINTSIZE, 2 * POINTSIZE, 2 * POINTSIZE);121 Point toPoint = getCoord(channel.getToNode(), mv);122 g.setColor(toNodeColor);123 g.fillOval(toPoint.x - POINTSIZE, toPoint.y - POINTSIZE, 2 * POINTSIZE, 2 * POINTSIZE);124 Color c;125 if (channel.isPartOfJunction()) {126 c = partOfJunctionColor;127 }128 else if (channel.isSelected() == true) {129 c = selectedChannelColor;130 }131 else if (channel.isStrongConnected() == false) {132 c= nsccChannelColor;133 }134 else if (channel.getBackChannelID() != -100) {135 c = twoWayChannelColor;136 }137 else {138 c = oneWayChannelColor;139 }140 g.setColor(c);141 g.setStroke(new BasicStroke(LINEWIDTH));142 g.draw(new Line2D.Float(fromPoint.x, fromPoint.y, toPoint.x, toPoint.y));143 double angle = angleFromXAxis(fromPoint, toPoint);144 Shape head = ARROW_HEAD;145 head = AffineTransform.getRotateInstance(angle).createTransformedShape(head);146 head = AffineTransform.getTranslateInstance(toPoint.x, toPoint.y).createTransformedShape(head);147 g.fill(head);148 149 }150 151 private Point getCoord(OSMNode node, MapView mv) {152 return mv.getPoint(Main.getProjection().latlon2eastNorth(new LatLon(node.getLatitude(), node.getLongitude())));153 }154 155 /**156 * calculates the angle between the x axis and a vector given by two points157 * @param p1 first point for vector; != null158 * @param p2 second point for vector; != null159 * @return angle in radians, in range [-Pi .. +Pi]160 */161 private double angleFromXAxis(Point p1, Point p2) {162 assert p1 != null && p2 != null;163 164 final float vecX = p2.x - p1.x;165 final float vecY = p2.y - p1.y;166 167 final float vecLength = (float)Math.sqrt(vecX*vecX + vecY*vecY);168 169 final float dotProductVecAxis = vecX;170 171 float angle = (float)Math.acos(dotProductVecAxis / vecLength);172 173 if (p2.y < p1.y) {174 angle = -angle;175 }176 177 assert -Math.PI*0.5 < angle && angle <= Math.PI*0.5;178 179 return angle;180 }181 182 183 @Override184 public void visitBoundingBox(BoundingXYVisitor v) {185 }186 187 public void setDiGraph(ChannelDiGraph digraph) {188 this.digraph = digraph;189 }190 191 public void activeLayerChange(Layer oldLayer, Layer newLayer) {192 193 }194 195 public void layerAdded(Layer newLayer) {196 }197 198 public void layerRemoved(Layer oldLayer) {199 if (oldLayer == this) {200 MapView.removeLayerChangeListener(this);201 }202 }203 204 public ChannelDiGraph getDigraph() {205 return digraph;206 }207 208 public void setDigraph(ChannelDiGraph digraph) {209 this.digraph = digraph;210 }211 212 public void propertyChange(PropertyChangeEvent evt) {213 }38 private ChannelDiGraph digraph; 39 private static final int POINTSIZE = 5;//original 3 40 private static final float LINEWIDTH = 4; //original 2 41 private final ColorSchemeXMLReader cXMLReader; 42 private static final Shape ARROW_HEAD; 43 44 static { 45 Polygon head = new Polygon(); 46 head.addPoint( 0, 0); 47 head.addPoint(-15, +4); 48 head.addPoint(-15, -4); 49 ARROW_HEAD = head; 50 } 51 52 //die Farben für die zu zeichnenden Elemente 53 private Color twoWayChannelColor; 54 private Color oneWayChannelColor; 55 private Color toNodeColor; 56 private Color fromNodeColor; 57 private Color nsccChannelColor; 58 private Color selectedChannelColor; 59 private Color partOfJunctionColor; 60 61 public ChannelDiGraphLayer(ColorSchemeXMLReader cXMLReader){ 62 super("ChannelDiGraphLayer"); 63 MapView.addLayerChangeListener(this); 64 this.cXMLReader = cXMLReader; 65 initColors(); 66 } 67 68 public void initColors() { 69 twoWayChannelColor = cXMLReader.getColor("TwoWayChannel"); 70 oneWayChannelColor = cXMLReader.getColor("OneWayChannel"); 71 toNodeColor = cXMLReader.getColor("ToNode"); 72 fromNodeColor = cXMLReader.getColor("FromNode"); 73 nsccChannelColor = cXMLReader.getColor("NotConnectedChannel"); 74 selectedChannelColor = cXMLReader.getColor("selectedChannel"); 75 partOfJunctionColor = cXMLReader.getColor("partOfJunction"); 76 } 77 78 @Override 79 public Icon getIcon() { 80 return ImageProvider.get("dialogs", "junctionchecker"); 81 } 82 83 @Override 84 public Object getInfoComponent() { 85 return null; 86 } 87 88 @Override 89 public Action[] getMenuEntries() { 90 Action[] action = new Action[0]; 91 return action; 92 } 93 94 @Override 95 public String getToolTipText() { 96 return tr ("Channel-Digraph created from the active OSM-Layer"); 97 } 98 99 @Override 100 public boolean isMergable(Layer other) { 101 return false; 102 } 103 104 @Override 105 public void mergeFrom(Layer from) { 106 } 107 108 @Override 109 public void paint(Graphics2D g, MapView mv, Bounds box) { 110 if (digraph != null) { 111 for (int i = 0; i < digraph.getChannels().size(); i++) { 112 paintChannel(digraph.getChannelAtPosition(i), g, mv); 113 } 114 } 115 } 116 117 private void paintChannel(final Channel channel, final Graphics2D g, final MapView mv) { 118 Point fromPoint = getCoord(channel.getFromNode(), mv); 119 g.setColor(fromNodeColor); 120 g.fillOval(fromPoint.x - POINTSIZE, fromPoint.y - POINTSIZE, 2 * POINTSIZE, 2 * POINTSIZE); 121 Point toPoint = getCoord(channel.getToNode(), mv); 122 g.setColor(toNodeColor); 123 g.fillOval(toPoint.x - POINTSIZE, toPoint.y - POINTSIZE, 2 * POINTSIZE, 2 * POINTSIZE); 124 Color c; 125 if (channel.isPartOfJunction()) { 126 c = partOfJunctionColor; 127 } 128 else if (channel.isSelected() == true) { 129 c = selectedChannelColor; 130 } 131 else if (channel.isStrongConnected() == false) { 132 c= nsccChannelColor; 133 } 134 else if (channel.getBackChannelID() != -100) { 135 c = twoWayChannelColor; 136 } 137 else { 138 c = oneWayChannelColor; 139 } 140 g.setColor(c); 141 g.setStroke(new BasicStroke(LINEWIDTH)); 142 g.draw(new Line2D.Float(fromPoint.x, fromPoint.y, toPoint.x, toPoint.y)); 143 double angle = angleFromXAxis(fromPoint, toPoint); 144 Shape head = ARROW_HEAD; 145 head = AffineTransform.getRotateInstance(angle).createTransformedShape(head); 146 head = AffineTransform.getTranslateInstance(toPoint.x, toPoint.y).createTransformedShape(head); 147 g.fill(head); 148 149 } 150 151 private Point getCoord(OSMNode node, MapView mv) { 152 return mv.getPoint(Main.getProjection().latlon2eastNorth(new LatLon(node.getLatitude(), node.getLongitude()))); 153 } 154 155 /** 156 * calculates the angle between the x axis and a vector given by two points 157 * @param p1 first point for vector; != null 158 * @param p2 second point for vector; != null 159 * @return angle in radians, in range [-Pi .. +Pi] 160 */ 161 private double angleFromXAxis(Point p1, Point p2) { 162 assert p1 != null && p2 != null; 163 164 final float vecX = p2.x - p1.x; 165 final float vecY = p2.y - p1.y; 166 167 final float vecLength = (float)Math.sqrt(vecX*vecX + vecY*vecY); 168 169 final float dotProductVecAxis = vecX; 170 171 float angle = (float)Math.acos(dotProductVecAxis / vecLength); 172 173 if (p2.y < p1.y) { 174 angle = -angle; 175 } 176 177 assert -Math.PI*0.5 < angle && angle <= Math.PI*0.5; 178 179 return angle; 180 } 181 182 183 @Override 184 public void visitBoundingBox(BoundingXYVisitor v) { 185 } 186 187 public void setDiGraph(ChannelDiGraph digraph) { 188 this.digraph = digraph; 189 } 190 191 public void activeLayerChange(Layer oldLayer, Layer newLayer) { 192 193 } 194 195 public void layerAdded(Layer newLayer) { 196 } 197 198 public void layerRemoved(Layer oldLayer) { 199 if (oldLayer == this) { 200 MapView.removeLayerChangeListener(this); 201 } 202 } 203 204 public ChannelDiGraph getDigraph() { 205 return digraph; 206 } 207 208 public void setDigraph(ChannelDiGraph digraph) { 209 this.digraph = digraph; 210 } 211 212 public void propertyChange(PropertyChangeEvent evt) { 213 } 214 214 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/DigraphCreationTask.java
r30664 r30725 32 32 public class DigraphCreationTask extends PleaseWaitRunnable { 33 33 34 private final JunctionCheckerPlugin plugin;35 private final boolean sealGraph;36 private boolean canceled;37 private final boolean calculateSCC;34 private final JunctionCheckerPlugin plugin; 35 private final boolean sealGraph; 36 private boolean canceled; 37 private final boolean calculateSCC; 38 38 39 private static final String WAYFILTERFILE = "/resources/xml/waysfilter.xml";39 private static final String WAYFILTERFILE = "/resources/xml/waysfilter.xml"; 40 40 41 public DigraphCreationTask(JunctionCheckerPlugin plugin, boolean sealGraph, boolean calculateSCC) {42 super(tr ("Create Channel Digraph"), false);43 this.plugin = plugin;44 this.sealGraph = sealGraph;45 this.calculateSCC = calculateSCC;46 }41 public DigraphCreationTask(JunctionCheckerPlugin plugin, boolean sealGraph, boolean calculateSCC) { 42 super(tr ("Create Channel Digraph"), false); 43 this.plugin = plugin; 44 this.sealGraph = sealGraph; 45 this.calculateSCC = calculateSCC; 46 } 47 47 48 @Override49 protected void cancel() {50 canceled = true;51 progressMonitor.cancel();52 }48 @Override 49 protected void cancel() { 50 canceled = true; 51 progressMonitor.cancel(); 52 } 53 53 54 @Override55 protected void finish() {56 if (canceled) {57 Main.main.removeLayer(plugin.getChannelDigraphLayer());58 return;59 }60 }54 @Override 55 protected void finish() { 56 if (canceled) { 57 Main.main.removeLayer(plugin.getChannelDigraphLayer()); 58 return; 59 } 60 } 61 61 62 @Override63 protected void realRun() throws SAXException, IOException,64 OsmTransferException {65 //Prüfen, ob der ausgewählte Layer ein OSMDataLayer ist66 if (Main.map == null67 || !Main.map.isVisible() || !(Main.map.mapView.getActiveLayer() instanceof OsmDataLayer)) {68 JOptionPane.showMessageDialog(Main.parent, tr("this layer is no osm data layer"));69 return;70 }71 Main.main.removeLayer(plugin.getChannelDigraphLayer());72 int tickscounter = 4;73 if (sealGraph) {74 tickscounter++;75 }76 if (calculateSCC) {77 tickscounter++;78 }79 getProgressMonitor().setTicksCount(tickscounter);80 tickscounter = 1;81 getProgressMonitor().subTask(tr ("Converting OSM graph into Channel Digraph"));82 getProgressMonitor().setTicks(tickscounter++);62 @Override 63 protected void realRun() throws SAXException, IOException, 64 OsmTransferException { 65 //Prüfen, ob der ausgewählte Layer ein OSMDataLayer ist 66 if (Main.map == null 67 || !Main.map.isVisible() || !(Main.map.mapView.getActiveLayer() instanceof OsmDataLayer)) { 68 JOptionPane.showMessageDialog(Main.parent, tr("this layer is no osm data layer")); 69 return; 70 } 71 Main.main.removeLayer(plugin.getChannelDigraphLayer()); 72 int tickscounter = 4; 73 if (sealGraph) { 74 tickscounter++; 75 } 76 if (calculateSCC) { 77 tickscounter++; 78 } 79 getProgressMonitor().setTicksCount(tickscounter); 80 tickscounter = 1; 81 getProgressMonitor().subTask(tr ("Converting OSM graph into Channel Digraph")); 82 getProgressMonitor().setTicks(tickscounter++); 83 83 84 OSMGraph graph = new OSMGraph();85 //Der vom Benutzer in JOSM ausgewählte, zur Zeit aktive Layer wird der PLugin-OSM-Layer86 plugin.setOsmlayer((OsmDataLayer)Main.map.mapView.getActiveLayer());87 Iterator<Node> it = Main.main.getCurrentDataSet().getNodes().iterator();88 while (it.hasNext()) {89 graph.addNode(it.next());90 }84 OSMGraph graph = new OSMGraph(); 85 //Der vom Benutzer in JOSM ausgewählte, zur Zeit aktive Layer wird der PLugin-OSM-Layer 86 plugin.setOsmlayer((OsmDataLayer)Main.map.mapView.getActiveLayer()); 87 Iterator<Node> it = Main.main.getCurrentDataSet().getNodes().iterator(); 88 while (it.hasNext()) { 89 graph.addNode(it.next()); 90 } 91 91 92 Iterator<Way> itway = Main.main.getCurrentDataSet().getWays()93 .iterator();94 while (itway.hasNext()) {95 graph.addWay(itway.next());96 }97 Iterator<Relation> itrel = Main.main.getCurrentDataSet().getRelations()98 .iterator();99 while (itrel.hasNext()) {100 graph.addRelation(itrel.next());101 }102 Iterator<DataSource> itdata = Main.main.getCurrentDataSet().dataSources.iterator();103 while (itdata.hasNext()) {104 Bounds b = itdata.next().bounds;105 graph.setBbbottom(b.getMin().getY());106 graph.setBbleft(b.getMin().getX());107 graph.setBbright(b.getMax().getX());108 graph.setBbtop(b.getMax().getY());109 }110 getProgressMonitor().subTask(tr("filtering ways"));111 getProgressMonitor().setTicks(tickscounter++);112 // Filter mit gewünschten Ways laden113 XMLFilterReader reader = new XMLFilterReader(114 WAYFILTERFILE);115 reader.parseXML();116 // gewünschte Ways filtern117 ExecuteFilter ef = new ExecuteFilter(reader.getFilters(), graph);118 ef.filter();119 getProgressMonitor().subTask(tr ("creating Channel-Digraph"));120 getProgressMonitor().setTicks(tickscounter++);121 // ChannelDiGraphen erzeugen122 ChannelDigraphBuilder cdgb = new ChannelDigraphBuilder(ef.getOutgoinggraph());123 cdgb.buildChannelDigraph();124 StrongConnectednessCalculator scc = new StrongConnectednessCalculator(cdgb.getDigraph());125 // DiGraph "versiegeln"126 if (sealGraph) {127 getProgressMonitor().subTask(tr ("sealing Digraph"));128 getProgressMonitor().setTicks(tickscounter++);129 DiGraphSealer sealer = new DiGraphSealer(cdgb.getDigraph(), cdgb130 .getNewid());131 sealer.sealingGraph();132 }133 //Digraph starke Zusammenhangskomponenten berechnen134 if (calculateSCC) {135 getProgressMonitor().subTask(tr ("calculating Strong Connectedness"));136 getProgressMonitor().setTicks(tickscounter++);137 scc.calculateSCC();138 }139 getProgressMonitor().subTask(tr ("creating DigraphLayer"));140 getProgressMonitor().setTicks(tickscounter++);141 plugin.setChannelDigraph(cdgb.getDigraph());142 plugin.getOsmlayer().setBackgroundLayer(true);143 plugin.getChannelDigraphLayer().setDigraph(cdgb.getDigraph());144 plugin.setChannelDigraph(cdgb.getDigraph());145 plugin.getJcMapMode().setDigraph(cdgb.getDigraph());146 plugin.setNormalMapMode(Main.map.mapMode);147 Main.map.selectMapMode(plugin.getJcMapMode());148 Main.main.addLayer(plugin.getChannelDigraphLayer());149 Main.map.mapView.setActiveLayer(plugin.getChannelDigraphLayer());150 }92 Iterator<Way> itway = Main.main.getCurrentDataSet().getWays() 93 .iterator(); 94 while (itway.hasNext()) { 95 graph.addWay(itway.next()); 96 } 97 Iterator<Relation> itrel = Main.main.getCurrentDataSet().getRelations() 98 .iterator(); 99 while (itrel.hasNext()) { 100 graph.addRelation(itrel.next()); 101 } 102 Iterator<DataSource> itdata = Main.main.getCurrentDataSet().dataSources.iterator(); 103 while (itdata.hasNext()) { 104 Bounds b = itdata.next().bounds; 105 graph.setBbbottom(b.getMin().getY()); 106 graph.setBbleft(b.getMin().getX()); 107 graph.setBbright(b.getMax().getX()); 108 graph.setBbtop(b.getMax().getY()); 109 } 110 getProgressMonitor().subTask(tr("filtering ways")); 111 getProgressMonitor().setTicks(tickscounter++); 112 // Filter mit gewünschten Ways laden 113 XMLFilterReader reader = new XMLFilterReader( 114 WAYFILTERFILE); 115 reader.parseXML(); 116 // gewünschte Ways filtern 117 ExecuteFilter ef = new ExecuteFilter(reader.getFilters(), graph); 118 ef.filter(); 119 getProgressMonitor().subTask(tr ("creating Channel-Digraph")); 120 getProgressMonitor().setTicks(tickscounter++); 121 // ChannelDiGraphen erzeugen 122 ChannelDigraphBuilder cdgb = new ChannelDigraphBuilder(ef.getOutgoinggraph()); 123 cdgb.buildChannelDigraph(); 124 StrongConnectednessCalculator scc = new StrongConnectednessCalculator(cdgb.getDigraph()); 125 // DiGraph "versiegeln" 126 if (sealGraph) { 127 getProgressMonitor().subTask(tr ("sealing Digraph")); 128 getProgressMonitor().setTicks(tickscounter++); 129 DiGraphSealer sealer = new DiGraphSealer(cdgb.getDigraph(), cdgb 130 .getNewid()); 131 sealer.sealingGraph(); 132 } 133 //Digraph starke Zusammenhangskomponenten berechnen 134 if (calculateSCC) { 135 getProgressMonitor().subTask(tr ("calculating Strong Connectedness")); 136 getProgressMonitor().setTicks(tickscounter++); 137 scc.calculateSCC(); 138 } 139 getProgressMonitor().subTask(tr ("creating DigraphLayer")); 140 getProgressMonitor().setTicks(tickscounter++); 141 plugin.setChannelDigraph(cdgb.getDigraph()); 142 plugin.getOsmlayer().setBackgroundLayer(true); 143 plugin.getChannelDigraphLayer().setDigraph(cdgb.getDigraph()); 144 plugin.setChannelDigraph(cdgb.getDigraph()); 145 plugin.getJcMapMode().setDigraph(cdgb.getDigraph()); 146 plugin.setNormalMapMode(Main.map.mapMode); 147 Main.map.selectMapMode(plugin.getJcMapMode()); 148 Main.main.addLayer(plugin.getChannelDigraphLayer()); 149 Main.map.mapView.setActiveLayer(plugin.getChannelDigraphLayer()); 150 } 151 151 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/JunctionCheckDialog.java
r30205 r30725 33 33 public class JunctionCheckDialog extends ToggleDialog implements SelectionChangedListener{ 34 34 35 private final JunctionCheckerPlugin plugin;36 /** Serializable ID */37 private static final long serialVersionUID = 2952292777351992696L;38 private final SideButton checkJunctionButton;39 private final SideButton createDigraphButton;40 private final SideButton searchJunctionButton;41 private final JCheckBox digraphsealcb;42 private final JCheckBox produceRelation;43 private final JCheckBox sccCB;44 private final JSpinner nways;45 private final SpinnerNumberModel smodel;46 private final JLabel nwayslabel;35 private final JunctionCheckerPlugin plugin; 36 /** Serializable ID */ 37 private static final long serialVersionUID = 2952292777351992696L; 38 private final SideButton checkJunctionButton; 39 private final SideButton createDigraphButton; 40 private final SideButton searchJunctionButton; 41 private final JCheckBox digraphsealcb; 42 private final JCheckBox produceRelation; 43 private final JCheckBox sccCB; 44 private final JSpinner nways; 45 private final SpinnerNumberModel smodel; 46 private final JLabel nwayslabel; 47 47 48 public JunctionCheckDialog(JunctionCheckerPlugin junctionCheckerGuiPlugin) {49 super(tr("JunctionChecking"), "junctionchecker", tr("Open the junctionchecking window."),50 Shortcut.registerShortcut("subwindow:junctionchecker", tr("Toggle: {0}", tr("junctions")),51 KeyEvent.VK_J, Shortcut.ALT_SHIFT), 150);52 plugin = junctionCheckerGuiPlugin;53 //das Digraph Create Panel54 JPanel digraphPanel = new JPanel(new GridLayout(1, 2));55 digraphPanel.setBorder(new TitledBorder(tr("Channel-Digraph creation")));56 digraphsealcb = new JCheckBox(tr("seal Channel Digraph"));57 digraphsealcb.setSelected(false);58 //digraphPanel.add(digraphsealcb);48 public JunctionCheckDialog(JunctionCheckerPlugin junctionCheckerGuiPlugin) { 49 super(tr("JunctionChecking"), "junctionchecker", tr("Open the junctionchecking window."), 50 Shortcut.registerShortcut("subwindow:junctionchecker", tr("Toggle: {0}", tr("junctions")), 51 KeyEvent.VK_J, Shortcut.ALT_SHIFT), 150); 52 plugin = junctionCheckerGuiPlugin; 53 //das Digraph Create Panel 54 JPanel digraphPanel = new JPanel(new GridLayout(1, 2)); 55 digraphPanel.setBorder(new TitledBorder(tr("Channel-Digraph creation"))); 56 digraphsealcb = new JCheckBox(tr("seal Channel Digraph")); 57 digraphsealcb.setSelected(false); 58 //digraphPanel.add(digraphsealcb); 59 59 60 sccCB = new JCheckBox(tr("calculate strong connected channels"));61 sccCB.setSelected(true);62 digraphPanel.add(sccCB);60 sccCB = new JCheckBox(tr("calculate strong connected channels")); 61 sccCB.setSelected(true); 62 digraphPanel.add(sccCB); 63 63 64 //das Panel zum Junctionchecken65 JPanel jcPanel = new JPanel(new GridLayout(4, 1));66 jcPanel.setBorder(new TitledBorder(tr("Junctionchecking/junctions searching")));64 //das Panel zum Junctionchecken 65 JPanel jcPanel = new JPanel(new GridLayout(4, 1)); 66 jcPanel.setBorder(new TitledBorder(tr("Junctionchecking/junctions searching"))); 67 67 68 //Elemente für Grad-Auswahl der Kreuzung69 JPanel spinnerpanel = new JPanel(new GridLayout(1,2));70 smodel = new SpinnerNumberModel(3, 1, 20, 1);71 nways = new JSpinner(smodel);72 nwayslabel = new JLabel(tr("order of junction (n):"));73 nwayslabel.setEnabled(false);74 spinnerpanel.add(nwayslabel);75 spinnerpanel.add(nways);68 //Elemente für Grad-Auswahl der Kreuzung 69 JPanel spinnerpanel = new JPanel(new GridLayout(1,2)); 70 smodel = new SpinnerNumberModel(3, 1, 20, 1); 71 nways = new JSpinner(smodel); 72 nwayslabel = new JLabel(tr("order of junction (n):")); 73 nwayslabel.setEnabled(false); 74 spinnerpanel.add(nwayslabel); 75 spinnerpanel.add(nways); 76 76 77 //Elemente zur OSM-Relationen-Erzeugung78 produceRelation = new JCheckBox(tr("produce OSM-Relations: junction"));79 produceRelation.setToolTipText(tr("if enabled the plugin produces osm-relations from the junction subgraphs"));80 produceRelation.setSelected(true);81 produceRelation.setEnabled(false);82 jcPanel.add(produceRelation);83 jcPanel.add(spinnerpanel);77 //Elemente zur OSM-Relationen-Erzeugung 78 produceRelation = new JCheckBox(tr("produce OSM-Relations: junction")); 79 produceRelation.setToolTipText(tr("if enabled the plugin produces osm-relations from the junction subgraphs")); 80 produceRelation.setSelected(true); 81 produceRelation.setEnabled(false); 82 jcPanel.add(produceRelation); 83 jcPanel.add(spinnerpanel); 84 84 85 JPanel centerPanel = new JPanel();86 centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.Y_AXIS));87 centerPanel.add(digraphPanel);88 centerPanel.add(jcPanel);85 JPanel centerPanel = new JPanel(); 86 centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.Y_AXIS)); 87 centerPanel.add(digraphPanel); 88 centerPanel.add(jcPanel); 89 89 90 // ButtonPanel91 createDigraphButton = new SideButton(new AbstractAction() {92 {93 putValue(NAME, marktr("Create"));94 putValue(SHORT_DESCRIPTION, tr("create the channel digraph"));95 putValue(SMALL_ICON, ImageProvider.get("dialogs", "digraphcreation"));96 }97 @Override98 public void actionPerformed(ActionEvent e) {99 DigraphCreationTask dct = new DigraphCreationTask(plugin, digraphsealcb.isSelected(), sccCB.isSelected());100 Main.worker.submit(dct);101 setActivateJunctionCheckOrSearch(true);102 }103 });104 checkJunctionButton = new SideButton(new AbstractAction() {105 {106 putValue(NAME, marktr("Check "));107 putValue(SHORT_DESCRIPTION, tr("check the subust for junction properties"));108 putValue(SMALL_ICON, ImageProvider.get("dialogs", "junctioncheck"));109 }110 @Override111 public void actionPerformed(ActionEvent e) {112 PrepareJunctionCheckorSearch pjc = new PrepareJunctionCheckorSearch(plugin, smodel.getNumber().intValue(), produceRelation.isSelected());113 pjc.prepareJunctionCheck();114 }115 });116 checkJunctionButton.setEnabled(false);117 searchJunctionButton = new SideButton(new AbstractAction() {118 {119 putValue(NAME, marktr("Search "));120 putValue(SHORT_DESCRIPTION, tr("search for junctions in the channel subset"));121 putValue(SMALL_ICON, ImageProvider.get("dialogs", "junctionsearch"));122 }123 @Override124 public void actionPerformed(ActionEvent e) {125 PrepareJunctionCheckorSearch pjc = new PrepareJunctionCheckorSearch(plugin, smodel.getNumber().intValue(), produceRelation.isSelected());126 pjc.prepareJunctionSearch();127 }128 });129 searchJunctionButton.setEnabled(false);90 // ButtonPanel 91 createDigraphButton = new SideButton(new AbstractAction() { 92 { 93 putValue(NAME, marktr("Create")); 94 putValue(SHORT_DESCRIPTION, tr("create the channel digraph")); 95 putValue(SMALL_ICON, ImageProvider.get("dialogs", "digraphcreation")); 96 } 97 @Override 98 public void actionPerformed(ActionEvent e) { 99 DigraphCreationTask dct = new DigraphCreationTask(plugin, digraphsealcb.isSelected(), sccCB.isSelected()); 100 Main.worker.submit(dct); 101 setActivateJunctionCheckOrSearch(true); 102 } 103 }); 104 checkJunctionButton = new SideButton(new AbstractAction() { 105 { 106 putValue(NAME, marktr("Check ")); 107 putValue(SHORT_DESCRIPTION, tr("check the subust for junction properties")); 108 putValue(SMALL_ICON, ImageProvider.get("dialogs", "junctioncheck")); 109 } 110 @Override 111 public void actionPerformed(ActionEvent e) { 112 PrepareJunctionCheckorSearch pjc = new PrepareJunctionCheckorSearch(plugin, smodel.getNumber().intValue(), produceRelation.isSelected()); 113 pjc.prepareJunctionCheck(); 114 } 115 }); 116 checkJunctionButton.setEnabled(false); 117 searchJunctionButton = new SideButton(new AbstractAction() { 118 { 119 putValue(NAME, marktr("Search ")); 120 putValue(SHORT_DESCRIPTION, tr("search for junctions in the channel subset")); 121 putValue(SMALL_ICON, ImageProvider.get("dialogs", "junctionsearch")); 122 } 123 @Override 124 public void actionPerformed(ActionEvent e) { 125 PrepareJunctionCheckorSearch pjc = new PrepareJunctionCheckorSearch(plugin, smodel.getNumber().intValue(), produceRelation.isSelected()); 126 pjc.prepareJunctionSearch(); 127 } 128 }); 129 searchJunctionButton.setEnabled(false); 130 130 131 createLayout(centerPanel, false, Arrays.asList(new SideButton[] {132 createDigraphButton, checkJunctionButton, searchJunctionButton133 }));134 }131 createLayout(centerPanel, false, Arrays.asList(new SideButton[] { 132 createDigraphButton, checkJunctionButton, searchJunctionButton 133 })); 134 } 135 135 136 136 137 /**138 * (de)aktiviert Buttons zum JunctionCheck oder Suche139 * @param activate140 */141 public void setActivateJunctionCheckOrSearch(boolean activate) {142 checkJunctionButton.setEnabled(activate);143 nways.setEnabled(activate);144 nwayslabel.setEnabled(activate);145 produceRelation.setEnabled(activate);146 searchJunctionButton.setEnabled(activate);147 }137 /** 138 * (de)aktiviert Buttons zum JunctionCheck oder Suche 139 * @param activate 140 */ 141 public void setActivateJunctionCheckOrSearch(boolean activate) { 142 checkJunctionButton.setEnabled(activate); 143 nways.setEnabled(activate); 144 nwayslabel.setEnabled(activate); 145 produceRelation.setEnabled(activate); 146 searchJunctionButton.setEnabled(activate); 147 } 148 148 149 /**150 * (de)aktiviert Buttons zur Channel Digraph Erstellung151 * @param activate152 */153 public void setActivateCreateDigraph(final boolean activate) {154 GuiHelper.runInEDTAndWait(new Runnable() {149 /** 150 * (de)aktiviert Buttons zur Channel Digraph Erstellung 151 * @param activate 152 */ 153 public void setActivateCreateDigraph(final boolean activate) { 154 GuiHelper.runInEDTAndWait(new Runnable() { 155 155 @Override 156 156 public void run() { … … 160 160 } 161 161 }); 162 }162 } 163 163 164 @Override165 public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {164 @Override 165 public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) { 166 166 167 }167 } 168 168 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/JunctionCheckTask.java
r25501 r30725 23 23 public class JunctionCheckTask extends PleaseWaitRunnable{ 24 24 25 private final JunctionChecker jc;26 private final JunctionCheckerPlugin plugin;27 private final int n; //Grad der Kreuzung28 private final HashSet<Channel> subset; //Teilmge der zu prüfenden Channel29 private final boolean producerelation;30 private boolean canceled;25 private final JunctionChecker jc; 26 private final JunctionCheckerPlugin plugin; 27 private final int n; //Grad der Kreuzung 28 private final HashSet<Channel> subset; //Teilmge der zu prüfenden Channel 29 private final boolean producerelation; 30 private boolean canceled; 31 31 32 public JunctionCheckTask(JunctionCheckerPlugin plugin, int n, HashSet<Channel> subset, boolean produceRelation) {33 super("JunctionCheck", false);34 this.plugin = plugin;35 this.n = n;36 this.subset = subset;37 this.producerelation = produceRelation;38 jc = new JunctionChecker(plugin.getChannelDigraph() , n);39 }32 public JunctionCheckTask(JunctionCheckerPlugin plugin, int n, HashSet<Channel> subset, boolean produceRelation) { 33 super("JunctionCheck", false); 34 this.plugin = plugin; 35 this.n = n; 36 this.subset = subset; 37 this.producerelation = produceRelation; 38 jc = new JunctionChecker(plugin.getChannelDigraph() , n); 39 } 40 40 41 @Override42 protected void cancel() {43 canceled = true;44 progressMonitor.cancel();45 }41 @Override 42 protected void cancel() { 43 canceled = true; 44 progressMonitor.cancel(); 45 } 46 46 47 @Override48 protected void finish() {49 if (canceled) {50 return;51 }52 progressMonitor.finishTask();53 if (jc.isSmallerJunction() ) {54 showjunction();55 JOptionPane.showMessageDialog(Main.parent, tr ("The marked channels contains a junctioncandidate (white). To test this candidat mark these channel and press the \"Check\" button again."));56 }57 else if (jc.getCheck()) {58 showjunction();59 JOptionPane.showMessageDialog(Main.parent, tr ("The marked channels are a {0}-ways junction", n));60 plugin.getChannelDigraph().ereaseJunctioncandidate();61 for (int i = 0; i < jc.getSubJunction().size(); i++) {62 plugin.getChannelDigraph().addJunctioncandidateChannel(jc.getSubJunction().get(i));63 }64 if (producerelation) {65 this.plugin.getRelationProducer().produceRelation(subset, n);66 }67 }68 else if (!jc.getCheck()) {69 JOptionPane.showMessageDialog(Main.parent, tr ("The marked channels are not a junction:") + jc.getJCheckResult());47 @Override 48 protected void finish() { 49 if (canceled) { 50 return; 51 } 52 progressMonitor.finishTask(); 53 if (jc.isSmallerJunction() ) { 54 showjunction(); 55 JOptionPane.showMessageDialog(Main.parent, tr ("The marked channels contains a junctioncandidate (white). To test this candidat mark these channel and press the \"Check\" button again.")); 56 } 57 else if (jc.getCheck()) { 58 showjunction(); 59 JOptionPane.showMessageDialog(Main.parent, tr ("The marked channels are a {0}-ways junction", n)); 60 plugin.getChannelDigraph().ereaseJunctioncandidate(); 61 for (int i = 0; i < jc.getSubJunction().size(); i++) { 62 plugin.getChannelDigraph().addJunctioncandidateChannel(jc.getSubJunction().get(i)); 63 } 64 if (producerelation) { 65 this.plugin.getRelationProducer().produceRelation(subset, n); 66 } 67 } 68 else if (!jc.getCheck()) { 69 JOptionPane.showMessageDialog(Main.parent, tr ("The marked channels are not a junction:") + jc.getJCheckResult()); 70 70 71 }71 } 72 72 73 }73 } 74 74 75 @Override76 protected void realRun() throws SAXException, IOException,77 OsmTransferException {78 jc.checkjunctions(new ArrayList<Channel>(subset), getProgressMonitor());79 }75 @Override 76 protected void realRun() throws SAXException, IOException, 77 OsmTransferException { 78 jc.checkjunctions(new ArrayList<Channel>(subset), getProgressMonitor()); 79 } 80 80 81 public JunctionChecker getJunctionChecker() {82 return jc;83 }81 public JunctionChecker getJunctionChecker() { 82 return jc; 83 } 84 84 85 /**86 * zeigt den gefundenen Kreuzungskandidatena an87 */88 private void showjunction() {89 plugin.getChannelDigraph().ereaseJunctioncandidate();90 for (int i = 0; i < jc.getSubJunction().size(); i++) {91 plugin.getChannelDigraph().addJunctioncandidateChannel(jc.getSubJunction().get(i));92 }93 Main.map.mapView.setActiveLayer(plugin.getChannelDigraphLayer());94 }85 /** 86 * zeigt den gefundenen Kreuzungskandidatena an 87 */ 88 private void showjunction() { 89 plugin.getChannelDigraph().ereaseJunctioncandidate(); 90 for (int i = 0; i < jc.getSubJunction().size(); i++) { 91 plugin.getChannelDigraph().addJunctioncandidateChannel(jc.getSubJunction().get(i)); 92 } 93 Main.map.mapView.setActiveLayer(plugin.getChannelDigraphLayer()); 94 } 95 95 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/JunctionCheckerMapMode.java
r29595 r30725 24 24 public class JunctionCheckerMapMode extends MapMode implements LayerChangeListener{ 25 25 26 MapFrame frame;27 Point pointPressed;28 ChannelDiGraphLayer layer;29 Rectangle oldRect;30 ChannelDiGraph digraph;26 MapFrame frame; 27 Point pointPressed; 28 ChannelDiGraphLayer layer; 29 Rectangle oldRect; 30 ChannelDiGraph digraph; 31 31 32 private static final long serialVersionUID = 3442408951505263850L;32 private static final long serialVersionUID = 3442408951505263850L; 33 33 34 public JunctionCheckerMapMode(MapFrame mapFrame, String name, String desc) {35 super(name, "junctionchecker.png", desc, mapFrame, Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));36 }34 public JunctionCheckerMapMode(MapFrame mapFrame, String name, String desc) { 35 super(name, "junctionchecker.png", desc, mapFrame, Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); 36 } 37 37 38 @Override public void enterMode() {39 super.enterMode();40 Main.map.mapView.addMouseListener(this);41 Main.map.mapView.addMouseMotionListener(this);42 MapView.addLayerChangeListener(this);43 }38 @Override public void enterMode() { 39 super.enterMode(); 40 Main.map.mapView.addMouseListener(this); 41 Main.map.mapView.addMouseMotionListener(this); 42 MapView.addLayerChangeListener(this); 43 } 44 44 45 @Override public void exitMode() {46 super.exitMode();47 Main.map.mapView.removeMouseListener(this);48 Main.map.mapView.removeMouseMotionListener(this);49 }45 @Override public void exitMode() { 46 super.exitMode(); 47 Main.map.mapView.removeMouseListener(this); 48 Main.map.mapView.removeMouseMotionListener(this); 49 } 50 50 51 51 52 public void activeLayerChange(Layer oldLayer, Layer newLayer) {53 if (newLayer instanceof ChannelDiGraphLayer) {54 layer = (ChannelDiGraphLayer) newLayer;55 }56 }52 public void activeLayerChange(Layer oldLayer, Layer newLayer) { 53 if (newLayer instanceof ChannelDiGraphLayer) { 54 layer = (ChannelDiGraphLayer) newLayer; 55 } 56 } 57 57 58 public void layerAdded(Layer newLayer) {59 }58 public void layerAdded(Layer newLayer) { 59 } 60 60 61 public void layerRemoved(Layer oldLayer) {62 }61 public void layerRemoved(Layer oldLayer) { 62 } 63 63 64 64 65 public void setFrame(MapFrame newFrame) {66 frame = newFrame;67 }65 public void setFrame(MapFrame newFrame) { 66 frame = newFrame; 67 } 68 68 69 @Override public void mousePressed(MouseEvent e) {70 pointPressed = new Point(e.getPoint());71 }69 @Override public void mousePressed(MouseEvent e) { 70 pointPressed = new Point(e.getPoint()); 71 } 72 72 73 73 74 @Override public void mouseDragged(MouseEvent e) {75 if ( (e.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK) == InputEvent.BUTTON1_DOWN_MASK) {76 //if button1 is hold, draw the rectangle.77 paintRect(pointPressed, e.getPoint());78 }79 }74 @Override public void mouseDragged(MouseEvent e) { 75 if ( (e.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK) == InputEvent.BUTTON1_DOWN_MASK) { 76 //if button1 is hold, draw the rectangle. 77 paintRect(pointPressed, e.getPoint()); 78 } 79 } 80 80 81 @Override public void mouseReleased(MouseEvent e) {82 if (e.getButton() != MouseEvent.BUTTON1) {83 return;84 }85 requestFocusInMapView();86 digraph.ereaseJunctioncandidate();//um zu verhindern, dass gefundene Kreuzungen/Kandidaten weiterhin weiß gezeichnet werden87 Point pointReleased = e.getPoint();81 @Override public void mouseReleased(MouseEvent e) { 82 if (e.getButton() != MouseEvent.BUTTON1) { 83 return; 84 } 85 requestFocusInMapView(); 86 digraph.ereaseJunctioncandidate();//um zu verhindern, dass gefundene Kreuzungen/Kandidaten weiterhin weiß gezeichnet werden 87 Point pointReleased = e.getPoint(); 88 88 89 Rectangle r = createRect(pointReleased, pointPressed);90 //boolean ctrl = (e.getModifiers() & ActionEvent.CTRL_MASK) != 0;91 boolean shift = (e.getModifiers() & ActionEvent.SHIFT_MASK) != 0;92 //boolean alt = (e.getModifiers() & ActionEvent.ALT_MASK) != 0;93 if (shift == false) {94 digraph.ereaseSelectedChannels();95 }96 //go through nodes and mark the ones in the selection rect as deleted97 if (layer != null && digraph != null) {98 LatLon lefttop = Main.map.mapView.getLatLon(r.x + r.width, r.y + r.height);99 LatLon rightbottom = Main.map.mapView.getLatLon(r.x, r.y);100 digraph.detectSelectedChannels(rightbottom.lon(), rightbottom.lat(), lefttop.lon(), lefttop.lat());101 }102 oldRect = null;103 Main.map.mapView.repaint();89 Rectangle r = createRect(pointReleased, pointPressed); 90 //boolean ctrl = (e.getModifiers() & ActionEvent.CTRL_MASK) != 0; 91 boolean shift = (e.getModifiers() & ActionEvent.SHIFT_MASK) != 0; 92 //boolean alt = (e.getModifiers() & ActionEvent.ALT_MASK) != 0; 93 if (shift == false) { 94 digraph.ereaseSelectedChannels(); 95 } 96 //go through nodes and mark the ones in the selection rect as deleted 97 if (layer != null && digraph != null) { 98 LatLon lefttop = Main.map.mapView.getLatLon(r.x + r.width, r.y + r.height); 99 LatLon rightbottom = Main.map.mapView.getLatLon(r.x, r.y); 100 digraph.detectSelectedChannels(rightbottom.lon(), rightbottom.lat(), lefttop.lon(), lefttop.lat()); 101 } 102 oldRect = null; 103 Main.map.mapView.repaint(); 104 104 105 }105 } 106 106 107 /**108 * create rectangle out of two given corners109 */110 public Rectangle createRect(Point p1, Point p2) {111 int x,y,w,h;112 if (p1.x == p2.x && p1.y == p2.y) {113 //if p1 and p2 same points draw a small rectangle around them114 x = p1.x -1;115 y = p1.y -1;116 w = 3;117 h = 3;118 } else {119 if (p1.x < p2.x){120 x = p1.x;121 w = p2.x-p1.x;122 } else {123 x = p2.x;124 w = p1.x-p2.x;125 }126 if (p1.y < p2.y) {127 y = p1.y;128 h = p2.y-p1.y;129 } else {130 y = p2.y;131 h = p1.y-p2.y;132 }133 }134 return new Rectangle(x,y,w,h);135 }107 /** 108 * create rectangle out of two given corners 109 */ 110 public Rectangle createRect(Point p1, Point p2) { 111 int x,y,w,h; 112 if (p1.x == p2.x && p1.y == p2.y) { 113 //if p1 and p2 same points draw a small rectangle around them 114 x = p1.x -1; 115 y = p1.y -1; 116 w = 3; 117 h = 3; 118 } else { 119 if (p1.x < p2.x){ 120 x = p1.x; 121 w = p2.x-p1.x; 122 } else { 123 x = p2.x; 124 w = p1.x-p2.x; 125 } 126 if (p1.y < p2.y) { 127 y = p1.y; 128 h = p2.y-p1.y; 129 } else { 130 y = p2.y; 131 h = p1.y-p2.y; 132 } 133 } 134 return new Rectangle(x,y,w,h); 135 } 136 136 137 /**138 * Draw a selection rectangle on screen.139 */140 private void paintRect(Point p1, Point p2) {141 if (frame != null) {142 Graphics g = frame.getGraphics();143 144 Rectangle r = oldRect;145 if (r != null) {146 //overwrite old rct147 g.setXORMode(Color.BLACK);148 g.setColor(Color.WHITE);149 g.drawRect(r.x,r.y,r.width,r.height);150 }151 152 g.setXORMode(Color.BLACK);153 g.setColor(Color.WHITE);154 r = createRect(p1,p2);155 g.drawRect(r.x,r.y,r.width,r.height);156 oldRect = r;157 }158 }137 /** 138 * Draw a selection rectangle on screen. 139 */ 140 private void paintRect(Point p1, Point p2) { 141 if (frame != null) { 142 Graphics g = frame.getGraphics(); 143 144 Rectangle r = oldRect; 145 if (r != null) { 146 //overwrite old rct 147 g.setXORMode(Color.BLACK); 148 g.setColor(Color.WHITE); 149 g.drawRect(r.x,r.y,r.width,r.height); 150 } 151 152 g.setXORMode(Color.BLACK); 153 g.setColor(Color.WHITE); 154 r = createRect(p1,p2); 155 g.drawRect(r.x,r.y,r.width,r.height); 156 oldRect = r; 157 } 158 } 159 159 160 public ChannelDiGraph getDigraph() {161 return digraph;162 }160 public ChannelDiGraph getDigraph() { 161 return digraph; 162 } 163 163 164 public void setDigraph(ChannelDiGraph digraph) {165 this.digraph = digraph;166 }164 public void setDigraph(ChannelDiGraph digraph) { 165 this.digraph = digraph; 166 } 167 167 168 @Override169 public void destroy() {170 super.destroy();171 MapView.removeLayerChangeListener(this);172 }168 @Override 169 public void destroy() { 170 super.destroy(); 171 MapView.removeLayerChangeListener(this); 172 } 173 173 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/JunctionSearchTask.java
r26337 r30725 22 22 public class JunctionSearchTask extends PleaseWaitRunnable{ 23 23 24 private final JunctionChecker jc;25 private final JunctionCheckerPlugin plugin;26 private final int n;27 private final HashSet<Channel> subset;28 private final boolean produceRelation;29 private boolean canceled;24 private final JunctionChecker jc; 25 private final JunctionCheckerPlugin plugin; 26 private final int n; 27 private final HashSet<Channel> subset; 28 private final boolean produceRelation; 29 private boolean canceled; 30 30 31 public JunctionSearchTask(JunctionCheckerPlugin plugin, int n,32 HashSet<Channel> subset,33 boolean produceRelation) {34 super("JunctionSearch",false);35 this.plugin = plugin;36 this.n = n;37 this.subset = subset;38 this.produceRelation = produceRelation;39 jc = new JunctionChecker(plugin.getChannelDigraph(), n);40 }31 public JunctionSearchTask(JunctionCheckerPlugin plugin, int n, 32 HashSet<Channel> subset, 33 boolean produceRelation) { 34 super("JunctionSearch",false); 35 this.plugin = plugin; 36 this.n = n; 37 this.subset = subset; 38 this.produceRelation = produceRelation; 39 jc = new JunctionChecker(plugin.getChannelDigraph(), n); 40 } 41 41 42 @Override43 protected void cancel() {44 this.canceled = true;45 progressMonitor.cancel();46 }42 @Override 43 protected void cancel() { 44 this.canceled = true; 45 progressMonitor.cancel(); 46 } 47 47 48 @Override49 protected void finish() {50 progressMonitor.finishTask();51 if (canceled) {52 return;53 }54 ArrayList<HashSet<Channel>> junctions = jc.getJunctions();55 JOptionPane.showMessageDialog(Main.parent, tr("Number of {0}-ways junctions found: {1}", n, junctions.size()));56 if (produceRelation) {57 for (int i = 0; i < junctions.size(); i++) {58 plugin.getRelationProducer().produceRelation(junctions.get(i) , n);59 }60 }61 }48 @Override 49 protected void finish() { 50 progressMonitor.finishTask(); 51 if (canceled) { 52 return; 53 } 54 ArrayList<HashSet<Channel>> junctions = jc.getJunctions(); 55 JOptionPane.showMessageDialog(Main.parent, tr("Number of {0}-ways junctions found: {1}", n, junctions.size())); 56 if (produceRelation) { 57 for (int i = 0; i < junctions.size(); i++) { 58 plugin.getRelationProducer().produceRelation(junctions.get(i) , n); 59 } 60 } 61 } 62 62 63 @Override64 protected void realRun() throws SAXException, IOException,65 OsmTransferException {66 jc.junctionSearch(new ArrayList<Channel>(subset), getProgressMonitor());67 }63 @Override 64 protected void realRun() throws SAXException, IOException, 65 OsmTransferException { 66 jc.junctionSearch(new ArrayList<Channel>(subset), getProgressMonitor()); 67 } 68 68 69 69 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/PrepareJunctionCheckorSearch.java
r25501 r30725 14 14 public class PrepareJunctionCheckorSearch { 15 15 16 private final JunctionCheckerPlugin plugin;17 private final int n;18 private HashSet<Channel> subset;19 private JunctionCheckTask jct;20 private final boolean produceRelation;16 private final JunctionCheckerPlugin plugin; 17 private final int n; 18 private HashSet<Channel> subset; 19 private JunctionCheckTask jct; 20 private final boolean produceRelation; 21 21 22 public PrepareJunctionCheckorSearch(JunctionCheckerPlugin plugin, int n, boolean producerelation) {23 this.plugin = plugin;24 this.n = n;25 this.subset = new HashSet<Channel>();26 this.produceRelation = producerelation;27 }22 public PrepareJunctionCheckorSearch(JunctionCheckerPlugin plugin, int n, boolean producerelation) { 23 this.plugin = plugin; 24 this.n = n; 25 this.subset = new HashSet<Channel>(); 26 this.produceRelation = producerelation; 27 } 28 28 29 29 30 protected void prepareJunctionCheck() {31 if (prepareSubset()) {32 jct = new JunctionCheckTask(plugin, n, subset, produceRelation);33 Main.worker.submit(jct);34 }35 }30 protected void prepareJunctionCheck() { 31 if (prepareSubset()) { 32 jct = new JunctionCheckTask(plugin, n, subset, produceRelation); 33 Main.worker.submit(jct); 34 } 35 } 36 36 37 protected void prepareJunctionSearch() {38 if (prepareSubset()) {39 JunctionSearchTask jst = new JunctionSearchTask(plugin, n, subset, produceRelation);40 Main.worker.submit(jst);41 }42 }37 protected void prepareJunctionSearch() { 38 if (prepareSubset()) { 39 JunctionSearchTask jst = new JunctionSearchTask(plugin, n, subset, produceRelation); 40 Main.worker.submit(jst); 41 } 42 } 43 43 44 private boolean prepareSubset(){45 if (plugin.getChannelDigraph().getSelectedChannels().size() < 6) {46 JOptionPane.showMessageDialog(Main.parent, "Less then 6 channels are selected");47 return false;48 }49 subset = plugin.getChannelDigraph().getSelectedChannels();50 return true;51 }44 private boolean prepareSubset(){ 45 if (plugin.getChannelDigraph().getSelectedChannels().size() < 6) { 46 JOptionPane.showMessageDialog(Main.parent, "Less then 6 channels are selected"); 47 return false; 48 } 49 subset = plugin.getChannelDigraph().getSelectedChannels(); 50 return true; 51 } 52 52 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/commandlineinterface/CLI.java
r25501 r30725 18 18 public class CLI { 19 19 20 /**21 * Die Klasse ist zum Erstellen statistischer Tests, oder zur Erzeugung einer Channel-Digraph-XML-Datei22 * @param args23 */24 public static void main(String[] args) {20 /** 21 * Die Klasse ist zum Erstellen statistischer Tests, oder zur Erzeugung einer Channel-Digraph-XML-Datei 22 * @param args 23 */ 24 public static void main(String[] args) { 25 25 26 String inputosm = "";27 String outputosm = "";28 int maxchannelsearch = 0;29 int ticks = 0;30 int n = 0;31 int runs = 0;26 String inputosm = ""; 27 String outputosm = ""; 28 int maxchannelsearch = 0; 29 int ticks = 0; 30 int n = 0; 31 int runs = 0; 32 32 33 final String WAYFILTERFILE = "/resources/xml/waysfilter.xml";33 final String WAYFILTERFILE = "/resources/xml/waysfilter.xml"; 34 34 35 if (args.length != 6) {36 System.out.println("Parameter:\n inputosm (osmxml) \n outputchannelosm (outputosmxml) \n maxchannelsearch (wieviele channel sollen max. überprüft werdne) \n ticks (schrittweite) \n n (n-wege-kreuzung) \n durchläufe (wieviele durchläufe pro suchdurchgang)");37 return;38 } else {39 inputosm = args[0];40 outputosm = args[1];41 maxchannelsearch = Integer.parseInt(args[2]);42 ticks = Integer.parseInt(args[3]);43 n = Integer.parseInt(args[4]);44 runs = Integer.parseInt(args[5]);45 }35 if (args.length != 6) { 36 System.out.println("Parameter:\n inputosm (osmxml) \n outputchannelosm (outputosmxml) \n maxchannelsearch (wieviele channel sollen max. überprüft werdne) \n ticks (schrittweite) \n n (n-wege-kreuzung) \n durchläufe (wieviele durchläufe pro suchdurchgang)"); 37 return; 38 } else { 39 inputosm = args[0]; 40 outputosm = args[1]; 41 maxchannelsearch = Integer.parseInt(args[2]); 42 ticks = Integer.parseInt(args[3]); 43 n = Integer.parseInt(args[4]); 44 runs = Integer.parseInt(args[5]); 45 } 46 46 47 // XML datei einlesen48 File file = new File(inputosm);49 OSMXMLReader xmlreader = new OSMXMLReader(file);50 xmlreader.parseXML();47 // XML datei einlesen 48 File file = new File(inputosm); 49 OSMXMLReader xmlreader = new OSMXMLReader(file); 50 xmlreader.parseXML(); 51 51 52 // Filter mit gewünschten Ways laden53 XMLFilterReader reader = new XMLFilterReader(54 WAYFILTERFILE);55 reader.parseXML();52 // Filter mit gewünschten Ways laden 53 XMLFilterReader reader = new XMLFilterReader( 54 WAYFILTERFILE); 55 reader.parseXML(); 56 56 57 // gewünschte Ways filtern58 ExecuteFilter ef = new ExecuteFilter(reader.getFilters(), xmlreader59 .getOSMGraph());60 ef.filter();57 // gewünschte Ways filtern 58 ExecuteFilter ef = new ExecuteFilter(reader.getFilters(), xmlreader 59 .getOSMGraph()); 60 ef.filter(); 61 61 62 // ChannelDiGraphen erzeugen63 ChannelDigraphBuilder cdgb = new ChannelDigraphBuilder(ef.getOutgoinggraph());64 cdgb.buildChannelDigraph();62 // ChannelDiGraphen erzeugen 63 ChannelDigraphBuilder cdgb = new ChannelDigraphBuilder(ef.getOutgoinggraph()); 64 cdgb.buildChannelDigraph(); 65 65 66 // DiGraph "versiegeln"67 //DiGraphSealer sealer = new DiGraphSealer(cdgb.getDigraph(), cdgb68 //.getNewid());69 //sealer.sealingGraph();66 // DiGraph "versiegeln" 67 //DiGraphSealer sealer = new DiGraphSealer(cdgb.getDigraph(), cdgb 68 // .getNewid()); 69 //sealer.sealingGraph(); 70 70 71 StrongConnectednessCalculator scc = new StrongConnectednessCalculator(cdgb.getDigraph());72 scc.calculateSCC();73 //System.out.println(scc.showNotstronglyConnectednessParts());71 StrongConnectednessCalculator scc = new StrongConnectednessCalculator(cdgb.getDigraph()); 72 scc.calculateSCC(); 73 //System.out.println(scc.showNotstronglyConnectednessParts()); 74 74 75 if (maxchannelsearch == 0) {76 OSMXMLWriter oxw = new OSMXMLWriter(outputosm, cdgb.getDigraph());77 try {78 oxw.writeXML();79 } catch (FileNotFoundException e) {80 // TODO Auto-generated catch block81 e.printStackTrace();82 } catch (XMLStreamException e) {83 // TODO Auto-generated catch block84 e.printStackTrace();85 }86 ;75 if (maxchannelsearch == 0) { 76 OSMXMLWriter oxw = new OSMXMLWriter(outputosm, cdgb.getDigraph()); 77 try { 78 oxw.writeXML(); 79 } catch (FileNotFoundException e) { 80 // TODO Auto-generated catch block 81 e.printStackTrace(); 82 } catch (XMLStreamException e) { 83 // TODO Auto-generated catch block 84 e.printStackTrace(); 85 } 86 ; 87 87 88 System.out.println("OSMXML erzeugt, breche an dieser Stelle ab");89 return;90 }88 System.out.println("OSMXML erzeugt, breche an dieser Stelle ab"); 89 return; 90 } 91 91 92 JunctionChecker jc = new JunctionChecker(cdgb.getDigraph(), n);93 ArrayList<Channel> subset = new ArrayList<Channel>();92 JunctionChecker jc = new JunctionChecker(cdgb.getDigraph(), n); 93 ArrayList<Channel> subset = new ArrayList<Channel>(); 94 94 95 Channel seed = new Channel();96 Channel vorChannel;97 Channel tempChannel;98 boolean isIn = false;99 int jcf;100 long measuredIterateThroughTime = 0;101 long measuredGenerateSubColumnTime = 0;102 long measuredTime = 0;103 long start;95 Channel seed = new Channel(); 96 Channel vorChannel; 97 Channel tempChannel; 98 boolean isIn = false; 99 int jcf; 100 long measuredIterateThroughTime = 0; 101 long measuredGenerateSubColumnTime = 0; 102 long measuredTime = 0; 103 long start; 104 104 105 //Unzusammenhängenden Teilgraph erzeugen106 /*107 for (int i = 6; i < maxchannelsearch; i = i + ticks) {108 //diff = 0;109 start = System.currentTimeMillis();110 jcf = 0;111 //System.out.println("maxchannel: " + i);112 for (int j = 0; j < runs; j++) {113 //System.out.println("run: " +j);114 subset.clear();115 for (int j2 = 0; j2 <= i; j2++) {116 subset.add(cdgb.getDigraph()117 .getChannelAtPosition(118 (int) ((cdgb.getDigraph().getChannels()119 .size()) * Math.random())));120 }121 //System.out.println("jc gestartet");122 start = System.currentTimeMillis();123 jc.junctionSearch(subset);124 measuredTime += (System.currentTimeMillis() - start);125 //System.out.println("jc beendet");126 //diff = diff + (System.currentTimeMillis() - start);127 measuredIterateThroughTime += jc.getMeasuredIterateTime();128 measuredGenerateSubColumnTime += jc.getMeasuredGenerateTime();129 }130 System.out.println("Channels: " + (i) + " Time(Iterate): " + (measuredIterateThroughTime/runs) + " Time(Generate): " + (measuredGenerateSubColumnTime/runs) +" Time(overall): "+ (measuredTime/runs) + " junctionsfound: " + jcf);131 }*/105 //Unzusammenhängenden Teilgraph erzeugen 106 /* 107 for (int i = 6; i < maxchannelsearch; i = i + ticks) { 108 //diff = 0; 109 start = System.currentTimeMillis(); 110 jcf = 0; 111 //System.out.println("maxchannel: " + i); 112 for (int j = 0; j < runs; j++) { 113 //System.out.println("run: " +j); 114 subset.clear(); 115 for (int j2 = 0; j2 <= i; j2++) { 116 subset.add(cdgb.getDigraph() 117 .getChannelAtPosition( 118 (int) ((cdgb.getDigraph().getChannels() 119 .size()) * Math.random()))); 120 } 121 //System.out.println("jc gestartet"); 122 start = System.currentTimeMillis(); 123 jc.junctionSearch(subset); 124 measuredTime += (System.currentTimeMillis() - start); 125 //System.out.println("jc beendet"); 126 //diff = diff + (System.currentTimeMillis() - start); 127 measuredIterateThroughTime += jc.getMeasuredIterateTime(); 128 measuredGenerateSubColumnTime += jc.getMeasuredGenerateTime(); 129 } 130 System.out.println("Channels: " + (i) + " Time(Iterate): " + (measuredIterateThroughTime/runs) + " Time(Generate): " + (measuredGenerateSubColumnTime/runs) +" Time(overall): "+ (measuredTime/runs) + " junctionsfound: " + jcf); 131 }*/ 132 132 133 //Zusammenhängenden Teilgraph erzeugen133 //Zusammenhängenden Teilgraph erzeugen 134 134 135 for (int i = 5; i < maxchannelsearch; i = i + ticks) {136 measuredIterateThroughTime = 0;137 measuredGenerateSubColumnTime = 0;138 measuredTime =0;139 jcf = 0;140 //System.out.println("maxchannel: " + i);141 for (int j = 0; j < runs; j++) {142 //System.out.println("run: " +j);143 subset.clear();144 do {145 seed = cdgb.getDigraph()146 .getChannelAtPosition(147 (int) ((cdgb.getDigraph().getChannels()148 .size()) * Math.random()));149 }150 while(!seed.isStrongConnected());151 subset.add(seed);152 //System.out.println("Seed: " + seed.getNewid());153 vorChannel = seed;154 for (int k = 0; k < i - 1; k++) {155 isIn = false;156 do {157 tempChannel = getNeighbourChannel(vorChannel);158 if (!subset.contains(tempChannel)) {159 subset.add(tempChannel);160 //System.out.println("zugefügt: " + tempChannel.getNewid());161 seed = tempChannel;162 isIn = true;163 }164 else {165 vorChannel = tempChannel;166 isIn = false;167 }168 }while (isIn == false);169 }170 start = System.currentTimeMillis();171 jc.junctionSearch(subset);172 measuredTime += (System.currentTimeMillis() - start);173 //System.out.println("jc beendet");174 measuredIterateThroughTime += jc.getMeasuredIterateTime();175 measuredGenerateSubColumnTime += jc.getMeasuredGenerateTime();176 jcf = jcf + jc.getJunctions().size();177 }178 System.out.println("Channels: " + (i) + " Time(Iterate): " + (measuredIterateThroughTime/runs) + " Time(Generate): " + (measuredGenerateSubColumnTime/runs) +" Time(overall): "+ (measuredTime/runs) + " junctionsfound: " + jcf);179 }180 }135 for (int i = 5; i < maxchannelsearch; i = i + ticks) { 136 measuredIterateThroughTime = 0; 137 measuredGenerateSubColumnTime = 0; 138 measuredTime =0; 139 jcf = 0; 140 //System.out.println("maxchannel: " + i); 141 for (int j = 0; j < runs; j++) { 142 //System.out.println("run: " +j); 143 subset.clear(); 144 do { 145 seed = cdgb.getDigraph() 146 .getChannelAtPosition( 147 (int) ((cdgb.getDigraph().getChannels() 148 .size()) * Math.random())); 149 } 150 while(!seed.isStrongConnected()); 151 subset.add(seed); 152 //System.out.println("Seed: " + seed.getNewid()); 153 vorChannel = seed; 154 for (int k = 0; k < i - 1; k++) { 155 isIn = false; 156 do { 157 tempChannel = getNeighbourChannel(vorChannel); 158 if (!subset.contains(tempChannel)) { 159 subset.add(tempChannel); 160 //System.out.println("zugefügt: " + tempChannel.getNewid()); 161 seed = tempChannel; 162 isIn = true; 163 } 164 else { 165 vorChannel = tempChannel; 166 isIn = false; 167 } 168 }while (isIn == false); 169 } 170 start = System.currentTimeMillis(); 171 jc.junctionSearch(subset); 172 measuredTime += (System.currentTimeMillis() - start); 173 //System.out.println("jc beendet"); 174 measuredIterateThroughTime += jc.getMeasuredIterateTime(); 175 measuredGenerateSubColumnTime += jc.getMeasuredGenerateTime(); 176 jcf = jcf + jc.getJunctions().size(); 177 } 178 System.out.println("Channels: " + (i) + " Time(Iterate): " + (measuredIterateThroughTime/runs) + " Time(Generate): " + (measuredGenerateSubColumnTime/runs) +" Time(overall): "+ (measuredTime/runs) + " junctionsfound: " + jcf); 179 } 180 } 181 181 182 private static Channel getNeighbourChannel(Channel seedChannel) {183 if (Math.random() < 0.5) {184 if (seedChannel.getPredChannels().size() >=1 ) {185 return seedChannel.getPredChannels().get((int) (seedChannel.getPredChannels().size() * Math.random()));186 }187 else return seedChannel;188 }189 else {190 if (seedChannel.getLeadsTo().size() >=1 ) {191 return seedChannel.getLeadsTo().get((int) (seedChannel.getLeadsTo().size() * Math.random())).getToChannel();192 }193 else return seedChannel;194 }195 }182 private static Channel getNeighbourChannel(Channel seedChannel) { 183 if (Math.random() < 0.5) { 184 if (seedChannel.getPredChannels().size() >=1 ) { 185 return seedChannel.getPredChannels().get((int) (seedChannel.getPredChannels().size() * Math.random())); 186 } 187 else return seedChannel; 188 } 189 else { 190 if (seedChannel.getLeadsTo().size() >=1 ) { 191 return seedChannel.getLeadsTo().get((int) (seedChannel.getLeadsTo().size() * Math.random())).getToChannel(); 192 } 193 else return seedChannel; 194 } 195 } 196 196 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/connectedness/BacktrackingColors.java
r25501 r30725 5 5 */ 6 6 public class BacktrackingColors { 7 8 public static final int WHITE = -1;9 public static final int GREY = 0;10 public static final int BLACK = 1;7 8 public static final int WHITE = -1; 9 public static final int GREY = 0; 10 public static final int BLACK = 1; 11 11 12 12 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/connectedness/DiGraphSealer.java
r29854 r30725 15 15 16 16 17 // vorsichtshalber auf einen hohen negativen Wert gesetzt. besser18 // automatisch setzen!19 // TODO: NewID automatisch setzen20 private int newID = 1000000;21 private ChannelDiGraph digraph;17 // vorsichtshalber auf einen hohen negativen Wert gesetzt. besser 18 // automatisch setzen! 19 // TODO: NewID automatisch setzen 20 private int newID = 1000000; 21 private ChannelDiGraph digraph; 22 22 23 public DiGraphSealer(ChannelDiGraph digraph) {24 this.digraph = digraph;25 }23 public DiGraphSealer(ChannelDiGraph digraph) { 24 this.digraph = digraph; 25 } 26 26 27 public DiGraphSealer(ChannelDiGraph digraph, int newID) {28 this.digraph = digraph;29 this.newID = newID;30 }27 public DiGraphSealer(ChannelDiGraph digraph, int newID) { 28 this.digraph = digraph; 29 this.newID = newID; 30 } 31 31 32 /**33 * versiegelt den vorher gesetzten DiGraphen34 */35 public void sealingGraph() {36 Vector<Integer> outgoingChannelIDs = new Vector<Integer>();37 Vector<Integer> incomingChannelIDs = new Vector<Integer>();32 /** 33 * versiegelt den vorher gesetzten DiGraphen 34 */ 35 public void sealingGraph() { 36 Vector<Integer> outgoingChannelIDs = new Vector<Integer>(); 37 Vector<Integer> incomingChannelIDs = new Vector<Integer>(); 38 38 39 for (int i = 0; i < digraph.numberOfChannels(); i++) {40 if (digraph.isInBBox(digraph.getChannelAtPosition(i).getFromNode()) == false) {41 incomingChannelIDs.add(i);42 }43 if (digraph.isInBBox(digraph.getChannelAtPosition(i).getToNode()) == false) {44 outgoingChannelIDs.add(i);45 }46 }47 Channel tempChannel;48 LeadsTo tempLeadsTo;49 for (int i = 0; i < outgoingChannelIDs.size(); i++) {50 if (digraph.getChannelAtPosition(outgoingChannelIDs.get(i))51 .getLeadsTo().size() == 0) {39 for (int i = 0; i < digraph.numberOfChannels(); i++) { 40 if (digraph.isInBBox(digraph.getChannelAtPosition(i).getFromNode()) == false) { 41 incomingChannelIDs.add(i); 42 } 43 if (digraph.isInBBox(digraph.getChannelAtPosition(i).getToNode()) == false) { 44 outgoingChannelIDs.add(i); 45 } 46 } 47 Channel tempChannel; 48 LeadsTo tempLeadsTo; 49 for (int i = 0; i < outgoingChannelIDs.size(); i++) { 50 if (digraph.getChannelAtPosition(outgoingChannelIDs.get(i)) 51 .getLeadsTo().size() == 0) { 52 52 53 tempChannel = new Channel(digraph.getChannelAtPosition(54 outgoingChannelIDs.get(i)).getToNode(), digraph55 .getChannelAtPosition(incomingChannelIDs.get(0))56 .getFromNode());57 //dem Channel auch den neuen Channel als Nachfolger übergeben!!!58 //sonst gibts Probleme beim JunctionCheck59 tempLeadsTo = new LeadsTo(digraph60 .getChannelAtPosition(outgoingChannelIDs.get(i)),61 tempChannel);62 digraph.getChannelAtPosition(outgoingChannelIDs.get(i))63 .addLeadsTo(tempLeadsTo);64 digraph.addLeadsTo(tempLeadsTo);65 tempLeadsTo = new LeadsTo(tempChannel, digraph66 .getChannelAtPosition(incomingChannelIDs.get(0)));67 tempChannel.addLeadsTo(tempLeadsTo);68 digraph.addLeadsTo(tempLeadsTo);69 tempChannel.addWay(digraph.getChannelAtPosition(70 outgoingChannelIDs.get(i)).getWay());71 tempChannel.setNewid(newID);72 newID++;73 digraph.addChannel(tempChannel);74 }75 }53 tempChannel = new Channel(digraph.getChannelAtPosition( 54 outgoingChannelIDs.get(i)).getToNode(), digraph 55 .getChannelAtPosition(incomingChannelIDs.get(0)) 56 .getFromNode()); 57 //dem Channel auch den neuen Channel als Nachfolger übergeben!!! 58 //sonst gibts Probleme beim JunctionCheck 59 tempLeadsTo = new LeadsTo(digraph 60 .getChannelAtPosition(outgoingChannelIDs.get(i)), 61 tempChannel); 62 digraph.getChannelAtPosition(outgoingChannelIDs.get(i)) 63 .addLeadsTo(tempLeadsTo); 64 digraph.addLeadsTo(tempLeadsTo); 65 tempLeadsTo = new LeadsTo(tempChannel, digraph 66 .getChannelAtPosition(incomingChannelIDs.get(0))); 67 tempChannel.addLeadsTo(tempLeadsTo); 68 digraph.addLeadsTo(tempLeadsTo); 69 tempChannel.addWay(digraph.getChannelAtPosition( 70 outgoingChannelIDs.get(i)).getWay()); 71 tempChannel.setNewid(newID); 72 newID++; 73 digraph.addChannel(tempChannel); 74 } 75 } 76 76 77 for (int i = 0; i < incomingChannelIDs.size(); i++) {78 if (digraph.getChannelAtPosition(incomingChannelIDs.get(i))79 .getPredChannels().size() == 0) {80 tempChannel = new Channel(digraph.getChannelAtPosition(81 outgoingChannelIDs.get(0)).getToNode(), digraph82 .getChannelAtPosition(incomingChannelIDs.get(i))83 .getFromNode());84 //dem Channel auch den neuen Channel als Nachfolger überegeben85 // sonst gibt es Probleme beim JuncitonCheck86 digraph87 .getChannelAtPosition(incomingChannelIDs.get(i)).addPredChannel(tempChannel);88 tempLeadsTo = new LeadsTo(tempChannel, digraph89 .getChannelAtPosition(incomingChannelIDs.get(i)));90 tempChannel.addLeadsTo(tempLeadsTo);91 digraph.addLeadsTo(tempLeadsTo);92 tempLeadsTo = new LeadsTo(digraph93 .getChannelAtPosition(outgoingChannelIDs.get(0)),94 tempChannel);95 digraph.getChannelAtPosition(outgoingChannelIDs.get(0))96 .addLeadsTo(tempLeadsTo);97 digraph.addLeadsTo(tempLeadsTo);98 tempChannel.addWay(digraph.getChannelAtPosition(99 incomingChannelIDs.get(i)).getWay());100 tempChannel.setNewid(newID);101 newID++;102 digraph.addChannel(tempChannel);103 }104 }105 this.deleteDuplicateChannels();106 }107 108 /*109 private void showLeadsTo() {110 for (int i = 0; i < digraph.getChannels().size(); i++) {111 log.debug("Untersuche CHannel: " + digraph.getChannelAtPosition(i).getNewid());112 for (int j = 0; j < digraph.getChannelAtPosition(i).getLeadsTo().size(); j++) {113 log.debug("LeadsTo: " + digraph.getChannelAtPosition(i).getLeadsTo().get(j).toString());114 }115 }116 }*/77 for (int i = 0; i < incomingChannelIDs.size(); i++) { 78 if (digraph.getChannelAtPosition(incomingChannelIDs.get(i)) 79 .getPredChannels().size() == 0) { 80 tempChannel = new Channel(digraph.getChannelAtPosition( 81 outgoingChannelIDs.get(0)).getToNode(), digraph 82 .getChannelAtPosition(incomingChannelIDs.get(i)) 83 .getFromNode()); 84 //dem Channel auch den neuen Channel als Nachfolger überegeben 85 // sonst gibt es Probleme beim JuncitonCheck 86 digraph 87 .getChannelAtPosition(incomingChannelIDs.get(i)).addPredChannel(tempChannel); 88 tempLeadsTo = new LeadsTo(tempChannel, digraph 89 .getChannelAtPosition(incomingChannelIDs.get(i))); 90 tempChannel.addLeadsTo(tempLeadsTo); 91 digraph.addLeadsTo(tempLeadsTo); 92 tempLeadsTo = new LeadsTo(digraph 93 .getChannelAtPosition(outgoingChannelIDs.get(0)), 94 tempChannel); 95 digraph.getChannelAtPosition(outgoingChannelIDs.get(0)) 96 .addLeadsTo(tempLeadsTo); 97 digraph.addLeadsTo(tempLeadsTo); 98 tempChannel.addWay(digraph.getChannelAtPosition( 99 incomingChannelIDs.get(i)).getWay()); 100 tempChannel.setNewid(newID); 101 newID++; 102 digraph.addChannel(tempChannel); 103 } 104 } 105 this.deleteDuplicateChannels(); 106 } 107 108 /* 109 private void showLeadsTo() { 110 for (int i = 0; i < digraph.getChannels().size(); i++) { 111 log.debug("Untersuche CHannel: " + digraph.getChannelAtPosition(i).getNewid()); 112 for (int j = 0; j < digraph.getChannelAtPosition(i).getLeadsTo().size(); j++) { 113 log.debug("LeadsTo: " + digraph.getChannelAtPosition(i).getLeadsTo().get(j).toString()); 114 } 115 } 116 }*/ 117 117 118 /**119 * dirt'n'quick methode zum löschen doppelter channels TODO:120 * versiegeln-methode überarbeiten121 *TODO: benutze ich die überhaupt noch?122 */123 private void deleteDuplicateChannels() {118 /** 119 * dirt'n'quick methode zum löschen doppelter channels TODO: 120 * versiegeln-methode überarbeiten 121 *TODO: benutze ich die überhaupt noch? 122 */ 123 private void deleteDuplicateChannels() { 124 124 125 for (int i = 0; i < digraph.getChannels().size(); i++) {126 for (int j = i + 1; j < digraph.getChannels().size(); j++) {127 if (digraph.getChannelAtPosition(i).getFromNode() == digraph128 .getChannelAtPosition(j).getFromNode()129 && digraph.getChannelAtPosition(i).getToNode() == digraph130 .getChannelAtPosition(j).getToNode()) {131 digraph.removeChannel(digraph.getChannelAtPosition(j));132 }133 }134 }135 }125 for (int i = 0; i < digraph.getChannels().size(); i++) { 126 for (int j = i + 1; j < digraph.getChannels().size(); j++) { 127 if (digraph.getChannelAtPosition(i).getFromNode() == digraph 128 .getChannelAtPosition(j).getFromNode() 129 && digraph.getChannelAtPosition(i).getToNode() == digraph 130 .getChannelAtPosition(j).getToNode()) { 131 digraph.removeChannel(digraph.getChannelAtPosition(j)); 132 } 133 } 134 } 135 } 136 136 137 /*138 * setzt Wert für IDs für neu angelegte Ways139 */140 /**141 * @param newID142 */143 public void setNewID(int newID) {144 this.newID = newID;145 }137 /* 138 * setzt Wert für IDs für neu angelegte Ways 139 */ 140 /** 141 * @param newID 142 */ 143 public void setNewID(int newID) { 144 this.newID = newID; 145 } 146 146 147 /**148 * @return149 * @uml.property name="newID"150 */151 public int getNewID() {152 return newID;153 }147 /** 148 * @return 149 * @uml.property name="newID" 150 */ 151 public int getNewID() { 152 return newID; 153 } 154 154 155 public ChannelDiGraph getDiGraph() {156 return digraph;157 }155 public ChannelDiGraph getDiGraph() { 156 return digraph; 157 } 158 158 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/connectedness/StrongConnectednessCalculator.java
r25501 r30725 7 7 public class StrongConnectednessCalculator { 8 8 9 private int index = 0;10 private final ArrayList<Channel> stack = new ArrayList<Channel>();11 private final ArrayList<ArrayList<Channel>> SCC = new ArrayList<ArrayList<Channel>>();12 private final int numberOfNodes;13 private int calculatedNodes = 0;14 private ArrayList<Channel> nsccchannels = new ArrayList<Channel>();15 private final ChannelDiGraph digraph;16 int biggestPart = 0;9 private int index = 0; 10 private final ArrayList<Channel> stack = new ArrayList<Channel>(); 11 private final ArrayList<ArrayList<Channel>> SCC = new ArrayList<ArrayList<Channel>>(); 12 private final int numberOfNodes; 13 private int calculatedNodes = 0; 14 private ArrayList<Channel> nsccchannels = new ArrayList<Channel>(); 15 private final ChannelDiGraph digraph; 16 int biggestPart = 0; 17 17 18 public StrongConnectednessCalculator(ChannelDiGraph digraph) {19 this.digraph = digraph;20 numberOfNodes = digraph.numberOfChannels();21 }18 public StrongConnectednessCalculator(ChannelDiGraph digraph) { 19 this.digraph = digraph; 20 numberOfNodes = digraph.numberOfChannels(); 21 } 22 22 23 private int findUncalculatedNodes() {24 for (int i = 0; i < numberOfNodes; i++) {25 if (digraph.getChannelAtPosition(i).getLowlink() == -1) {26 return i;27 }28 }29 return 0;30 }23 private int findUncalculatedNodes() { 24 for (int i = 0; i < numberOfNodes; i++) { 25 if (digraph.getChannelAtPosition(i).getLowlink() == -1) { 26 return i; 27 } 28 } 29 return 0; 30 } 31 31 32 /**33 * berechnet die starken Zusammenhangskomponenten34 */35 public void calculateSCC() {36 while (calculatedNodes != numberOfNodes) {37 //log.trace("calculatedNodes: " + calculatedNodes + ", gesamtnodes: " + numberOfNodes);38 tarjan(digraph.getChannelAtPosition(findUncalculatedNodes()));39 }40 //log.trace("Berechnung der starken Zusammenhangskomponenten beendet: \n " +numberOfNodes + " Nodes sind wie folgt aufgeteilt: ");41 for (int i = 0; i < SCC.size(); i++) {42 //log.trace("Komponente: " + i + " besteht aus " + SCC.get(i).size()+ " Knoten");43 /**44 * for (int j = 1; j < list.getNumberOfNodes(); j++) { if45 * (list.getAdjacencyListnodes()[j].getIndex()== -1) {46 * System.out.println("====");47 * System.out.println(list.getAdjacencyListnodes48 * ()[j].getNode().toString()); } }49 **/50 }51 findBiggestPiece();52 saveNotSCCChannel();53 }32 /** 33 * berechnet die starken Zusammenhangskomponenten 34 */ 35 public void calculateSCC() { 36 while (calculatedNodes != numberOfNodes) { 37 //log.trace("calculatedNodes: " + calculatedNodes + ", gesamtnodes: " + numberOfNodes); 38 tarjan(digraph.getChannelAtPosition(findUncalculatedNodes())); 39 } 40 //log.trace("Berechnung der starken Zusammenhangskomponenten beendet: \n " +numberOfNodes + " Nodes sind wie folgt aufgeteilt: "); 41 for (int i = 0; i < SCC.size(); i++) { 42 //log.trace("Komponente: " + i + " besteht aus " + SCC.get(i).size()+ " Knoten"); 43 /** 44 * for (int j = 1; j < list.getNumberOfNodes(); j++) { if 45 * (list.getAdjacencyListnodes()[j].getIndex()== -1) { 46 * System.out.println("===="); 47 * System.out.println(list.getAdjacencyListnodes 48 * ()[j].getNode().toString()); } } 49 **/ 50 } 51 findBiggestPiece(); 52 saveNotSCCChannel(); 53 } 54 54 55 /**56 * speichert alle Channel, die nicht stark zusammenhängend sind, in einer ArrayList57 **/58 private void saveNotSCCChannel() {59 nsccchannels = new ArrayList<Channel>();60 for (int i = 0; i < SCC.size(); i++) {61 if (i != biggestPart) {62 nsccchannels.addAll(SCC.get(i));63 }64 }65 //alle Channels auf nicht zusammenhängend setzen66 for (int i = 0; i < nsccchannels.size(); i++) {67 nsccchannels.get(i).setStrongConnected(false);68 }69 }55 /** 56 * speichert alle Channel, die nicht stark zusammenhängend sind, in einer ArrayList 57 **/ 58 private void saveNotSCCChannel() { 59 nsccchannels = new ArrayList<Channel>(); 60 for (int i = 0; i < SCC.size(); i++) { 61 if (i != biggestPart) { 62 nsccchannels.addAll(SCC.get(i)); 63 } 64 } 65 //alle Channels auf nicht zusammenhängend setzen 66 for (int i = 0; i < nsccchannels.size(); i++) { 67 nsccchannels.get(i).setStrongConnected(false); 68 } 69 } 70 70 71 private void findBiggestPiece() {72 int number = 0;73 for (int i = 0; i < SCC.size(); i++) {74 if (SCC.get(i).size() > number) {75 biggestPart = i;76 number = SCC.get(i).size();77 }78 }79 }71 private void findBiggestPiece() { 72 int number = 0; 73 for (int i = 0; i < SCC.size(); i++) { 74 if (SCC.get(i).size() > number) { 75 biggestPart = i; 76 number = SCC.get(i).size(); 77 } 78 } 79 } 80 80 81 public String showNotstronglyConnectednessParts() {82 String s = new String();83 for (int i = 0; i < SCC.size(); i++) {84 if (i != biggestPart) {85 s += "GraphKomponente: " + i + "\n";86 for (int j = 0; j < SCC.get(i).size(); j++) {87 s += "Channel: " + SCC.get(i).get(j).getNewid();88 }89 s += "\n";90 }91 }92 return s;93 }81 public String showNotstronglyConnectednessParts() { 82 String s = new String(); 83 for (int i = 0; i < SCC.size(); i++) { 84 if (i != biggestPart) { 85 s += "GraphKomponente: " + i + "\n"; 86 for (int j = 0; j < SCC.get(i).size(); j++) { 87 s += "Channel: " + SCC.get(i).get(j).getNewid(); 88 } 89 s += "\n"; 90 } 91 } 92 return s; 93 } 94 94 95 /**96 * gibt eine Arraylist mit all den Channels zurück, welche nicht97 * im größten zusammenhägendem Teil des Channel-Digraphen sind98 * @return99 */100 public ArrayList<Channel> getNotConnectedChannels() {101 return nsccchannels;102 }95 /** 96 * gibt eine Arraylist mit all den Channels zurück, welche nicht 97 * im größten zusammenhägendem Teil des Channel-Digraphen sind 98 * @return 99 */ 100 public ArrayList<Channel> getNotConnectedChannels() { 101 return nsccchannels; 102 } 103 103 104 private void tarjan(Channel v) {105 //log.trace("tarjan für channel aufgerufen mit id: " + v.getNewid());106 v.setIndex(index);107 v.setLowlink(index);108 index++;109 stack.add(0, v);110 //log.trace("channel "+v.getNewid() + " hat nachbarn: " + v.getLeadsTo().size());111 for (int i = 0; i < v.getLeadsTo().size(); i++) {112 //log.trace("schleifendurchlauf: " + i);113 Channel n = v.getLeadsTo().get(i).getToChannel();114 if (n.getIndex() == -1) {115 //log.trace("n hat index =-1");116 tarjan(n);117 v.setLowlink(Math.min(v.getLowlink(), n.getLowlink()));118 }119 else if (stack.contains(n)) {120 //log.trace("setze lowlink von n auf: " + v.getLowlink());121 v.setLowlink(Math.min(v.getLowlink(), n.getLowlink()));122 }123 }124 if (v.getLowlink() == v.getIndex()) {125 Channel n;126 ArrayList<Channel> component = new ArrayList<Channel>();127 do {128 n = stack.remove(0);129 component.add(n);130 } while (n != v);131 SCC.add(component);132 calculatedNodes += component.size();133 }134 }104 private void tarjan(Channel v) { 105 //log.trace("tarjan für channel aufgerufen mit id: " + v.getNewid()); 106 v.setIndex(index); 107 v.setLowlink(index); 108 index++; 109 stack.add(0, v); 110 //log.trace("channel "+v.getNewid() + " hat nachbarn: " + v.getLeadsTo().size()); 111 for (int i = 0; i < v.getLeadsTo().size(); i++) { 112 //log.trace("schleifendurchlauf: " + i); 113 Channel n = v.getLeadsTo().get(i).getToChannel(); 114 if (n.getIndex() == -1) { 115 //log.trace("n hat index =-1"); 116 tarjan(n); 117 v.setLowlink(Math.min(v.getLowlink(), n.getLowlink())); 118 } 119 else if (stack.contains(n)) { 120 //log.trace("setze lowlink von n auf: " + v.getLowlink()); 121 v.setLowlink(Math.min(v.getLowlink(), n.getLowlink())); 122 } 123 } 124 if (v.getLowlink() == v.getIndex()) { 125 Channel n; 126 ArrayList<Channel> component = new ArrayList<Channel>(); 127 do { 128 n = stack.remove(0); 129 component.add(n); 130 } while (n != v); 131 SCC.add(component); 132 calculatedNodes += component.size(); 133 } 134 } 135 135 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/converting/ChannelDigraphBuilder.java
r25501 r30725 13 13 public class ChannelDigraphBuilder { 14 14 15 private final ChannelDiGraph digraph;16 private final OSMGraph osmgraph;17 private final OSMWay[] osmways;18 private Channel newChannel = new Channel();19 private final NodesConnectionProducer ncp;20 // Variable wird für die IDs der neu erstellten Ways benötigt, die21 // Hinrichtung bekommt den des ursprungs-Way, die Rückrichtung22 // eine fiktive negative (OSM-XML-Standard für neue, noch nicht in der DB23 // gespeicherte Entities)24 private int newid = 1;25 private TurnRestrictionChecker trchecker;26 Channel backChannel;15 private final ChannelDiGraph digraph; 16 private final OSMGraph osmgraph; 17 private final OSMWay[] osmways; 18 private Channel newChannel = new Channel(); 19 private final NodesConnectionProducer ncp; 20 // Variable wird für die IDs der neu erstellten Ways benötigt, die 21 // Hinrichtung bekommt den des ursprungs-Way, die Rückrichtung 22 // eine fiktive negative (OSM-XML-Standard für neue, noch nicht in der DB 23 // gespeicherte Entities) 24 private int newid = 1; 25 private TurnRestrictionChecker trchecker; 26 Channel backChannel; 27 27 28 public ChannelDigraphBuilder(OSMGraph osmgraph) {29 //Nodesbeziehungen erstellen30 ncp = new NodesConnectionProducer(osmgraph);31 ncp.produceNodesConnections();32 digraph = new ChannelDiGraph();33 this.osmways = osmgraph.getWays();34 digraph.setBbbottom(osmgraph.getBbbottom());35 digraph.setBbleft(osmgraph.getBbleft());36 digraph.setBbright(osmgraph.getBbright());37 digraph.setBbtop(osmgraph.getBbtop());38 this.osmgraph = osmgraph;39 }28 public ChannelDigraphBuilder(OSMGraph osmgraph) { 29 //Nodesbeziehungen erstellen 30 ncp = new NodesConnectionProducer(osmgraph); 31 ncp.produceNodesConnections(); 32 digraph = new ChannelDiGraph(); 33 this.osmways = osmgraph.getWays(); 34 digraph.setBbbottom(osmgraph.getBbbottom()); 35 digraph.setBbleft(osmgraph.getBbleft()); 36 digraph.setBbright(osmgraph.getBbright()); 37 digraph.setBbtop(osmgraph.getBbtop()); 38 this.osmgraph = osmgraph; 39 } 40 40 41 private void setNewWayID(Channel channel) {42 channel.setNewid(newid);43 newid++;44 }41 private void setNewWayID(Channel channel) { 42 channel.setNewid(newid); 43 newid++; 44 } 45 45 46 /**47 * Hilfemethode zur Erstellung eines Channels48 * @param fromNode fromNode des zu erstellenden Channels49 * @param toNode toNode des zu erstellnenden Channels50 * @param way ein zu dem Channel gehörender Way51 * @return52 */53 private Channel createChannel(OSMNode fromNode, OSMNode toNode, OSMWay way) {54 newChannel = new Channel();55 newChannel.setFromNode(fromNode);56 newChannel.setToNode(toNode);57 setNewWayID(newChannel);58 digraph.addChannel(newChannel);59 fromNode.addOutgoingChannel(newChannel);60 newChannel.addWay(way);61 return newChannel;62 }46 /** 47 * Hilfemethode zur Erstellung eines Channels 48 * @param fromNode fromNode des zu erstellenden Channels 49 * @param toNode toNode des zu erstellnenden Channels 50 * @param way ein zu dem Channel gehörender Way 51 * @return 52 */ 53 private Channel createChannel(OSMNode fromNode, OSMNode toNode, OSMWay way) { 54 newChannel = new Channel(); 55 newChannel.setFromNode(fromNode); 56 newChannel.setToNode(toNode); 57 setNewWayID(newChannel); 58 digraph.addChannel(newChannel); 59 fromNode.addOutgoingChannel(newChannel); 60 newChannel.addWay(way); 61 return newChannel; 62 } 63 63 64 private void createBackChannel(OSMNode fromNode, OSMNode toNode, OSMWay way, Channel channel) {65 backChannel = new Channel();66 backChannel = createChannel(fromNode, toNode, way);67 backChannel.setBackChannelID(channel.getNewid());68 channel.setBackChannelID(backChannel.getNewid());69 }64 private void createBackChannel(OSMNode fromNode, OSMNode toNode, OSMWay way, Channel channel) { 65 backChannel = new Channel(); 66 backChannel = createChannel(fromNode, toNode, way); 67 backChannel.setBackChannelID(channel.getNewid()); 68 channel.setBackChannelID(backChannel.getNewid()); 69 } 70 70 71 /**72 * erzeugt den Digraphen73 */74 private void buildChannels(OSMWay way, boolean oneway) {75 Channel tempChannel = new Channel();71 /** 72 * erzeugt den Digraphen 73 */ 74 private void buildChannels(OSMWay way, boolean oneway) { 75 Channel tempChannel = new Channel(); 76 76 77 OSMNode lastUsedNode = way.getFromNode();78 OSMNode[] nodes = way.getNodes();79 /*80 * log.debug("Way mit ID " + way.getId() + " , startnode: " +81 * way.getFromNode().getId() + " , EndNode: " + way.getToNode().getId()82 * + " wird bearbeitet.");83 */84 // alle Knoten eines ways durchgehen85 for (int i = 1; i < nodes.length; i++) {86 // nur wenn der aktuelle Knoten mehr als einen Vorgänger/Nachfolger87 // hat, wird in die if-Abfrage gesprungen und ein neuer Channel mit88 //mit dem aktuell betrachtetem Node als Endnode erzeugt89 if (nodes[i].getPredNodeList().size() > 1 || nodes[i].getSuccNodeList().size() > 1) {90 tempChannel = createChannel(lastUsedNode, nodes[i], way);91 // bei Nichteinbahnstraße wird Channel in die andere Richtung92 // erzeugt93 if (oneway == false) {94 createBackChannel(nodes[i], lastUsedNode, way, tempChannel);95 }96 lastUsedNode = nodes[i];97 }98 // wenn der betrachtete Knoten keine Nachfolger hat, ist ein99 // Straßenende erreicht. Auch in diesem Fall muß ein Channel erzeugt werden100 else if (nodes[i].getSuccNodeList().size() == 0) {101 tempChannel = createChannel(lastUsedNode, nodes[i], way);102 // Rückrichtung wird nur erzeugt, wenn der OSM-Way keine Einbahnstraße ist103 if (oneway == false) {104 createBackChannel(nodes[i], lastUsedNode, way, tempChannel);105 }106 }107 // eine Straße besteht aus 2 Ways, obwohl eigentlich eine reicht108 // tritt z.b. bei einer brücke auf, brücke wird neuer channel109 //TODO: kann an dieser stelle das erzeugen von pseudo-channels verhindert werden?110 // Idee: speichern eines flags, um diese erzeugten Channels zu markieren. aus diesen informationen111 // später den CHannel löschen!!!112 else if (i == nodes.length - 1113 && nodes[i].getSuccNodeList().size() == 1) {114 // damit ist ein Channel gefunden, und wird mit Werten gefüllt115 tempChannel = createChannel(lastUsedNode, nodes[i], way);116 // bei Nichteinbahnstraße wird Channel in die andere Richtung117 // erzeugt118 if (oneway == false) {119 createBackChannel(nodes[i], lastUsedNode, way, tempChannel);120 }121 lastUsedNode = nodes[i];77 OSMNode lastUsedNode = way.getFromNode(); 78 OSMNode[] nodes = way.getNodes(); 79 /* 80 * log.debug("Way mit ID " + way.getId() + " , startnode: " + 81 * way.getFromNode().getId() + " , EndNode: " + way.getToNode().getId() 82 * + " wird bearbeitet."); 83 */ 84 // alle Knoten eines ways durchgehen 85 for (int i = 1; i < nodes.length; i++) { 86 // nur wenn der aktuelle Knoten mehr als einen Vorgänger/Nachfolger 87 // hat, wird in die if-Abfrage gesprungen und ein neuer Channel mit 88 //mit dem aktuell betrachtetem Node als Endnode erzeugt 89 if (nodes[i].getPredNodeList().size() > 1 || nodes[i].getSuccNodeList().size() > 1) { 90 tempChannel = createChannel(lastUsedNode, nodes[i], way); 91 // bei Nichteinbahnstraße wird Channel in die andere Richtung 92 // erzeugt 93 if (oneway == false) { 94 createBackChannel(nodes[i], lastUsedNode, way, tempChannel); 95 } 96 lastUsedNode = nodes[i]; 97 } 98 // wenn der betrachtete Knoten keine Nachfolger hat, ist ein 99 // Straßenende erreicht. Auch in diesem Fall muß ein Channel erzeugt werden 100 else if (nodes[i].getSuccNodeList().size() == 0) { 101 tempChannel = createChannel(lastUsedNode, nodes[i], way); 102 // Rückrichtung wird nur erzeugt, wenn der OSM-Way keine Einbahnstraße ist 103 if (oneway == false) { 104 createBackChannel(nodes[i], lastUsedNode, way, tempChannel); 105 } 106 } 107 // eine Straße besteht aus 2 Ways, obwohl eigentlich eine reicht 108 // tritt z.b. bei einer brücke auf, brücke wird neuer channel 109 //TODO: kann an dieser stelle das erzeugen von pseudo-channels verhindert werden? 110 // Idee: speichern eines flags, um diese erzeugten Channels zu markieren. aus diesen informationen 111 // später den CHannel löschen!!! 112 else if (i == nodes.length - 1 113 && nodes[i].getSuccNodeList().size() == 1) { 114 // damit ist ein Channel gefunden, und wird mit Werten gefüllt 115 tempChannel = createChannel(lastUsedNode, nodes[i], way); 116 // bei Nichteinbahnstraße wird Channel in die andere Richtung 117 // erzeugt 118 if (oneway == false) { 119 createBackChannel(nodes[i], lastUsedNode, way, tempChannel); 120 } 121 lastUsedNode = nodes[i]; 122 122 123 }123 } 124 124 125 }126 }125 } 126 } 127 127 128 /**129 * baut den ChannelDigraph130 */131 public void buildChannelDigraph() {132 // alle Wege eines OSMGraphen durchgehen133 for (int i = 0; i < osmways.length; i++) {134 buildChannels(osmways[i], osmways[i].isOneWay());135 }136 trchecker = new TurnRestrictionChecker(osmgraph, digraph);137 trchecker.createLeadsTo();138 PseudoChannelRemover pcr = new PseudoChannelRemover(digraph); //überflüssige Channels entfernen139 pcr.removePseudoChannels();140 }128 /** 129 * baut den ChannelDigraph 130 */ 131 public void buildChannelDigraph() { 132 // alle Wege eines OSMGraphen durchgehen 133 for (int i = 0; i < osmways.length; i++) { 134 buildChannels(osmways[i], osmways[i].isOneWay()); 135 } 136 trchecker = new TurnRestrictionChecker(osmgraph, digraph); 137 trchecker.createLeadsTo(); 138 PseudoChannelRemover pcr = new PseudoChannelRemover(digraph); //überflüssige Channels entfernen 139 pcr.removePseudoChannels(); 140 } 141 141 142 public ChannelDiGraph getDigraph() {143 return digraph;144 }142 public ChannelDiGraph getDigraph() { 143 return digraph; 144 } 145 145 146 public void setNewid(int newid) {147 this.newid = newid;148 }146 public void setNewid(int newid) { 147 this.newid = newid; 148 } 149 149 150 public int getNewid() {151 return newid;152 }150 public int getNewid() { 151 return newid; 152 } 153 153 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/converting/NodesConnectionProducer.java
r25501 r30725 11 11 */ 12 12 public class NodesConnectionProducer { 13 14 private OSMGraph osmgraph;15 private OSMWay[] osmways;13 14 private OSMGraph osmgraph; 15 private OSMWay[] osmways; 16 16 17 public NodesConnectionProducer(OSMGraph osmgraph) {18 this.osmgraph = osmgraph;19 osmways = this.osmgraph.getWays();20 }21 22 public void produceNodesConnections() {23 OSMNode[] waynodes;24 for (int i = 0; i < osmways.length; i++) {25 waynodes = osmways[i].getNodes();26 for (int j = 0; j < waynodes.length - 1; j++) {27 waynodes[j].addSuccNode(waynodes[j+1]);28 waynodes[j+1].addPredNode(waynodes[j]);29 }30 }31 }17 public NodesConnectionProducer(OSMGraph osmgraph) { 18 this.osmgraph = osmgraph; 19 osmways = this.osmgraph.getWays(); 20 } 21 22 public void produceNodesConnections() { 23 OSMNode[] waynodes; 24 for (int i = 0; i < osmways.length; i++) { 25 waynodes = osmways[i].getNodes(); 26 for (int j = 0; j < waynodes.length - 1; j++) { 27 waynodes[j].addSuccNode(waynodes[j+1]); 28 waynodes[j+1].addPredNode(waynodes[j]); 29 } 30 } 31 } 32 32 33 33 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/converting/PseudoChannelRemover.java
r29854 r30725 12 12 public class PseudoChannelRemover { 13 13 14 private final ChannelDiGraph digraph;15 //private final ArrayList<Channel> pseudochannels = new ArrayList<Channel>();16 private Channel succChannel;17 private Channel tempToChannel;18 private LeadsTo tempLeadsTo;14 private final ChannelDiGraph digraph; 15 //private final ArrayList<Channel> pseudochannels = new ArrayList<Channel>(); 16 private Channel succChannel; 17 private Channel tempToChannel; 18 private LeadsTo tempLeadsTo; 19 19 20 public PseudoChannelRemover(ChannelDiGraph digraph) {21 this.digraph = digraph;22 }20 public PseudoChannelRemover(ChannelDiGraph digraph) { 21 this.digraph = digraph; 22 } 23 23 24 private void mergeChannel(Channel tempchannel) {25 succChannel = tempchannel.getLeadsTo().get(0).getToChannel();26 tempchannel.setToNode(succChannel.getToNode());27 //log.trace("---Folgender Channel ist überflüssig: " + succChannel.getNewid() + "---");28 //log.trace("... und wird durch diesen ersetzt: " + tempchannel.getNewid());29 //VorgängerChannel der nachfolgenden Channels des zu löschenden, überflüssigen Channels neu setzen30 for (int i = 0; i < succChannel.getLeadsTo().size(); i++) {31 for (int j = 0; j < succChannel.getLeadsTo().get(i).getToChannel().getPredChannels().size(); j++) {32 if (succChannel.getLeadsTo().get(i).getToChannel().getPredChannels().get(j).getNewid() == succChannel.getNewid()) {33 succChannel.getLeadsTo().get(i).getToChannel().getPredChannels().remove(j);34 succChannel.getLeadsTo().get(i).getToChannel().addPredChannel(tempchannel);35 }36 }37 }24 private void mergeChannel(Channel tempchannel) { 25 succChannel = tempchannel.getLeadsTo().get(0).getToChannel(); 26 tempchannel.setToNode(succChannel.getToNode()); 27 //log.trace("---Folgender Channel ist überflüssig: " + succChannel.getNewid() + "---"); 28 //log.trace("... und wird durch diesen ersetzt: " + tempchannel.getNewid()); 29 //VorgängerChannel der nachfolgenden Channels des zu löschenden, überflüssigen Channels neu setzen 30 for (int i = 0; i < succChannel.getLeadsTo().size(); i++) { 31 for (int j = 0; j < succChannel.getLeadsTo().get(i).getToChannel().getPredChannels().size(); j++) { 32 if (succChannel.getLeadsTo().get(i).getToChannel().getPredChannels().get(j).getNewid() == succChannel.getNewid()) { 33 succChannel.getLeadsTo().get(i).getToChannel().getPredChannels().remove(j); 34 succChannel.getLeadsTo().get(i).getToChannel().addPredChannel(tempchannel); 35 } 36 } 37 } 38 38 39 //LeadsTo des zu ersetzenden Channels für den neuen Channel neu erzeugen40 tempchannel.removeLeadsTo();41 for (int i = 0; i < succChannel.getLeadsTo().size(); i++) {42 tempToChannel = succChannel.getLeadsTo().get(i).getToChannel();43 //log.trace("tempToChannel: " + tempToChannel.toString());44 tempLeadsTo = new LeadsTo(tempchannel, tempToChannel);45 //log.trace(i + ". Durchlauf: Füge ledasTo hinzu: " + tempLeadsTo.toString());46 digraph.addLeadsTo(tempLeadsTo);47 }39 //LeadsTo des zu ersetzenden Channels für den neuen Channel neu erzeugen 40 tempchannel.removeLeadsTo(); 41 for (int i = 0; i < succChannel.getLeadsTo().size(); i++) { 42 tempToChannel = succChannel.getLeadsTo().get(i).getToChannel(); 43 //log.trace("tempToChannel: " + tempToChannel.toString()); 44 tempLeadsTo = new LeadsTo(tempchannel, tempToChannel); 45 //log.trace(i + ". Durchlauf: Füge ledasTo hinzu: " + tempLeadsTo.toString()); 46 digraph.addLeadsTo(tempLeadsTo); 47 } 48 48 49 //TODO: quick'n'dirty50 ArrayList< LeadsTo> tls = succChannel.getLeadsTo();51 for (int i = 0; i < tls.size(); i++) {52 digraph.removeLeadsTo(tls.get(i));53 }54 digraph.removeChannel(succChannel);55 //pseudochannels.add(tempchannel.getSuccChannels().get(0));56 }49 //TODO: quick'n'dirty 50 ArrayList< LeadsTo> tls = succChannel.getLeadsTo(); 51 for (int i = 0; i < tls.size(); i++) { 52 digraph.removeLeadsTo(tls.get(i)); 53 } 54 digraph.removeChannel(succChannel); 55 //pseudochannels.add(tempchannel.getSuccChannels().get(0)); 56 } 57 57 58 public void removePseudoChannels() {59 Channel tempChannel;60 for (int i = 0; i < digraph.getChannels().size(); i++) {61 tempChannel = digraph.getChannelAtPosition(i);62 while (digraph.isInBBox(tempChannel.getToNode())63 && (tempChannel.getLeadsTo().size() == 1)64 && (tempChannel.getLeadsTo().get(0).getToChannel().getPredChannels().size() <= 1)65 && (tempChannel.getBackChannelID() != tempChannel.getLeadsTo().get(0).getToChannel().getNewid())) {66 // dies if-abfrage verhindert eine endlosschleife, wenn der67 // channel ein kreisverkehr istjava68 if (tempChannel.getLeadsTo().get(0).getToChannel().equals(tempChannel)) {69 break;70 } else {71 mergeChannel(tempChannel);72 }73 }58 public void removePseudoChannels() { 59 Channel tempChannel; 60 for (int i = 0; i < digraph.getChannels().size(); i++) { 61 tempChannel = digraph.getChannelAtPosition(i); 62 while (digraph.isInBBox(tempChannel.getToNode()) 63 && (tempChannel.getLeadsTo().size() == 1) 64 && (tempChannel.getLeadsTo().get(0).getToChannel().getPredChannels().size() <= 1) 65 && (tempChannel.getBackChannelID() != tempChannel.getLeadsTo().get(0).getToChannel().getNewid())) { 66 // dies if-abfrage verhindert eine endlosschleife, wenn der 67 // channel ein kreisverkehr istjava 68 if (tempChannel.getLeadsTo().get(0).getToChannel().equals(tempChannel)) { 69 break; 70 } else { 71 mergeChannel(tempChannel); 72 } 73 } 74 74 75 }76 }75 } 76 } 77 77 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/converting/TurnRestrictionChecker.java
r29854 r30725 18 18 public class TurnRestrictionChecker { 19 19 20 private final ArrayList<OSMRelation> turnrestrictionsrelations = new ArrayList<OSMRelation>();21 private final ChannelDiGraph channelDigraph;22 private int relationpointer;23 private LeadsTo tempLeadsTo;20 private final ArrayList<OSMRelation> turnrestrictionsrelations = new ArrayList<OSMRelation>(); 21 private final ChannelDiGraph channelDigraph; 22 private int relationpointer; 23 private LeadsTo tempLeadsTo; 24 24 25 public TurnRestrictionChecker(OSMGraph graph, ChannelDiGraph channelDigraph) {26 // von den Relationen des Graphen nur die Abbiegevorschriften kopieren27 for (int i = 0; i < graph.getRelations().length; i++) {28 if (graph.getRelations()[i].hasKey("type")) {29 if (graph.getRelations()[i].getValue("type").equals(30 "restriction")) {31 turnrestrictionsrelations.add(graph.getRelations()[i]);32 }33 }34 }35 this.channelDigraph = channelDigraph;36 }25 public TurnRestrictionChecker(OSMGraph graph, ChannelDiGraph channelDigraph) { 26 // von den Relationen des Graphen nur die Abbiegevorschriften kopieren 27 for (int i = 0; i < graph.getRelations().length; i++) { 28 if (graph.getRelations()[i].hasKey("type")) { 29 if (graph.getRelations()[i].getValue("type").equals( 30 "restriction")) { 31 turnrestrictionsrelations.add(graph.getRelations()[i]); 32 } 33 } 34 } 35 this.channelDigraph = channelDigraph; 36 } 37 37 38 private boolean checkForRelations(Channel channel) {39 for (int k = 0; k < turnrestrictionsrelations.size(); k++) {40 //log.trace("betrachte relation in liste an position:" + k);41 for (int i = 0; i < channel.getWays().size(); i++) {42 if (turnrestrictionsrelations.get(k).getMember("from").getId() == channel43 .getWays().get(i).getId()44 && turnrestrictionsrelations.get(k).getMember("via")45 .getId() == channel.getToNode().getId()) {46 relationpointer = k;47 return true;48 }49 }50 }51 return false;52 }38 private boolean checkForRelations(Channel channel) { 39 for (int k = 0; k < turnrestrictionsrelations.size(); k++) { 40 //log.trace("betrachte relation in liste an position:" + k); 41 for (int i = 0; i < channel.getWays().size(); i++) { 42 if (turnrestrictionsrelations.get(k).getMember("from").getId() == channel 43 .getWays().get(i).getId() 44 && turnrestrictionsrelations.get(k).getMember("via") 45 .getId() == channel.getToNode().getId()) { 46 relationpointer = k; 47 return true; 48 } 49 } 50 } 51 return false; 52 } 53 53 54 private void produceLeadsToFromRelation(Channel fromChannel,55 Channel toChannel) {56 if (toChannel.getWays().contains(57 turnrestrictionsrelations.get(relationpointer).getMember("to"))) {58 if (turnrestrictionsrelations.get(relationpointer).getValue(59 "restriction").startsWith("only")) {54 private void produceLeadsToFromRelation(Channel fromChannel, 55 Channel toChannel) { 56 if (toChannel.getWays().contains( 57 turnrestrictionsrelations.get(relationpointer).getMember("to"))) { 58 if (turnrestrictionsrelations.get(relationpointer).getValue( 59 "restriction").startsWith("only")) { 60 60 61 tempLeadsTo = new LeadsTo(fromChannel, toChannel);62 channelDigraph.addLeadsTo(tempLeadsTo);63 toChannel.addPredChannel(fromChannel);64 }65 /*66 * der no_* Fall: wie oben, nur das hier nichts geschieht67 */68 else if (turnrestrictionsrelations.get(relationpointer).getValue(69 "restriction").startsWith("no")) {70 for (int i = 0; i < fromChannel.getToNode()71 .getOutgoingChannels().size(); i++) {72 if (fromChannel.getToNode().getOutgoingChannels().get(i) != toChannel) {73 tempLeadsTo = new LeadsTo(fromChannel, fromChannel74 .getToNode().getOutgoingChannels().get(i));75 channelDigraph.addLeadsTo(tempLeadsTo);76 fromChannel.getToNode().getOutgoingChannels().get(i)77 .addPredChannel(fromChannel);78 }79 }80 }81 }61 tempLeadsTo = new LeadsTo(fromChannel, toChannel); 62 channelDigraph.addLeadsTo(tempLeadsTo); 63 toChannel.addPredChannel(fromChannel); 64 } 65 /* 66 * der no_* Fall: wie oben, nur das hier nichts geschieht 67 */ 68 else if (turnrestrictionsrelations.get(relationpointer).getValue( 69 "restriction").startsWith("no")) { 70 for (int i = 0; i < fromChannel.getToNode() 71 .getOutgoingChannels().size(); i++) { 72 if (fromChannel.getToNode().getOutgoingChannels().get(i) != toChannel) { 73 tempLeadsTo = new LeadsTo(fromChannel, fromChannel 74 .getToNode().getOutgoingChannels().get(i)); 75 channelDigraph.addLeadsTo(tempLeadsTo); 76 fromChannel.getToNode().getOutgoingChannels().get(i) 77 .addPredChannel(fromChannel); 78 } 79 } 80 } 81 } 82 82 83 }83 } 84 84 85 /**86 * startet die LeadsTo Erstellung87 */88 public void createLeadsTo() {89 Channel tempChannel;90 for (int i = 0; i < channelDigraph.getChannels().size(); i++) {91 tempChannel = channelDigraph.getChannelAtPosition(i);92 boolean isInRelation = checkForRelations(tempChannel);93 for (int j = 0; j < tempChannel.getToNode().getOutgoingChannels()94 .size(); j++) {95 if (isInRelation) {96 produceLeadsToFromRelation(tempChannel, tempChannel97 .getToNode().getOutgoingChannels().get(j));98 // es wird nur dann ein leadsTo erzeugt, wenn der vom99 // Endknoten des Channels100 // ausgehende Channel NICHT der Channel in Rückrichtung ist101 // Ausnahme: es gibt nur diesen einen Channel (Wegende eines102 // Ways, der an keine weitere103 // Straße trifft104 } else if (tempChannel.getBackChannelID() != tempChannel105 .getToNode().getOutgoingChannels().get(j).getNewid()106 || tempChannel.getToNode().getOutgoingChannels().size() == 1) {107 tempLeadsTo = new LeadsTo(tempChannel, tempChannel108 .getToNode().getOutgoingChannels().get(j));109 channelDigraph.addLeadsTo(tempLeadsTo);110 tempChannel.getToNode().getOutgoingChannels().get(j)111 .addPredChannel(tempChannel);112 }113 }114 }115 }85 /** 86 * startet die LeadsTo Erstellung 87 */ 88 public void createLeadsTo() { 89 Channel tempChannel; 90 for (int i = 0; i < channelDigraph.getChannels().size(); i++) { 91 tempChannel = channelDigraph.getChannelAtPosition(i); 92 boolean isInRelation = checkForRelations(tempChannel); 93 for (int j = 0; j < tempChannel.getToNode().getOutgoingChannels() 94 .size(); j++) { 95 if (isInRelation) { 96 produceLeadsToFromRelation(tempChannel, tempChannel 97 .getToNode().getOutgoingChannels().get(j)); 98 // es wird nur dann ein leadsTo erzeugt, wenn der vom 99 // Endknoten des Channels 100 // ausgehende Channel NICHT der Channel in Rückrichtung ist 101 // Ausnahme: es gibt nur diesen einen Channel (Wegende eines 102 // Ways, der an keine weitere 103 // Straße trifft 104 } else if (tempChannel.getBackChannelID() != tempChannel 105 .getToNode().getOutgoingChannels().get(j).getNewid() 106 || tempChannel.getToNode().getOutgoingChannels().size() == 1) { 107 tempLeadsTo = new LeadsTo(tempChannel, tempChannel 108 .getToNode().getOutgoingChannels().get(j)); 109 channelDigraph.addLeadsTo(tempLeadsTo); 110 tempChannel.getToNode().getOutgoingChannels().get(j) 111 .addPredChannel(tempChannel); 112 } 113 } 114 } 115 } 116 116 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/datastructure/BasicChannel.java
r25501 r30725 9 9 public class BasicChannel { 10 10 11 private OSMNode toNode;12 private OSMNode fromNode;13 private ArrayList<LeadsTo> leadsTo = new ArrayList<LeadsTo>();14 private final ArrayList<OSMWay> ways = new ArrayList<OSMWay>();15 private int newid;16 //gibt es nur, wenn ein Channelobjekt aus einer Nichteinbahnstraße erzeugt wurde (backchannelID ist dann die ID des anderen Channels)17 private int backChannelID = -100;18 private final ArrayList<Channel> predChannels = new ArrayList<Channel>();19 20 //werden für den Tarjan-Algorithmus gebraucht21 private int lowlink = -1;22 private int index = -1;23 24 /**25 * fügt einen Vorgängerchannel hinzu26 * @param channel der voherige Channel27 */28 public void addPredChannel(Channel channel) {29 predChannels.add(channel);30 }31 32 /**33 * setzt den ToNode34 * @param toNode35 */36 public void setToNode(OSMNode toNode) {37 this.toNode = toNode;38 }39 40 /**41 * gbit den ToNode zurück42 */43 public OSMNode getToNode() {44 return toNode;45 }46 47 /**48 * setzt den FromNode49 */50 public void setFromNode(OSMNode fromNode) {51 this.fromNode = fromNode;52 }53 54 /**55 * gibt den FromNode zurück56 */57 public OSMNode getFromNode() {58 return fromNode;59 }60 61 /**62 * fügt eine LeadsTo-Beziehung hinzu63 * @param leadsTo64 */65 public void addLeadsTo(LeadsTo leadsTo) {66 this.leadsTo.add(leadsTo);67 }68 69 /**70 * setzt alle leadsTo-Beziehungen (löscht alle voherigen)71 */72 public void setLeadsTo(ArrayList<LeadsTo> leadsTo) {73 this.leadsTo = leadsTo;74 }75 76 /**77 * löscht alle LeadsTo des Channels78 */79 public void removeLeadsTo() {80 this.leadsTo.clear();81 }82 83 /**84 * gibt alle leadsTo zurück85 * @return86 */87 public ArrayList<LeadsTo> getLeadsTo() {88 return leadsTo;89 }90 91 /**92 * fügt einen Way hinzu, aus dem der Channel enstanden ist93 * es gibt immer mind. einen Way, es können aber auch mehr sein94 * @param way95 */96 public void addWay(OSMWay way) {97 this.ways.add(way);98 }99 100 /**101 * gibt alle Ways zurück102 * @return103 */104 public ArrayList<OSMWay> getWays() {105 return ways;106 }107 108 /**109 * gibt nur den ersten Way der ArrayList zurück! wird bei der110 * XML-datei-Erzeugung benutzt, um den Way, der aus dem Channel entsteht,111 * mit Werten zu füllen dabei gehen Informationen verloren, da ein Channel112 * aus mehr als einem Way bestehen kann113 *114 * @return115 */116 public OSMWay getWay() {117 return ways.get(0);118 }119 120 /**121 * setzt die ID des Channels. es kann nicht die ID des Ways übernommen werden, da aus einem Way oftmals mehrere Channels entstehen (z.B. bei jeder Nichteinbahnstraße mind. 2)122 */123 public void setNewid(int newid) {124 this.newid = newid;125 }126 127 /**128 * gbit die NewID zurück129 */130 public int getNewid() {131 return newid;132 }133 134 /**135 * gibt alle VorgängerChannels zurück136 * @return137 */138 public ArrayList<Channel> getPredChannels() {139 return predChannels;140 }141 142 /**143 * ToString Methode144 */145 @Override146 public String toString() {147 String lt ="";148 for (int i = 0; i < leadsTo.size(); i++) {149 lt += leadsTo.get(i).getToChannel().getNewid() + ", ";150 }151 String predch = "";152 for (int i = 0; i < predChannels.size(); i++) {153 predch += predChannels.get(i).getNewid() + ", ";154 }155 return "[ChannelID: "+ newid + ":AnzahlPredCH: " + predChannels.size() + ":PredCh: " + predch + ":AnzahlSuccCH: " + leadsTo.size() +":LeadsTo: " + lt+ ":backCHID: " + backChannelID + "]";156 }157 158 public void setBackChannelID(int backChannelID) {159 this.backChannelID = backChannelID;160 }161 162 public int getBackChannelID() {163 return backChannelID;164 }165 166 /**167 * wandelt den Channel in einen OSMWay um168 * dabie werden die Werte des 1. Way, der im Channel ist, übernommen, wenn ein169 * 1. Channel existiert170 */171 public OSMWay ToOSMWay() {172 OSMWay way = new OSMWay();173 way.addNode(this.fromNode);174 way.addNode(this.toNode);175 way.setId((long)this.newid);176 if (this.getWay() != null) {177 way.setHashmap(this.getWay().getHashmap());178 }179 return way;180 }181 182 public void ereasePredChannel(Channel rchannel) {183 predChannels.remove(rchannel);184 }185 186 public int getLowlink() {187 return lowlink;188 }189 190 public void setLowlink(int lowlink) {191 this.lowlink = lowlink;192 }193 194 public int getIndex() {195 return index;196 }197 198 public void setIndex(int index) {199 this.index = index;200 }201 202 public void removeLeadsTo(LeadsTo leadsTo) {203 this.leadsTo.remove(leadsTo);204 }11 private OSMNode toNode; 12 private OSMNode fromNode; 13 private ArrayList<LeadsTo> leadsTo = new ArrayList<LeadsTo>(); 14 private final ArrayList<OSMWay> ways = new ArrayList<OSMWay>(); 15 private int newid; 16 //gibt es nur, wenn ein Channelobjekt aus einer Nichteinbahnstraße erzeugt wurde (backchannelID ist dann die ID des anderen Channels) 17 private int backChannelID = -100; 18 private final ArrayList<Channel> predChannels = new ArrayList<Channel>(); 19 20 //werden für den Tarjan-Algorithmus gebraucht 21 private int lowlink = -1; 22 private int index = -1; 23 24 /** 25 * fügt einen Vorgängerchannel hinzu 26 * @param channel der voherige Channel 27 */ 28 public void addPredChannel(Channel channel) { 29 predChannels.add(channel); 30 } 31 32 /** 33 * setzt den ToNode 34 * @param toNode 35 */ 36 public void setToNode(OSMNode toNode) { 37 this.toNode = toNode; 38 } 39 40 /** 41 * gbit den ToNode zurück 42 */ 43 public OSMNode getToNode() { 44 return toNode; 45 } 46 47 /** 48 * setzt den FromNode 49 */ 50 public void setFromNode(OSMNode fromNode) { 51 this.fromNode = fromNode; 52 } 53 54 /** 55 * gibt den FromNode zurück 56 */ 57 public OSMNode getFromNode() { 58 return fromNode; 59 } 60 61 /** 62 * fügt eine LeadsTo-Beziehung hinzu 63 * @param leadsTo 64 */ 65 public void addLeadsTo(LeadsTo leadsTo) { 66 this.leadsTo.add(leadsTo); 67 } 68 69 /** 70 * setzt alle leadsTo-Beziehungen (löscht alle voherigen) 71 */ 72 public void setLeadsTo(ArrayList<LeadsTo> leadsTo) { 73 this.leadsTo = leadsTo; 74 } 75 76 /** 77 * löscht alle LeadsTo des Channels 78 */ 79 public void removeLeadsTo() { 80 this.leadsTo.clear(); 81 } 82 83 /** 84 * gibt alle leadsTo zurück 85 * @return 86 */ 87 public ArrayList<LeadsTo> getLeadsTo() { 88 return leadsTo; 89 } 90 91 /** 92 * fügt einen Way hinzu, aus dem der Channel enstanden ist 93 * es gibt immer mind. einen Way, es können aber auch mehr sein 94 * @param way 95 */ 96 public void addWay(OSMWay way) { 97 this.ways.add(way); 98 } 99 100 /** 101 * gibt alle Ways zurück 102 * @return 103 */ 104 public ArrayList<OSMWay> getWays() { 105 return ways; 106 } 107 108 /** 109 * gibt nur den ersten Way der ArrayList zurück! wird bei der 110 * XML-datei-Erzeugung benutzt, um den Way, der aus dem Channel entsteht, 111 * mit Werten zu füllen dabei gehen Informationen verloren, da ein Channel 112 * aus mehr als einem Way bestehen kann 113 * 114 * @return 115 */ 116 public OSMWay getWay() { 117 return ways.get(0); 118 } 119 120 /** 121 * setzt die ID des Channels. es kann nicht die ID des Ways übernommen werden, da aus einem Way oftmals mehrere Channels entstehen (z.B. bei jeder Nichteinbahnstraße mind. 2) 122 */ 123 public void setNewid(int newid) { 124 this.newid = newid; 125 } 126 127 /** 128 * gbit die NewID zurück 129 */ 130 public int getNewid() { 131 return newid; 132 } 133 134 /** 135 * gibt alle VorgängerChannels zurück 136 * @return 137 */ 138 public ArrayList<Channel> getPredChannels() { 139 return predChannels; 140 } 141 142 /** 143 * ToString Methode 144 */ 145 @Override 146 public String toString() { 147 String lt =""; 148 for (int i = 0; i < leadsTo.size(); i++) { 149 lt += leadsTo.get(i).getToChannel().getNewid() + ", "; 150 } 151 String predch = ""; 152 for (int i = 0; i < predChannels.size(); i++) { 153 predch += predChannels.get(i).getNewid() + ", "; 154 } 155 return "[ChannelID: "+ newid + ":AnzahlPredCH: " + predChannels.size() + ":PredCh: " + predch + ":AnzahlSuccCH: " + leadsTo.size() +":LeadsTo: " + lt+ ":backCHID: " + backChannelID + "]"; 156 } 157 158 public void setBackChannelID(int backChannelID) { 159 this.backChannelID = backChannelID; 160 } 161 162 public int getBackChannelID() { 163 return backChannelID; 164 } 165 166 /** 167 * wandelt den Channel in einen OSMWay um 168 * dabie werden die Werte des 1. Way, der im Channel ist, übernommen, wenn ein 169 * 1. Channel existiert 170 */ 171 public OSMWay ToOSMWay() { 172 OSMWay way = new OSMWay(); 173 way.addNode(this.fromNode); 174 way.addNode(this.toNode); 175 way.setId((long)this.newid); 176 if (this.getWay() != null) { 177 way.setHashmap(this.getWay().getHashmap()); 178 } 179 return way; 180 } 181 182 public void ereasePredChannel(Channel rchannel) { 183 predChannels.remove(rchannel); 184 } 185 186 public int getLowlink() { 187 return lowlink; 188 } 189 190 public void setLowlink(int lowlink) { 191 this.lowlink = lowlink; 192 } 193 194 public int getIndex() { 195 return index; 196 } 197 198 public void setIndex(int index) { 199 this.index = index; 200 } 201 202 public void removeLeadsTo(LeadsTo leadsTo) { 203 this.leadsTo.remove(leadsTo); 204 } 205 205 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/datastructure/Channel.java
r25501 r30725 12 12 public class Channel extends BasicChannel{ 13 13 14 //für den Junctioncheck15 private int indegree;16 private int outdegree;17 private boolean subgraph;18 private int visited = BacktrackingColors.WHITE;19 private final ArrayList<Channel> reachableNodes = new ArrayList<Channel>();20 private int ennr;21 private boolean isStrongConnected = true;22 private boolean isSelected = false; //wird für den eigenen Layer benötigt, um markierte Channels zu erhalten23 private boolean isPartOfJunction = false; //wird für den eigenen Layer benötigt, um Teile einer Kreuzung farbig repräsentieren zu können24 25 private final HashMap<Channel , ArrayList<Channel>> paths2 = new HashMap<Channel , ArrayList<Channel>>();26 27 28 public Channel(OSMNode fromNode, OSMNode toNode) {29 super();30 this.setFromNode(fromNode);31 this.setToNode(toNode);32 this.subgraph = false;33 this.indegree = 0;34 this.outdegree = 0;35 }36 37 public Channel(){38 super();39 //this.insidenodes = new ArrayList<OSMNode>();40 this.subgraph = false;41 this.indegree = 0;42 this.outdegree = 0;43 }44 45 /**46 * gibt die Anzahl der auf diesen Channel verweisenden leadsTo zurück47 * @return48 */49 public int getIndegree() {50 return indegree;51 }52 53 /**54 * gibt die Anzahl der aus diesem Channel gehenden leadsTo zurück55 * @return56 */57 public int getOutdegree() {58 return outdegree;59 }60 61 public void setIndegree(int i) {62 this.indegree = i;63 }64 65 public void setOutdegree(int i){66 this.outdegree = i;67 }68 69 /**70 * ist dieser Channel Teil der zu untersuchenden Kreuzung?71 */72 public boolean isSubgraph() {73 return subgraph;74 }75 76 public void setSubgraph(boolean subgraph) {77 this.subgraph = subgraph;78 }79 80 /**81 * setzt die Farbe des Channels für den TRDFS white = unbesucht grey = besucht, aber noch nicht beendet black = besucht nund abgeschlossen82 */83 public int getVisited() {84 return visited;85 }86 87 public void setVisited(int visited) {88 this.visited = visited;89 }90 91 /**92 * gibt die von diesem Channel zu erreichenden anderen CHannels zurück93 * @return94 */95 public ArrayList<Channel> getReachableNodes() {96 return reachableNodes;97 }98 99 /**100 * setzt die zu erreichenden Channels alle anderen werden gelöscht101 * @param reachableNodes102 */103 public int getEnnr() {104 return ennr;105 }106 107 /**108 * setzt die Anzahl der EingangsChannel109 * @param ennr110 */111 public void setEnnr(int ennr) {112 this.ennr = ennr;113 }114 115 /**116 * erhöht den Wert der Anzhal der EingangsledasTo um 1117 */118 public void countupIndegree() {119 indegree++;120 }121 122 /**123 * erhöht den Wert der Anzahl der AusgangsleadsTo um 1124 */125 public void countupOutdegree() {126 outdegree++;127 }128 129 /**130 * fügt einen erreichbaren Channel hinzu131 * @param node132 */133 public void addReachableNode(Channel node) {134 if (!reachableNodes.contains(node)) {135 reachableNodes.add(node);136 paths2.put(node, new ArrayList<Channel>());137 }138 }139 140 /**141 * gibt den an der Position i gespeicherten erreichbaren Channel zurück142 * @param i143 * @return144 */145 public Channel getReachableNodeAt(int i) {146 return reachableNodes.get(i);147 }148 149 /**150 * löscht alle erreichbaren Channels151 */152 public void ereaseReachableNodes() {153 reachableNodes.clear();154 }155 156 /**157 * setzt Wert der erreichbaren Eingangschannel auf 0158 */159 public void setEnnrZero() {160 ennr = 0;161 }162 163 /**164 * erhöht den Wert der Eingänge um 1165 */166 public void increaseEnnr() {167 ennr++;168 }169 170 171 /**172 * fügt einen Pfad den Pfaden zu173 * @param path174 */175 public void appendPath(Channel node, ArrayList<Channel> path) {176 for (int i = 0; i < path.size(); i++) {177 if (!paths2.get(node).contains(path.get(i))) {178 paths2.get(node).add(path.get(i));179 }180 }181 }182 183 public void appendChannelToPath(Channel node, Channel channel) {184 if (!paths2.containsKey(node)) {185 paths2.put(node, new ArrayList<Channel>());186 187 }188 if (!paths2.get(node).contains(channel)) {189 paths2.get(node).add(channel);190 191 }192 }193 194 /**195 * gibt alle Pfade zurück196 * @return197 */198 public ArrayList<ArrayList<Channel>> getPaths() {199 ArrayList<ArrayList<Channel>> t = new ArrayList<ArrayList<Channel>>();200 t.addAll(paths2.values());201 return t;202 }203 204 public ArrayList<Channel> getPathsAt(Channel node) {205 if (paths2.containsKey(node)) {206 return paths2.get(node);207 }208 else {209 //log.error("das darf nicht bei Channel: " + this.getNewid() + ", kein Node " + node.getNewid());210 return null;211 }212 213 }214 215 public boolean isStrongConnected() {216 return isStrongConnected;217 }218 219 public void setStrongConnected(boolean isStrongConnected) {220 this.isStrongConnected = isStrongConnected;221 }222 223 public boolean isSelected() {224 return isSelected;225 }226 227 public void setSelected(boolean isSelected) {228 this.isSelected = isSelected;229 }230 231 public boolean isPartOfJunction() {232 return isPartOfJunction;233 }234 235 public void setPartOfJunction(boolean isPartOfJunction) {236 this.isPartOfJunction = isPartOfJunction;237 }238 239 14 //für den Junctioncheck 15 private int indegree; 16 private int outdegree; 17 private boolean subgraph; 18 private int visited = BacktrackingColors.WHITE; 19 private final ArrayList<Channel> reachableNodes = new ArrayList<Channel>(); 20 private int ennr; 21 private boolean isStrongConnected = true; 22 private boolean isSelected = false; //wird für den eigenen Layer benötigt, um markierte Channels zu erhalten 23 private boolean isPartOfJunction = false; //wird für den eigenen Layer benötigt, um Teile einer Kreuzung farbig repräsentieren zu können 24 25 private final HashMap<Channel , ArrayList<Channel>> paths2 = new HashMap<Channel , ArrayList<Channel>>(); 26 27 28 public Channel(OSMNode fromNode, OSMNode toNode) { 29 super(); 30 this.setFromNode(fromNode); 31 this.setToNode(toNode); 32 this.subgraph = false; 33 this.indegree = 0; 34 this.outdegree = 0; 35 } 36 37 public Channel(){ 38 super(); 39 //this.insidenodes = new ArrayList<OSMNode>(); 40 this.subgraph = false; 41 this.indegree = 0; 42 this.outdegree = 0; 43 } 44 45 /** 46 * gibt die Anzahl der auf diesen Channel verweisenden leadsTo zurück 47 * @return 48 */ 49 public int getIndegree() { 50 return indegree; 51 } 52 53 /** 54 * gibt die Anzahl der aus diesem Channel gehenden leadsTo zurück 55 * @return 56 */ 57 public int getOutdegree() { 58 return outdegree; 59 } 60 61 public void setIndegree(int i) { 62 this.indegree = i; 63 } 64 65 public void setOutdegree(int i){ 66 this.outdegree = i; 67 } 68 69 /** 70 * ist dieser Channel Teil der zu untersuchenden Kreuzung? 71 */ 72 public boolean isSubgraph() { 73 return subgraph; 74 } 75 76 public void setSubgraph(boolean subgraph) { 77 this.subgraph = subgraph; 78 } 79 80 /** 81 * setzt die Farbe des Channels für den TRDFS white = unbesucht grey = besucht, aber noch nicht beendet black = besucht nund abgeschlossen 82 */ 83 public int getVisited() { 84 return visited; 85 } 86 87 public void setVisited(int visited) { 88 this.visited = visited; 89 } 90 91 /** 92 * gibt die von diesem Channel zu erreichenden anderen CHannels zurück 93 * @return 94 */ 95 public ArrayList<Channel> getReachableNodes() { 96 return reachableNodes; 97 } 98 99 /** 100 * setzt die zu erreichenden Channels alle anderen werden gelöscht 101 * @param reachableNodes 102 */ 103 public int getEnnr() { 104 return ennr; 105 } 106 107 /** 108 * setzt die Anzahl der EingangsChannel 109 * @param ennr 110 */ 111 public void setEnnr(int ennr) { 112 this.ennr = ennr; 113 } 114 115 /** 116 * erhöht den Wert der Anzhal der EingangsledasTo um 1 117 */ 118 public void countupIndegree() { 119 indegree++; 120 } 121 122 /** 123 * erhöht den Wert der Anzahl der AusgangsleadsTo um 1 124 */ 125 public void countupOutdegree() { 126 outdegree++; 127 } 128 129 /** 130 * fügt einen erreichbaren Channel hinzu 131 * @param node 132 */ 133 public void addReachableNode(Channel node) { 134 if (!reachableNodes.contains(node)) { 135 reachableNodes.add(node); 136 paths2.put(node, new ArrayList<Channel>()); 137 } 138 } 139 140 /** 141 * gibt den an der Position i gespeicherten erreichbaren Channel zurück 142 * @param i 143 * @return 144 */ 145 public Channel getReachableNodeAt(int i) { 146 return reachableNodes.get(i); 147 } 148 149 /** 150 * löscht alle erreichbaren Channels 151 */ 152 public void ereaseReachableNodes() { 153 reachableNodes.clear(); 154 } 155 156 /** 157 * setzt Wert der erreichbaren Eingangschannel auf 0 158 */ 159 public void setEnnrZero() { 160 ennr = 0; 161 } 162 163 /** 164 * erhöht den Wert der Eingänge um 1 165 */ 166 public void increaseEnnr() { 167 ennr++; 168 } 169 170 171 /** 172 * fügt einen Pfad den Pfaden zu 173 * @param path 174 */ 175 public void appendPath(Channel node, ArrayList<Channel> path) { 176 for (int i = 0; i < path.size(); i++) { 177 if (!paths2.get(node).contains(path.get(i))) { 178 paths2.get(node).add(path.get(i)); 179 } 180 } 181 } 182 183 public void appendChannelToPath(Channel node, Channel channel) { 184 if (!paths2.containsKey(node)) { 185 paths2.put(node, new ArrayList<Channel>()); 186 187 } 188 if (!paths2.get(node).contains(channel)) { 189 paths2.get(node).add(channel); 190 191 } 192 } 193 194 /** 195 * gibt alle Pfade zurück 196 * @return 197 */ 198 public ArrayList<ArrayList<Channel>> getPaths() { 199 ArrayList<ArrayList<Channel>> t = new ArrayList<ArrayList<Channel>>(); 200 t.addAll(paths2.values()); 201 return t; 202 } 203 204 public ArrayList<Channel> getPathsAt(Channel node) { 205 if (paths2.containsKey(node)) { 206 return paths2.get(node); 207 } 208 else { 209 //log.error("das darf nicht bei Channel: " + this.getNewid() + ", kein Node " + node.getNewid()); 210 return null; 211 } 212 213 } 214 215 public boolean isStrongConnected() { 216 return isStrongConnected; 217 } 218 219 public void setStrongConnected(boolean isStrongConnected) { 220 this.isStrongConnected = isStrongConnected; 221 } 222 223 public boolean isSelected() { 224 return isSelected; 225 } 226 227 public void setSelected(boolean isSelected) { 228 this.isSelected = isSelected; 229 } 230 231 public boolean isPartOfJunction() { 232 return isPartOfJunction; 233 } 234 235 public void setPartOfJunction(boolean isPartOfJunction) { 236 this.isPartOfJunction = isPartOfJunction; 237 } 238 239 240 240 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/datastructure/ChannelDiGraph.java
r25501 r30725 11 11 public class ChannelDiGraph extends Graph { 12 12 13 private ArrayList<Channel> channels = new ArrayList<Channel>();14 private final ArrayList<LeadsTo> leadsTos = new ArrayList<LeadsTo>();15 private final HashSet<Channel> selectedChannels = new HashSet<Channel>();16 private HashSet<Channel> junctioncandidate = new HashSet<Channel>();17 18 public void setChannels(ArrayList<Channel> channels) {19 this.channels = channels;20 }21 22 /*23 * gibt den Channel mit dem übergebendem OSMNode als FromNode zurück24 */25 public Channel getChannelWithFromNode(OSMNode node) {26 for (int i = 0; i < channels.size(); i++) {27 if (channels.get(i).getFromNode() == node) {28 return channels.get(i);29 }30 }31 return null;32 }33 34 /**35 * gibt alle CHannels des Digraphen zurück36 * @return Channels des Digraphen37 */38 public ArrayList<Channel> getChannels() {39 return channels;40 }41 42 /**43 * löscht den übergebenden Channel im Digraphen44 *45 * @param channel46 */47 public void removeChannel(Channel channel) {48 channels.remove(channel);49 }50 51 /**52 * fügt einen Channel des ChannelDigraphen hinzu53 *54 * @param channel55 * hinzuzufügender Channel56 */57 public void addChannel(Channel channel) {58 this.channels.add(channel);59 }60 61 /**62 * Anzahl der innerhalb des DiGraphen gespeicherten Channels63 *64 * @return Anzahl der Channels65 */66 public int numberOfChannels() {67 return channels.size();68 }69 70 /**71 * gibt Channel i an der Position i in der ArrayList zurück72 *73 * @param i74 * Position innerhalb der ArrayList75 * @return gewünschter Channel76 */77 public Channel getChannelAtPosition(int i) {78 return channels.get(i);79 }80 81 /**82 * gibt den Channel mit der gesuchten ID zurück83 * @param id ID des Channels84 * @return der gesuchte Channel, wenn nicht vorhanden null85 */86 public Channel getChannelWithID(int id) {87 for (int i = 0; i < channels.size(); i++) {88 if (channels.get(i).getNewid() == id) {89 return channels.get(i);90 }91 }92 return null;93 }94 95 /**96 * gibt alle From und To OSMNodes eines Graphen zurück (nicht die97 * ZWischenknoten)98 *99 * @return alle From und To Nodes aller Channels des Digraphen100 */101 public OSMNode[] getAllOSMNodes() {102 HashMap<Long, OSMNode> nodes = new HashMap<Long, OSMNode>();103 for (int i = 0; i < channels.size(); i++) {104 if (!nodes.containsKey(channels.get(i).getFromNode().getId())) {105 nodes.put(channels.get(i).getFromNode().getId(), channels106 .get(i).getFromNode());107 }108 if (!nodes.containsKey(channels.get(i).getToNode().getId())) {109 nodes.put(channels.get(i).getToNode().getId(), channels.get(i)110 .getToNode());111 }112 }113 OSMNode[] nodearray = new OSMNode[nodes.size()];114 return nodes.values().toArray(nodearray);115 }116 117 public ArrayList<LeadsTo> getLeadsTo() {118 return leadsTos;119 }120 121 /*122 public void setLeadsTo(ArrayList<LeadsTo> leadsTo) {123 this.leadsTos = leadsTo;124 }*/125 126 public void setForwardEdge(Channel fromChannel, Channel toChannel) {127 for (int i = 0; i < leadsTos.size(); i++) {128 if (leadsTos.get(i).getFromChannel() == fromChannel) {129 if (leadsTos.get(i).getToChannel() == toChannel)130 leadsTos.get(i).setForwardEdge(true);131 }132 }133 134 }135 136 /**137 * fügt eine leadsto-relation dem digraphen und dem entsprechendem Channel hinzu138 * @param leadsTo139 */140 public void addLeadsTo(LeadsTo leadsTo) {141 leadsTos.add(leadsTo);142 for (int i = 0; i < channels.size(); i++) {143 if (channels.get(i).getNewid() == leadsTo.getFromChannel().getNewid()) {144 channels.get(i).addLeadsTo(leadsTo);145 return;146 }147 }148 }149 150 public void removeLeadsTo(LeadsTo leadsTo) {151 leadsTos.remove(leadsTo);152 for (int i = 0; i < channels.size(); i++) {153 if (channels.get(i).equals(leadsTo.getFromChannel())) {154 channels.get(i).removeLeadsTo(leadsTo);155 return;156 }157 }158 }159 160 /**161 * gibt den Channel zurück, der paßt. Sind Channel doppelt vorhanden, wird162 * nur der erste passende zurückgegeben!163 *164 * @param fromChannel165 * @param toChannel166 * @return167 */168 public LeadsTo getLeadsTo(Channel fromChannel, Channel toChannel) {169 for (int i = 0; i < leadsTos.size(); i++) {170 if (leadsTos.get(i).getFromChannel().getNewid() == fromChannel.getNewid()) {171 //log.trace("FromChannel mit ID gefunden: " + fromChannel.getNewid());172 if (leadsTos.get(i).getToChannel().getNewid() == toChannel.getNewid()) {173 //log.trace("Leads To gefunden: " + leadsTos.get(i).toString());174 return leadsTos.get(i);175 }176 }177 }178 return null;179 }180 181 /**182 * gibt alle Channels zurück, die von diesen OSM-Knoten abgehen/hingehen183 * @param nodes184 * @return185 */186 public ArrayList<Channel> getChannelsTouchingOSMNodes (ArrayList<OSMNode> nodes) {187 ArrayList<Channel> touchingChannel = new ArrayList<Channel>();188 for (int i = 0; i < nodes.size(); i++) {189 for (int j = 0; j < channels.size(); j++) {190 if (channels.get(j).getFromNode().getId() == nodes.get(i).getId()) {191 if (!touchingChannel.contains(channels.get(j))) {192 touchingChannel.add(channels.get(j));193 }194 }195 else if (channels.get(j).getToNode().getId() == nodes.get(i).getId()) {196 if (!touchingChannel.contains(channels.get(j))) {197 touchingChannel.add(channels.get(j));198 }199 }200 }201 }202 return touchingChannel;203 }204 205 public ArrayList<Channel> getChannelsTouchingOSMNode(long id) {206 ArrayList<Channel> returnchannels = new ArrayList<Channel>();207 for (int i = 0; i < channels.size(); i++) {208 if (channels.get(i).getFromNode().getId() == id) {209 returnchannels.add(channels.get(i));210 }211 if (channels.get(i).getToNode().getId() == id) {212 returnchannels.add(channels.get(i));213 }214 }215 return returnchannels;216 }217 218 /**219 * gibt den oder die Channels twischen diesen OSM-Punkten zurück220 * @param idfrom221 * @param idto222 * @return223 */224 public ArrayList<Channel> getChannelsBetween(int idfrom, int idto) {225 ArrayList<Channel> channelsresult = new ArrayList<Channel>();226 for (int i = 0; i < channels.size(); i++) {227 if (channels.get(i).getFromNode().getId() == idfrom) {228 if (channels.get(i).getToNode().getId() == idto) {229 channelsresult.add(channels.get(i));230 }231 }232 else if (channels.get(i).getFromNode().getId() == idto) {233 if (channels.get(i).getToNode().getId() == idfrom) {234 channelsresult.add(channels.get(i));235 }236 }237 }238 return channelsresult;239 }240 241 public ArrayList<Channel> getChannelswithWayID(int id) {242 ArrayList<Channel> channelsresult = new ArrayList<Channel>();243 for (int i = 0; i < channels.size(); i++) {244 if (channels.get(i).getWay().getId() == id) {245 channelsresult.add(channels.get(i));246 }247 }248 return channelsresult;249 }250 251 public void detectSelectedChannels(double left, double top, double right, double bottom) {252 for (int i = 0; i < channels.size(); i++) {253 //log.trace(channels.get(i).getFromNode().toString());254 if ( (channels.get(i).getFromNode().getLatitude() <= top) && (channels.get(i).getFromNode().getLatitude() >= bottom)255 && (channels.get(i).getFromNode().getLongitude() >= left) && (channels.get(i).getFromNode().getLongitude() <=right)) {256 channels.get(i).setSelected(true);257 selectedChannels.add(channels.get(i));258 }259 if ( (channels.get(i).getToNode().getLatitude() <= top) && (channels.get(i).getToNode().getLatitude() >= bottom)260 && (channels.get(i).getToNode().getLongitude() >= left) && (channels.get(i).getToNode().getLongitude() <=right)) {261 channels.get(i).setSelected(true);262 selectedChannels.add(channels.get(i));263 }264 }265 }266 267 /**268 * löscht die markierten Channels aus der Liste der markierten Channels und setzt die269 * Eigenschaft isSelected auf false270 */271 public void ereaseSelectedChannels() {272 for (int i = 0; i < selectedChannels.size(); i++) {273 Iterator<Channel> it = selectedChannels.iterator();274 while (it.hasNext()) {275 it.next().setSelected(false);276 }277 }278 selectedChannels.clear();279 }280 281 public HashSet<Channel> getSelectedChannels() {282 return selectedChannels;283 }284 285 public HashSet<Channel> getJunctionCandidate() {286 return junctioncandidate;287 }288 289 public void ereaseJunctioncandidate() {290 Iterator<Channel> it = junctioncandidate.iterator();291 while (it.hasNext()) {292 it.next().setPartOfJunction(false);293 }294 junctioncandidate.clear();295 }296 297 /**298 * setzt die Channels eines Kreuzungskandidaten299 * falls in im Hashset vorher Channels gespeichert waren, werden diese vorher gelöscht!300 * @param junctionCandidate301 */302 public void setJunctioncandidate(HashSet<Channel> junctionCandidate) {303 this.junctioncandidate.clear();304 this.junctioncandidate = junctionCandidate;305 Iterator<Channel> it = junctionCandidate.iterator();306 while (it.hasNext()) {307 it.next().setPartOfJunction(true);308 }309 }310 311 public void addJunctioncandidateChannel(Channel channel) {312 junctioncandidate.add(channel);313 channel.setPartOfJunction(true);314 }315 316 /*TODO: kann weg oder?317 public void ereaseChannelsSubgraph() {318 for (int i = 0; i < channels.size(); i++) {319 channels.get(i).setSubgraph(false);320 }321 }322 323 public void ereaseChannelsInDegree() {324 for (int i = 0; i < channels.size(); i++) {325 channels.get(i).setIndegree(0);326 }327 }328 329 public void ereaseChannelsOutDegree() {330 for (int i = 0; i < channels.size(); i++) {331 channels.get(i).setOutdegree(0);332 }333 }334 */13 private ArrayList<Channel> channels = new ArrayList<Channel>(); 14 private final ArrayList<LeadsTo> leadsTos = new ArrayList<LeadsTo>(); 15 private final HashSet<Channel> selectedChannels = new HashSet<Channel>(); 16 private HashSet<Channel> junctioncandidate = new HashSet<Channel>(); 17 18 public void setChannels(ArrayList<Channel> channels) { 19 this.channels = channels; 20 } 21 22 /* 23 * gibt den Channel mit dem übergebendem OSMNode als FromNode zurück 24 */ 25 public Channel getChannelWithFromNode(OSMNode node) { 26 for (int i = 0; i < channels.size(); i++) { 27 if (channels.get(i).getFromNode() == node) { 28 return channels.get(i); 29 } 30 } 31 return null; 32 } 33 34 /** 35 * gibt alle CHannels des Digraphen zurück 36 * @return Channels des Digraphen 37 */ 38 public ArrayList<Channel> getChannels() { 39 return channels; 40 } 41 42 /** 43 * löscht den übergebenden Channel im Digraphen 44 * 45 * @param channel 46 */ 47 public void removeChannel(Channel channel) { 48 channels.remove(channel); 49 } 50 51 /** 52 * fügt einen Channel des ChannelDigraphen hinzu 53 * 54 * @param channel 55 * hinzuzufügender Channel 56 */ 57 public void addChannel(Channel channel) { 58 this.channels.add(channel); 59 } 60 61 /** 62 * Anzahl der innerhalb des DiGraphen gespeicherten Channels 63 * 64 * @return Anzahl der Channels 65 */ 66 public int numberOfChannels() { 67 return channels.size(); 68 } 69 70 /** 71 * gibt Channel i an der Position i in der ArrayList zurück 72 * 73 * @param i 74 * Position innerhalb der ArrayList 75 * @return gewünschter Channel 76 */ 77 public Channel getChannelAtPosition(int i) { 78 return channels.get(i); 79 } 80 81 /** 82 * gibt den Channel mit der gesuchten ID zurück 83 * @param id ID des Channels 84 * @return der gesuchte Channel, wenn nicht vorhanden null 85 */ 86 public Channel getChannelWithID(int id) { 87 for (int i = 0; i < channels.size(); i++) { 88 if (channels.get(i).getNewid() == id) { 89 return channels.get(i); 90 } 91 } 92 return null; 93 } 94 95 /** 96 * gibt alle From und To OSMNodes eines Graphen zurück (nicht die 97 * ZWischenknoten) 98 * 99 * @return alle From und To Nodes aller Channels des Digraphen 100 */ 101 public OSMNode[] getAllOSMNodes() { 102 HashMap<Long, OSMNode> nodes = new HashMap<Long, OSMNode>(); 103 for (int i = 0; i < channels.size(); i++) { 104 if (!nodes.containsKey(channels.get(i).getFromNode().getId())) { 105 nodes.put(channels.get(i).getFromNode().getId(), channels 106 .get(i).getFromNode()); 107 } 108 if (!nodes.containsKey(channels.get(i).getToNode().getId())) { 109 nodes.put(channels.get(i).getToNode().getId(), channels.get(i) 110 .getToNode()); 111 } 112 } 113 OSMNode[] nodearray = new OSMNode[nodes.size()]; 114 return nodes.values().toArray(nodearray); 115 } 116 117 public ArrayList<LeadsTo> getLeadsTo() { 118 return leadsTos; 119 } 120 121 /* 122 public void setLeadsTo(ArrayList<LeadsTo> leadsTo) { 123 this.leadsTos = leadsTo; 124 }*/ 125 126 public void setForwardEdge(Channel fromChannel, Channel toChannel) { 127 for (int i = 0; i < leadsTos.size(); i++) { 128 if (leadsTos.get(i).getFromChannel() == fromChannel) { 129 if (leadsTos.get(i).getToChannel() == toChannel) 130 leadsTos.get(i).setForwardEdge(true); 131 } 132 } 133 134 } 135 136 /** 137 * fügt eine leadsto-relation dem digraphen und dem entsprechendem Channel hinzu 138 * @param leadsTo 139 */ 140 public void addLeadsTo(LeadsTo leadsTo) { 141 leadsTos.add(leadsTo); 142 for (int i = 0; i < channels.size(); i++) { 143 if (channels.get(i).getNewid() == leadsTo.getFromChannel().getNewid()) { 144 channels.get(i).addLeadsTo(leadsTo); 145 return; 146 } 147 } 148 } 149 150 public void removeLeadsTo(LeadsTo leadsTo) { 151 leadsTos.remove(leadsTo); 152 for (int i = 0; i < channels.size(); i++) { 153 if (channels.get(i).equals(leadsTo.getFromChannel())) { 154 channels.get(i).removeLeadsTo(leadsTo); 155 return; 156 } 157 } 158 } 159 160 /** 161 * gibt den Channel zurück, der paßt. Sind Channel doppelt vorhanden, wird 162 * nur der erste passende zurückgegeben! 163 * 164 * @param fromChannel 165 * @param toChannel 166 * @return 167 */ 168 public LeadsTo getLeadsTo(Channel fromChannel, Channel toChannel) { 169 for (int i = 0; i < leadsTos.size(); i++) { 170 if (leadsTos.get(i).getFromChannel().getNewid() == fromChannel.getNewid()) { 171 //log.trace("FromChannel mit ID gefunden: " + fromChannel.getNewid()); 172 if (leadsTos.get(i).getToChannel().getNewid() == toChannel.getNewid()) { 173 //log.trace("Leads To gefunden: " + leadsTos.get(i).toString()); 174 return leadsTos.get(i); 175 } 176 } 177 } 178 return null; 179 } 180 181 /** 182 * gibt alle Channels zurück, die von diesen OSM-Knoten abgehen/hingehen 183 * @param nodes 184 * @return 185 */ 186 public ArrayList<Channel> getChannelsTouchingOSMNodes (ArrayList<OSMNode> nodes) { 187 ArrayList<Channel> touchingChannel = new ArrayList<Channel>(); 188 for (int i = 0; i < nodes.size(); i++) { 189 for (int j = 0; j < channels.size(); j++) { 190 if (channels.get(j).getFromNode().getId() == nodes.get(i).getId()) { 191 if (!touchingChannel.contains(channels.get(j))) { 192 touchingChannel.add(channels.get(j)); 193 } 194 } 195 else if (channels.get(j).getToNode().getId() == nodes.get(i).getId()) { 196 if (!touchingChannel.contains(channels.get(j))) { 197 touchingChannel.add(channels.get(j)); 198 } 199 } 200 } 201 } 202 return touchingChannel; 203 } 204 205 public ArrayList<Channel> getChannelsTouchingOSMNode(long id) { 206 ArrayList<Channel> returnchannels = new ArrayList<Channel>(); 207 for (int i = 0; i < channels.size(); i++) { 208 if (channels.get(i).getFromNode().getId() == id) { 209 returnchannels.add(channels.get(i)); 210 } 211 if (channels.get(i).getToNode().getId() == id) { 212 returnchannels.add(channels.get(i)); 213 } 214 } 215 return returnchannels; 216 } 217 218 /** 219 * gibt den oder die Channels twischen diesen OSM-Punkten zurück 220 * @param idfrom 221 * @param idto 222 * @return 223 */ 224 public ArrayList<Channel> getChannelsBetween(int idfrom, int idto) { 225 ArrayList<Channel> channelsresult = new ArrayList<Channel>(); 226 for (int i = 0; i < channels.size(); i++) { 227 if (channels.get(i).getFromNode().getId() == idfrom) { 228 if (channels.get(i).getToNode().getId() == idto) { 229 channelsresult.add(channels.get(i)); 230 } 231 } 232 else if (channels.get(i).getFromNode().getId() == idto) { 233 if (channels.get(i).getToNode().getId() == idfrom) { 234 channelsresult.add(channels.get(i)); 235 } 236 } 237 } 238 return channelsresult; 239 } 240 241 public ArrayList<Channel> getChannelswithWayID(int id) { 242 ArrayList<Channel> channelsresult = new ArrayList<Channel>(); 243 for (int i = 0; i < channels.size(); i++) { 244 if (channels.get(i).getWay().getId() == id) { 245 channelsresult.add(channels.get(i)); 246 } 247 } 248 return channelsresult; 249 } 250 251 public void detectSelectedChannels(double left, double top, double right, double bottom) { 252 for (int i = 0; i < channels.size(); i++) { 253 //log.trace(channels.get(i).getFromNode().toString()); 254 if ( (channels.get(i).getFromNode().getLatitude() <= top) && (channels.get(i).getFromNode().getLatitude() >= bottom) 255 && (channels.get(i).getFromNode().getLongitude() >= left) && (channels.get(i).getFromNode().getLongitude() <=right)) { 256 channels.get(i).setSelected(true); 257 selectedChannels.add(channels.get(i)); 258 } 259 if ( (channels.get(i).getToNode().getLatitude() <= top) && (channels.get(i).getToNode().getLatitude() >= bottom) 260 && (channels.get(i).getToNode().getLongitude() >= left) && (channels.get(i).getToNode().getLongitude() <=right)) { 261 channels.get(i).setSelected(true); 262 selectedChannels.add(channels.get(i)); 263 } 264 } 265 } 266 267 /** 268 * löscht die markierten Channels aus der Liste der markierten Channels und setzt die 269 * Eigenschaft isSelected auf false 270 */ 271 public void ereaseSelectedChannels() { 272 for (int i = 0; i < selectedChannels.size(); i++) { 273 Iterator<Channel> it = selectedChannels.iterator(); 274 while (it.hasNext()) { 275 it.next().setSelected(false); 276 } 277 } 278 selectedChannels.clear(); 279 } 280 281 public HashSet<Channel> getSelectedChannels() { 282 return selectedChannels; 283 } 284 285 public HashSet<Channel> getJunctionCandidate() { 286 return junctioncandidate; 287 } 288 289 public void ereaseJunctioncandidate() { 290 Iterator<Channel> it = junctioncandidate.iterator(); 291 while (it.hasNext()) { 292 it.next().setPartOfJunction(false); 293 } 294 junctioncandidate.clear(); 295 } 296 297 /** 298 * setzt die Channels eines Kreuzungskandidaten 299 * falls in im Hashset vorher Channels gespeichert waren, werden diese vorher gelöscht! 300 * @param junctionCandidate 301 */ 302 public void setJunctioncandidate(HashSet<Channel> junctionCandidate) { 303 this.junctioncandidate.clear(); 304 this.junctioncandidate = junctionCandidate; 305 Iterator<Channel> it = junctionCandidate.iterator(); 306 while (it.hasNext()) { 307 it.next().setPartOfJunction(true); 308 } 309 } 310 311 public void addJunctioncandidateChannel(Channel channel) { 312 junctioncandidate.add(channel); 313 channel.setPartOfJunction(true); 314 } 315 316 /*TODO: kann weg oder? 317 public void ereaseChannelsSubgraph() { 318 for (int i = 0; i < channels.size(); i++) { 319 channels.get(i).setSubgraph(false); 320 } 321 } 322 323 public void ereaseChannelsInDegree() { 324 for (int i = 0; i < channels.size(); i++) { 325 channels.get(i).setIndegree(0); 326 } 327 } 328 329 public void ereaseChannelsOutDegree() { 330 for (int i = 0; i < channels.size(); i++) { 331 channels.get(i).setOutdegree(0); 332 } 333 } 334 */ 335 335 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/datastructure/Graph.java
r25501 r30725 5 5 */ 6 6 public class Graph { 7 8 //Boundingbox9 private double bbleft;10 private double bbright;11 private double bbbottom;12 private double bbtop;13 14 15 public double getBbleft() {16 return bbleft;17 }18 public void setBbleft(double bbleft) {19 this.bbleft = bbleft;20 }21 public double getBbright() {22 return bbright;23 }24 public void setBbright(double bbright) {25 this.bbright = bbright;26 }27 public double getBbbottom() {28 return bbbottom;29 }30 public void setBbbottom(double bbbottom) {31 this.bbbottom = bbbottom;32 }33 public double getBbtop() {34 return bbtop;35 }36 public void setBbtop(double bbtop) {37 this.bbtop = bbtop;38 }39 public boolean isInBBox(OSMNode node) {40 if ( (node.getLatitude() <= bbtop) && (node.getLatitude() >= bbbottom)41 && (node.getLongitude() >= bbleft) && (node.getLongitude() <=bbright)) {42 return true;43 }44 else {45 return false;46 }47 }48 49 7 8 //Boundingbox 9 private double bbleft; 10 private double bbright; 11 private double bbbottom; 12 private double bbtop; 13 14 15 public double getBbleft() { 16 return bbleft; 17 } 18 public void setBbleft(double bbleft) { 19 this.bbleft = bbleft; 20 } 21 public double getBbright() { 22 return bbright; 23 } 24 public void setBbright(double bbright) { 25 this.bbright = bbright; 26 } 27 public double getBbbottom() { 28 return bbbottom; 29 } 30 public void setBbbottom(double bbbottom) { 31 this.bbbottom = bbbottom; 32 } 33 public double getBbtop() { 34 return bbtop; 35 } 36 public void setBbtop(double bbtop) { 37 this.bbtop = bbtop; 38 } 39 public boolean isInBBox(OSMNode node) { 40 if ( (node.getLatitude() <= bbtop) && (node.getLatitude() >= bbbottom) 41 && (node.getLongitude() >= bbleft) && (node.getLongitude() <=bbright)) { 42 return true; 43 } 44 else { 45 return false; 46 } 47 } 48 49 50 50 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/datastructure/LeadsTo.java
r25501 r30725 6 6 public class LeadsTo { 7 7 8 private Channel fromChannel;9 private Channel toChannel;8 private Channel fromChannel; 9 private Channel toChannel; 10 10 11 //für den JunctionCheck12 private boolean isForwardEdge;11 //für den JunctionCheck 12 private boolean isForwardEdge; 13 13 14 public LeadsTo() {15 }14 public LeadsTo() { 15 } 16 16 17 public LeadsTo(Channel fromcChannel, Channel toChannel) {18 this.fromChannel = fromcChannel;19 this.toChannel = toChannel;20 }17 public LeadsTo(Channel fromcChannel, Channel toChannel) { 18 this.fromChannel = fromcChannel; 19 this.toChannel = toChannel; 20 } 21 21 22 public Channel getFromChannel() {23 return fromChannel;24 }22 public Channel getFromChannel() { 23 return fromChannel; 24 } 25 25 26 public void setFromChannel(Channel fromChannel) {27 this.fromChannel = fromChannel;28 }26 public void setFromChannel(Channel fromChannel) { 27 this.fromChannel = fromChannel; 28 } 29 29 30 public Channel getToChannel() {31 return toChannel;32 }30 public Channel getToChannel() { 31 return toChannel; 32 } 33 33 34 public void setToChannel(Channel toChannel) {35 this.toChannel = toChannel;36 }34 public void setToChannel(Channel toChannel) { 35 this.toChannel = toChannel; 36 } 37 37 38 public boolean isForwardEdge() {39 return isForwardEdge;40 }38 public boolean isForwardEdge() { 39 return isForwardEdge; 40 } 41 41 42 public void setForwardEdge(boolean isForwardEdge) {43 this.isForwardEdge = isForwardEdge;44 }42 public void setForwardEdge(boolean isForwardEdge) { 43 this.isForwardEdge = isForwardEdge; 44 } 45 45 46 @Override47 public String toString() {48 return "fromChannel:::" + fromChannel.getNewid() + ", toChannel:::" + toChannel.getNewid() + " über Node " + toChannel.getFromNode().getId();49 }46 @Override 47 public String toString() { 48 return "fromChannel:::" + fromChannel.getNewid() + ", toChannel:::" + toChannel.getNewid() + " über Node " + toChannel.getFromNode().getId(); 49 } 50 50 51 51 -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/datastructure/OSMEntity.java
r25501 r30725 8 8 */ 9 9 public class OSMEntity { 10 11 //TODO Idee: alle Wertestandardmäßig auf -1 setzen, so muß12 //man bei der Umwandlung nicht auf null-Werte prüfen13 /**14 * @uml.property name="id"15 */16 private long id;17 /**18 * @uml.property name="visible"19 */20 private boolean visible;21 /**22 * @uml.property name="timestamp"23 */24 private String timestamp;25 /**26 * @uml.property name="user"27 */28 private String user;29 /**30 * @uml.property name="uid"31 */32 private int uid;33 /**34 * @uml.property name="changeset"35 */36 private int changeset;37 /**38 * @uml.property name="hashmap"39 */40 private HashMap<String, String> hashmap = new HashMap<String, String>();41 /**42 * @uml.property name="version"43 */44 private int version;45 46 public void setversion(int version) {47 this.version = version;48 }49 50 /**51 * @return52 * @uml.property name="version"53 */54 public int getVersion() {55 return version;56 }57 58 /**59 * @return60 * @uml.property name="id"61 */62 public long getId() {63 return id;64 }65 public void setId(Long id) {66 this.id = id;67 }68 /**69 * @return70 * @uml.property name="visible"71 */72 public boolean isVisible() {73 return visible;74 }75 /**76 * @param visible77 * @uml.property name="visible"78 */79 public void setVisible(boolean visible) {80 this.visible = visible;81 }82 /**83 * @return84 * @uml.property name="timestamp"85 */86 public String getTimestamp() {87 return timestamp;88 }89 /**90 * @param timestamp91 * @uml.property name="timestamp"92 */93 public void setTimestamp(String timestamp) {94 this.timestamp = timestamp;95 }96 /**97 * @return98 * @uml.property name="user"99 */100 public String getUser() {101 return user;102 }103 /**104 * @param user105 * @uml.property name="user"106 */107 public void setUser(String user) {108 this.user = user;109 }110 /**111 * @return112 * @uml.property name="uid"113 */114 public int getUid() {115 return uid;116 }117 /**118 * @param uid119 * @uml.property name="uid"120 */121 public void setUid(int uid) {122 this.uid = uid;123 }124 /**125 * @return126 * @uml.property name="changeset"127 */128 public int getChangeset() {129 return changeset;130 }131 /**132 * @param changeset133 * @uml.property name="changeset"134 */135 public void setChangeset(int changeset) {136 this.changeset = changeset;137 }138 /**139 * @return140 * @uml.property name="hashmap"141 */142 public HashMap<String, String> getHashmap() {143 return hashmap;144 }145 /**146 * @param hashmap147 * @uml.property name="hashmap"148 */149 public void setHashmap(HashMap<String, String> hashmap) {150 this.hashmap = hashmap;151 }152 153 public void setKeyValue(String key, String value){154 hashmap.put(key, value);155 }156 157 public String getValue(String key){158 return hashmap.get(key);159 }10 11 //TODO Idee: alle Wertestandardmäßig auf -1 setzen, so muß 12 //man bei der Umwandlung nicht auf null-Werte prüfen 13 /** 14 * @uml.property name="id" 15 */ 16 private long id; 17 /** 18 * @uml.property name="visible" 19 */ 20 private boolean visible; 21 /** 22 * @uml.property name="timestamp" 23 */ 24 private String timestamp; 25 /** 26 * @uml.property name="user" 27 */ 28 private String user; 29 /** 30 * @uml.property name="uid" 31 */ 32 private int uid; 33 /** 34 * @uml.property name="changeset" 35 */ 36 private int changeset; 37 /** 38 * @uml.property name="hashmap" 39 */ 40 private HashMap<String, String> hashmap = new HashMap<String, String>(); 41 /** 42 * @uml.property name="version" 43 */ 44 private int version; 45 46 public void setversion(int version) { 47 this.version = version; 48 } 49 50 /** 51 * @return 52 * @uml.property name="version" 53 */ 54 public int getVersion() { 55 return version; 56 } 57 58 /** 59 * @return 60 * @uml.property name="id" 61 */ 62 public long getId() { 63 return id; 64 } 65 public void setId(Long id) { 66 this.id = id; 67 } 68 /** 69 * @return 70 * @uml.property name="visible" 71 */ 72 public boolean isVisible() { 73 return visible; 74 } 75 /** 76 * @param visible 77 * @uml.property name="visible" 78 */ 79 public void setVisible(boolean visible) { 80 this.visible = visible; 81 } 82 /** 83 * @return 84 * @uml.property name="timestamp" 85 */ 86 public String getTimestamp() { 87 return timestamp; 88 } 89 /** 90 * @param timestamp 91 * @uml.property name="timestamp" 92 */ 93 public void setTimestamp(String timestamp) { 94 this.timestamp = timestamp; 95 } 96 /** 97 * @return 98 * @uml.property name="user" 99 */ 100 public String getUser() { 101 return user; 102 } 103 /** 104 * @param user 105 * @uml.property name="user" 106 */ 107 public void setUser(String user) { 108 this.user = user; 109 } 110 /** 111 * @return 112 * @uml.property name="uid" 113 */ 114 public int getUid() { 115 return uid; 116 } 117 /** 118 * @param uid 119 * @uml.property name="uid" 120 */ 121 public void setUid(int uid) { 122 this.uid = uid; 123 } 124 /** 125 * @return 126 * @uml.property name="changeset" 127 */ 128 public int getChangeset() { 129 return changeset; 130 } 131 /** 132 * @param changeset 133 * @uml.property name="changeset" 134 */ 135 public void setChangeset(int changeset) { 136 this.changeset = changeset; 137 } 138 /** 139 * @return 140 * @uml.property name="hashmap" 141 */ 142 public HashMap<String, String> getHashmap() { 143 return hashmap; 144 } 145 /** 146 * @param hashmap 147 * @uml.property name="hashmap" 148 */ 149 public void setHashmap(HashMap<String, String> hashmap) { 150 this.hashmap = hashmap; 151 } 152 153 public void setKeyValue(String key, String value){ 154 hashmap.put(key, value); 155 } 156 157 public String getValue(String key){ 158 return hashmap.get(key); 159 } 160 160 161 public boolean hasKey(String key){162 return hashmap.containsKey(key);163 }164 165 /**166 * prüft, ob der übergebene String als Wert existiert167 * @param value168 * @return169 */170 public boolean hasValue(String value){171 return hashmap.containsValue(value);172 }173 174 protected String valuestoString() {175 return ("ID: " + (id) + "\n" + "User: " + user + "\n");176 }161 public boolean hasKey(String key){ 162 return hashmap.containsKey(key); 163 } 164 165 /** 166 * prüft, ob der übergebene String als Wert existiert 167 * @param value 168 * @return 169 */ 170 public boolean hasValue(String value){ 171 return hashmap.containsValue(value); 172 } 173 174 protected String valuestoString() { 175 return ("ID: " + (id) + "\n" + "User: " + user + "\n"); 176 } 177 177 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/datastructure/OSMGraph.java
r25501 r30725 16 16 public class OSMGraph extends Graph{ 17 17 18 private final HashMap<Long, OSMWay> ways = new HashMap<Long, OSMWay>();19 private HashMap<Long, OSMRelation> relations = new HashMap<Long, OSMRelation>();20 private final HashMap<Long, OSMNode> nodes = new HashMap<Long, OSMNode>();18 private final HashMap<Long, OSMWay> ways = new HashMap<Long, OSMWay>(); 19 private HashMap<Long, OSMRelation> relations = new HashMap<Long, OSMRelation>(); 20 private final HashMap<Long, OSMNode> nodes = new HashMap<Long, OSMNode>(); 21 21 22 public void addNode(OSMNode node) {23 nodes.put(node.getId(), node);24 }22 public void addNode(OSMNode node) { 23 nodes.put(node.getId(), node); 24 } 25 25 26 /**27 * gibt den Knoten mit der gesuchten OSM-ID zurück28 * @param id OSM-iD des Knotens!29 * @return30 */31 public OSMNode getNode(long id) {32 return nodes.get(id);33 }26 /** 27 * gibt den Knoten mit der gesuchten OSM-ID zurück 28 * @param id OSM-iD des Knotens! 29 * @return 30 */ 31 public OSMNode getNode(long id) { 32 return nodes.get(id); 33 } 34 34 35 public void removeWay(OSMWay way) {36 ways.remove(way);37 }35 public void removeWay(OSMWay way) { 36 ways.remove(way); 37 } 38 38 39 public OSMNode[] getNodes(){40 OSMNode[] nodearray= new OSMNode[nodes.size()];41 return nodes.values().toArray(nodearray);42 }39 public OSMNode[] getNodes(){ 40 OSMNode[] nodearray= new OSMNode[nodes.size()]; 41 return nodes.values().toArray(nodearray); 42 } 43 43 44 public void addWay(OSMWay way) {45 ways.put(way.getId(), way);46 }44 public void addWay(OSMWay way) { 45 ways.put(way.getId(), way); 46 } 47 47 48 public OSMWay getWay(long id) {49 return ways.get(id);50 }48 public OSMWay getWay(long id) { 49 return ways.get(id); 50 } 51 51 52 public OSMRelation getRelation(int id) {53 return relations.get(id);54 }52 public OSMRelation getRelation(int id) { 53 return relations.get(id); 54 } 55 55 56 public HashMap<Long, OSMRelation> getRelationsAshashmap() {57 return relations;58 }56 public HashMap<Long, OSMRelation> getRelationsAshashmap() { 57 return relations; 58 } 59 59 60 public void setRelations( HashMap<Long, OSMRelation> relations) {61 this.relations = relations;62 }60 public void setRelations( HashMap<Long, OSMRelation> relations) { 61 this.relations = relations; 62 } 63 63 64 public OSMWay[] getWays() {65 OSMWay[] wayarray= new OSMWay[ways.size()];66 return ways.values().toArray(wayarray);67 }64 public OSMWay[] getWays() { 65 OSMWay[] wayarray= new OSMWay[ways.size()]; 66 return ways.values().toArray(wayarray); 67 } 68 68 69 public void addRelation(OSMRelation relation) {70 relations.put(relation.getId(), relation);71 }69 public void addRelation(OSMRelation relation) { 70 relations.put(relation.getId(), relation); 71 } 72 72 73 public OSMRelation[] getRelations(){74 OSMRelation[] relationarray = new OSMRelation[relations.size()];75 return relations.values().toArray(relationarray);76 }73 public OSMRelation[] getRelations(){ 74 OSMRelation[] relationarray = new OSMRelation[relations.size()]; 75 return relations.values().toArray(relationarray); 76 } 77 77 78 public Collection<OSMRelation> getRelationsCollection() {79 return relations.values();80 }78 public Collection<OSMRelation> getRelationsCollection() { 79 return relations.values(); 80 } 81 81 82 public boolean hasNode(Long id) {83 return nodes.containsKey(id);84 }82 public boolean hasNode(Long id) { 83 return nodes.containsKey(id); 84 } 85 85 86 public ArrayList<Long> getIDsfromWay(int id) {87 OSMWay w = ways.get(id);88 ArrayList<Long> ids = new ArrayList<Long>();89 ids.add(w.getToNode().getId());90 ids.add(w.getFromNode().getId());91 return ids;92 }86 public ArrayList<Long> getIDsfromWay(int id) { 87 OSMWay w = ways.get(id); 88 ArrayList<Long> ids = new ArrayList<Long>(); 89 ids.add(w.getToNode().getId()); 90 ids.add(w.getFromNode().getId()); 91 return ids; 92 } 93 93 94 public void addNode(Node node) {95 OSMNode OSMnode = new OSMNode();96 OSMnode.setId(node.getId());97 OSMnode.setLatitude(node.getBBox().getTopLeft().lat());98 OSMnode.setLongitude(node.getBBox().getTopLeft().lon());99 OSMnode.setHashmap(new HashMap<String, String>(node.getKeys()));100 nodes.put(OSMnode.getId(), OSMnode);101 }94 public void addNode(Node node) { 95 OSMNode OSMnode = new OSMNode(); 96 OSMnode.setId(node.getId()); 97 OSMnode.setLatitude(node.getBBox().getTopLeft().lat()); 98 OSMnode.setLongitude(node.getBBox().getTopLeft().lon()); 99 OSMnode.setHashmap(new HashMap<String, String>(node.getKeys())); 100 nodes.put(OSMnode.getId(), OSMnode); 101 } 102 102 103 public void addWay(Way way) {104 OSMWay osmway = new OSMWay();105 osmway.setId(way.getId());106 Iterator<Node> it = way.getNodes().iterator();107 while (it.hasNext()) {108 osmway.addNode(getNode(it.next().getId()));109 }110 osmway.setHashmap(new HashMap<String, String>(way.getKeys()));111 ways.put(osmway.getId(), osmway);112 }103 public void addWay(Way way) { 104 OSMWay osmway = new OSMWay(); 105 osmway.setId(way.getId()); 106 Iterator<Node> it = way.getNodes().iterator(); 107 while (it.hasNext()) { 108 osmway.addNode(getNode(it.next().getId())); 109 } 110 osmway.setHashmap(new HashMap<String, String>(way.getKeys())); 111 ways.put(osmway.getId(), osmway); 112 } 113 113 114 public void addRelation(Relation relation) {115 OSMRelation osmrelation = new OSMRelation();116 osmrelation.setId(relation.getId());117 osmrelation.setHashmap(new HashMap<String, String>(relation.getKeys()));118 RelationMember rmember;119 for (int i = 0; i < relation.getMembers().size(); i++) {120 rmember = relation.getMember(i);121 if (rmember.getMember() instanceof Node) {122 osmrelation.addMember(getNode(rmember.getMember().getId()), rmember.getRole());123 }124 else if (rmember.getMember() instanceof Way) {125 osmrelation.addMember(getWay(rmember.getMember().getId()), rmember.getRole());126 }127 }128 relations.put(osmrelation.getId(), osmrelation);129 }114 public void addRelation(Relation relation) { 115 OSMRelation osmrelation = new OSMRelation(); 116 osmrelation.setId(relation.getId()); 117 osmrelation.setHashmap(new HashMap<String, String>(relation.getKeys())); 118 RelationMember rmember; 119 for (int i = 0; i < relation.getMembers().size(); i++) { 120 rmember = relation.getMember(i); 121 if (rmember.getMember() instanceof Node) { 122 osmrelation.addMember(getNode(rmember.getMember().getId()), rmember.getRole()); 123 } 124 else if (rmember.getMember() instanceof Way) { 125 osmrelation.addMember(getWay(rmember.getMember().getId()), rmember.getRole()); 126 } 127 } 128 relations.put(osmrelation.getId(), osmrelation); 129 } 130 130 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/datastructure/OSMNode.java
r25501 r30725 8 8 */ 9 9 public class OSMNode extends OSMEntity { 10 11 private double latitude;12 private double longitude;13 private ArrayList<Channel> outgoingChannels = new ArrayList<Channel>();14 private ArrayList<OSMNode> succNodeList = new ArrayList<OSMNode>();15 private ArrayList<OSMNode> predNodeList = new ArrayList<OSMNode>();16 17 public void addOutgoingChannel(Channel channel) {18 outgoingChannels.add(channel);19 }20 21 public ArrayList<Channel> getOutgoingChannels() {22 return outgoingChannels;23 }24 25 public double getLatitude() {26 return latitude;27 }28 public void setLatitude(double latitude) {29 this.latitude = latitude;30 }31 public double getLongitude() {32 return longitude;33 }34 public void setLongitude(double longitude) {35 this.longitude = longitude;36 }37 38 public String toString(){39 return valuestoString() + "Lat: " + latitude + "\n" + "Lon: " + longitude;40 }10 11 private double latitude; 12 private double longitude; 13 private ArrayList<Channel> outgoingChannels = new ArrayList<Channel>(); 14 private ArrayList<OSMNode> succNodeList = new ArrayList<OSMNode>(); 15 private ArrayList<OSMNode> predNodeList = new ArrayList<OSMNode>(); 16 17 public void addOutgoingChannel(Channel channel) { 18 outgoingChannels.add(channel); 19 } 20 21 public ArrayList<Channel> getOutgoingChannels() { 22 return outgoingChannels; 23 } 24 25 public double getLatitude() { 26 return latitude; 27 } 28 public void setLatitude(double latitude) { 29 this.latitude = latitude; 30 } 31 public double getLongitude() { 32 return longitude; 33 } 34 public void setLongitude(double longitude) { 35 this.longitude = longitude; 36 } 37 38 public String toString(){ 39 return valuestoString() + "Lat: " + latitude + "\n" + "Lon: " + longitude; 40 } 41 41 42 public ArrayList<OSMNode> getSuccNodeList() {43 return succNodeList;44 }42 public ArrayList<OSMNode> getSuccNodeList() { 43 return succNodeList; 44 } 45 45 46 public ArrayList<OSMNode> getPredNodeList() {47 return predNodeList;48 }49 50 public void addSuccNode(OSMNode node) {51 succNodeList.add(node);52 }53 54 public void addPredNode(OSMNode node) {55 predNodeList.add(node);56 }57 58 59 46 public ArrayList<OSMNode> getPredNodeList() { 47 return predNodeList; 48 } 49 50 public void addSuccNode(OSMNode node) { 51 succNodeList.add(node); 52 } 53 54 public void addPredNode(OSMNode node) { 55 predNodeList.add(node); 56 } 57 58 59 60 60 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/datastructure/OSMRelation.java
r29854 r30725 9 9 public class OSMRelation extends OSMEntity { 10 10 11 private ArrayList<Member> members = new ArrayList<Member>();11 private ArrayList<Member> members = new ArrayList<Member>(); 12 12 13 public void setMembers(ArrayList<Member> members) {14 this.members = members;15 }13 public void setMembers(ArrayList<Member> members) { 14 this.members = members; 15 } 16 16 17 public ArrayList<Member> getMembers() {18 return members;19 }20 21 /**22 * gibt den Member mit der Rolle zurück, wenn vorhanden. Sonst null23 * @param role24 * @return25 */26 public OSMEntity getMember(String role) {27 for (int i = 0; i < members.size(); i++) {28 if (members.get(i).getRole().equals(role)) {29 return members.get(i).getMember();30 }31 }32 return null;33 }34 35 public void addMember(OSMEntity member, String role) {36 members.add(new Member(member, role));37 }38 39 public String getRelationType(String key) {40 return this.getValue(key);41 }42 43 public String toString() {44 String s = ("Relation-ID: " + this.getId() + " Relation-Type: " + this.getRelationType("type") +"\n");45 for (int i = 0; i < members.size(); i++) {46 s += ("Member: " + members.get(i).getRole() + ", ref:" + members.get(i).getId() + ", type:" + members.get(i).getType().getClass().getName() );47 }48 return s;49 }50 17 public ArrayList<Member> getMembers() { 18 return members; 19 } 20 21 /** 22 * gibt den Member mit der Rolle zurück, wenn vorhanden. Sonst null 23 * @param role 24 * @return 25 */ 26 public OSMEntity getMember(String role) { 27 for (int i = 0; i < members.size(); i++) { 28 if (members.get(i).getRole().equals(role)) { 29 return members.get(i).getMember(); 30 } 31 } 32 return null; 33 } 34 35 public void addMember(OSMEntity member, String role) { 36 members.add(new Member(member, role)); 37 } 38 39 public String getRelationType(String key) { 40 return this.getValue(key); 41 } 42 43 public String toString() { 44 String s = ("Relation-ID: " + this.getId() + " Relation-Type: " + this.getRelationType("type") +"\n"); 45 for (int i = 0; i < members.size(); i++) { 46 s += ("Member: " + members.get(i).getRole() + ", ref:" + members.get(i).getId() + ", type:" + members.get(i).getType().getClass().getName() ); 47 } 48 return s; 49 } 50 51 51 52 /**53 * Klasse dient zum Verwalten eines Member-Objektes. Muß ein Objekt vom Typ OSMEntitysein.54 * @author joerg55 */56 class Member {52 /** 53 * Klasse dient zum Verwalten eines Member-Objektes. Muß ein Objekt vom Typ OSMEntitysein. 54 * @author joerg 55 */ 56 class Member { 57 57 58 private OSMEntity member;59 private String role;58 private OSMEntity member; 59 private String role; 60 60 61 public Member(OSMEntity member, String role) {62 this.member = member;63 this.setRole(role);64 }65 66 public Class<? extends OSMEntity> getType() {67 return member.getClass();68 }61 public Member(OSMEntity member, String role) { 62 this.member = member; 63 this.setRole(role); 64 } 65 66 public Class<? extends OSMEntity> getType() { 67 return member.getClass(); 68 } 69 69 70 public void setMember(OSMEntity member) {71 this.member = member;72 }70 public void setMember(OSMEntity member) { 71 this.member = member; 72 } 73 73 74 public OSMEntity getMember() {75 return member;76 }74 public OSMEntity getMember() { 75 return member; 76 } 77 77 78 public Long getId() {79 return member.getId();80 }78 public Long getId() { 79 return member.getId(); 80 } 81 81 82 public void setRole(String role) {83 this.role = role;84 }82 public void setRole(String role) { 83 this.role = role; 84 } 85 85 86 public String getRole() {87 return role;88 }89 }86 public String getRole() { 87 return role; 88 } 89 } 90 90 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/datastructure/OSMWay.java
r25501 r30725 8 8 public class OSMWay extends OSMEntity { 9 9 10 private Vector<OSMNode> nodes = new Vector<OSMNode>();10 private Vector<OSMNode> nodes = new Vector<OSMNode>(); 11 11 12 public OSMNode[] getNodes() {13 OSMNode[] nodearray = new OSMNode[nodes.size()];14 return (OSMNode[]) nodes.toArray(nodearray);15 }12 public OSMNode[] getNodes() { 13 OSMNode[] nodearray = new OSMNode[nodes.size()]; 14 return (OSMNode[]) nodes.toArray(nodearray); 15 } 16 16 17 public OSMNode getToNode() {18 return nodes.lastElement();19 }17 public OSMNode getToNode() { 18 return nodes.lastElement(); 19 } 20 20 21 public OSMNode getFromNode() {22 return nodes.firstElement();23 }21 public OSMNode getFromNode() { 22 return nodes.firstElement(); 23 } 24 24 25 public void addNode(OSMNode node) {26 nodes.add(node);27 }25 public void addNode(OSMNode node) { 26 nodes.add(node); 27 } 28 28 29 public String tosString() {30 System.out.println(this.getId());31 return this.valuestoString() + "fromNodeID: "32 + this.getFromNode().getId() + "\ntoNodeID: "33 + this.getToNode().getId();34 }29 public String tosString() { 30 System.out.println(this.getId()); 31 return this.valuestoString() + "fromNodeID: " 32 + this.getFromNode().getId() + "\ntoNodeID: " 33 + this.getToNode().getId(); 34 } 35 35 36 /**37 * ist der OSMWay eine Einbahnstraße?38 *39 * @return true wenn ja, sonst nein40 */41 public boolean isOneWay() {42 // TODO Tippfehler berücksichtigen43 // evtl. doch über ein XML-File konfigurieren?44 if (this.hasKey("oneway")) {45 String t = this.getValue("oneway");46 if (t.equals("1") || t.equals("true") || t.equals("yes")) {47 return true;48 }49 }50 String t = this.getValue("highway");51 if (t != null) {52 if (t.equals("motorway") || t.equals("motorway_link")) {53 return true;54 }36 /** 37 * ist der OSMWay eine Einbahnstraße? 38 * 39 * @return true wenn ja, sonst nein 40 */ 41 public boolean isOneWay() { 42 // TODO Tippfehler berücksichtigen 43 // evtl. doch über ein XML-File konfigurieren? 44 if (this.hasKey("oneway")) { 45 String t = this.getValue("oneway"); 46 if (t.equals("1") || t.equals("true") || t.equals("yes")) { 47 return true; 48 } 49 } 50 String t = this.getValue("highway"); 51 if (t != null) { 52 if (t.equals("motorway") || t.equals("motorway_link")) { 53 return true; 54 } 55 55 56 else {57 return false;58 }59 } else60 return false;61 }56 else { 57 return false; 58 } 59 } else 60 return false; 61 } 62 62 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/filter/ExecuteFilter.java
r25501 r30725 9 9 */ 10 10 public class ExecuteFilter { 11 12 private Filter[] filter;13 private XMLFilterReader xmlfilterreader;14 private OSMGraph incominggraph;15 private OSMGraph outgoinggraph;16 17 public ExecuteFilter(Filter[] filter, OSMGraph incoming){18 this.filter = filter;19 this.incominggraph = incoming;20 outgoinggraph = new OSMGraph();21 outgoinggraph.setBbbottom(incoming.getBbbottom());22 outgoinggraph.setBbleft(incoming.getBbleft());23 outgoinggraph.setBbright(incoming.getBbright());24 outgoinggraph.setBbtop(incoming.getBbtop());25 outgoinggraph.setRelations(incoming.getRelationsAshashmap());26 }27 28 public ExecuteFilter() {29 }30 31 public void filter(){32 OSMWay[] tempWays = incominggraph.getWays();33 String key;34 //alle Einträge im Filter durchgehen35 for (int i = 0; i < filter.length; i++) {36 //alle Ways durchgehen37 for (int j = 0; j < tempWays.length; j++) {38 key = filter[i].getKeyValue();39 //prüfen, ob Way Key-Wert des Filters enthält40 if (tempWays[j].hasKey(key)) {41 //prüfen, ob Way auch einen Value-Wert des Filtereintrags enthält42 if (filter[i].hasTagValue(tempWays[j].getValue(key))) {43 //Way outgoinggraph hinzufügen44 outgoinggraph.addWay(tempWays[j]);45 for (int j2 = 0; j2 < tempWays[j].getNodes().length; j2++) {46 //zum way gehörende Nodes einfügen, aber nur, wenn diese47 //vorher noch nicht im outgoinggraph vorhanden sind48 if (!outgoinggraph.hasNode(tempWays[j].getNodes()[j2].getId())) {49 outgoinggraph.addNode(tempWays[j].getNodes()[j2]);50 }51 52 }53 }54 }55 }56 }57 }58 59 public Filter[] getFilter() {60 return filter;61 }11 12 private Filter[] filter; 13 private XMLFilterReader xmlfilterreader; 14 private OSMGraph incominggraph; 15 private OSMGraph outgoinggraph; 16 17 public ExecuteFilter(Filter[] filter, OSMGraph incoming){ 18 this.filter = filter; 19 this.incominggraph = incoming; 20 outgoinggraph = new OSMGraph(); 21 outgoinggraph.setBbbottom(incoming.getBbbottom()); 22 outgoinggraph.setBbleft(incoming.getBbleft()); 23 outgoinggraph.setBbright(incoming.getBbright()); 24 outgoinggraph.setBbtop(incoming.getBbtop()); 25 outgoinggraph.setRelations(incoming.getRelationsAshashmap()); 26 } 27 28 public ExecuteFilter() { 29 } 30 31 public void filter(){ 32 OSMWay[] tempWays = incominggraph.getWays(); 33 String key; 34 //alle Einträge im Filter durchgehen 35 for (int i = 0; i < filter.length; i++) { 36 //alle Ways durchgehen 37 for (int j = 0; j < tempWays.length; j++) { 38 key = filter[i].getKeyValue(); 39 //prüfen, ob Way Key-Wert des Filters enthält 40 if (tempWays[j].hasKey(key)) { 41 //prüfen, ob Way auch einen Value-Wert des Filtereintrags enthält 42 if (filter[i].hasTagValue(tempWays[j].getValue(key))) { 43 //Way outgoinggraph hinzufügen 44 outgoinggraph.addWay(tempWays[j]); 45 for (int j2 = 0; j2 < tempWays[j].getNodes().length; j2++) { 46 //zum way gehörende Nodes einfügen, aber nur, wenn diese 47 //vorher noch nicht im outgoinggraph vorhanden sind 48 if (!outgoinggraph.hasNode(tempWays[j].getNodes()[j2].getId())) { 49 outgoinggraph.addNode(tempWays[j].getNodes()[j2]); 50 } 51 52 } 53 } 54 } 55 } 56 } 57 } 58 59 public Filter[] getFilter() { 60 return filter; 61 } 62 62 63 public void setFilter(Filter[] filter) {64 this.filter = filter;65 }63 public void setFilter(Filter[] filter) { 64 this.filter = filter; 65 } 66 66 67 public XMLFilterReader getXmlfilterreader() {68 return xmlfilterreader;69 }67 public XMLFilterReader getXmlfilterreader() { 68 return xmlfilterreader; 69 } 70 70 71 public void setXmlfilterreader(XMLFilterReader xmlfilterreader) {72 this.xmlfilterreader = xmlfilterreader;73 }71 public void setXmlfilterreader(XMLFilterReader xmlfilterreader) { 72 this.xmlfilterreader = xmlfilterreader; 73 } 74 74 75 public OSMGraph getIncominggraph() {76 return incominggraph;77 }75 public OSMGraph getIncominggraph() { 76 return incominggraph; 77 } 78 78 79 public void setIncominggraph(OSMGraph incominggraph) {80 this.incominggraph = incominggraph;81 }79 public void setIncominggraph(OSMGraph incominggraph) { 80 this.incominggraph = incominggraph; 81 } 82 82 83 public OSMGraph getOutgoinggraph() {84 return outgoinggraph;85 }83 public OSMGraph getOutgoinggraph() { 84 return outgoinggraph; 85 } 86 86 87 public void setOutgoinggraph(OSMGraph outgoinggraph) {88 this.outgoinggraph = outgoinggraph;89 }87 public void setOutgoinggraph(OSMGraph outgoinggraph) { 88 this.outgoinggraph = outgoinggraph; 89 } 90 90 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/filter/Filter.java
r30722 r30725 8 8 */ 9 9 public class Filter { 10 11 private HashSet<String> tagValues = new HashSet<String>();12 private String keyValue;13 14 public Filter(String keyname, ArrayList<String> values) {15 this.keyValue = keyname;16 tagValues.addAll(values);17 }18 19 public boolean hasTagValue(String value) {20 return tagValues.contains(value);21 }22 23 public Filter() {24 }25 26 public String[] getTagValues() {27 return tagValues.toArray(new String[tagValues.size()]);28 }10 11 private HashSet<String> tagValues = new HashSet<String>(); 12 private String keyValue; 13 14 public Filter(String keyname, ArrayList<String> values) { 15 this.keyValue = keyname; 16 tagValues.addAll(values); 17 } 18 19 public boolean hasTagValue(String value) { 20 return tagValues.contains(value); 21 } 22 23 public Filter() { 24 } 25 26 public String[] getTagValues() { 27 return tagValues.toArray(new String[tagValues.size()]); 28 } 29 29 30 public void setTagValues(HashSet<String> tagValues) {31 this.tagValues = tagValues;32 }33 34 public void setTagValue(String value) {35 tagValues.add(value);36 }30 public void setTagValues(HashSet<String> tagValues) { 31 this.tagValues = tagValues; 32 } 33 34 public void setTagValue(String value) { 35 tagValues.add(value); 36 } 37 37 38 public String getKeyValue() {39 return keyValue;40 }38 public String getKeyValue() { 39 return keyValue; 40 } 41 41 42 public void setKeyValue(String keyValue) {43 this.keyValue = keyValue;44 }42 public void setKeyValue(String keyValue) { 43 this.keyValue = keyValue; 44 } 45 45 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/junctionchecking/BackPropagation.java
r29854 r30725 11 11 public class BackPropagation { 12 12 13 private final ChannelDiGraph digraph;13 private final ChannelDiGraph digraph; 14 14 15 public BackPropagation(ChannelDiGraph digraph) {16 this.digraph = digraph;17 }15 public BackPropagation(ChannelDiGraph digraph) { 16 this.digraph = digraph; 17 } 18 18 19 /**20 *21 * @param y fromNode22 * @param z toNode23 */24 public void backPropagation(Channel y, Channel z, Channel zstrich) {25 for (int i = 0; i < z.getReachableNodes().size(); i++) {26 y.addReachableNode(z.getReachableNodeAt(i));27 //z.appendChannelToPath(i, z);28 y.appendPath(z.getReachableNodeAt(i), z.getPathsAt(z.getReachableNodeAt(i)));29 y.appendPath(z.getReachableNodeAt(i), y.getPathsAt(z));30 }31 for (int i = 0; i < y.getPredChannels().size(); i++) {32 if (zstrich !=33 y.getPredChannels().get(i) &&34 digraph.getLeadsTo(35 y.getPredChannels().get(i), y).36 isForwardEdge()37 ) {38 backPropagation(y.getPredChannels().get(i), y, zstrich);39 }40 }41 }19 /** 20 * 21 * @param y fromNode 22 * @param z toNode 23 */ 24 public void backPropagation(Channel y, Channel z, Channel zstrich) { 25 for (int i = 0; i < z.getReachableNodes().size(); i++) { 26 y.addReachableNode(z.getReachableNodeAt(i)); 27 //z.appendChannelToPath(i, z); 28 y.appendPath(z.getReachableNodeAt(i), z.getPathsAt(z.getReachableNodeAt(i))); 29 y.appendPath(z.getReachableNodeAt(i), y.getPathsAt(z)); 30 } 31 for (int i = 0; i < y.getPredChannels().size(); i++) { 32 if (zstrich != 33 y.getPredChannels().get(i) && 34 digraph.getLeadsTo( 35 y.getPredChannels().get(i), y). 36 isForwardEdge() 37 ) { 38 backPropagation(y.getPredChannels().get(i), y, zstrich); 39 } 40 } 41 } 42 42 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/junctionchecking/Combination.java
r25501 r30725 2 2 3 3 public class Combination { 4 5 private long n = 0;6 private long k = 0;7 long[] data = null;8 9 public Combination(long n, long k){10 if (n < 0 || k < 0)11 try {12 throw new Exception("Negative parameter in constructor");13 } catch (Exception e) {14 // TODO Auto-generated catch block15 e.printStackTrace();16 }17 this.n = n;18 this.k = k;19 this.data = new long[(int)k];20 for (long i = 0; i < k; ++i)21 this.data[(int)i] = i;22 }23 24 public static long Choose(long n, long k)25 {26 if (n < 0 || k < 0)27 try {28 throw new Exception("Invalid negative parameter in Choose()");29 } catch (Exception e) {30 // TODO Auto-generated catch block31 e.printStackTrace();32 }33 if (n < k) return 0;34 if (n == k) return 1;4 5 private long n = 0; 6 private long k = 0; 7 long[] data = null; 8 9 public Combination(long n, long k){ 10 if (n < 0 || k < 0) 11 try { 12 throw new Exception("Negative parameter in constructor"); 13 } catch (Exception e) { 14 // TODO Auto-generated catch block 15 e.printStackTrace(); 16 } 17 this.n = n; 18 this.k = k; 19 this.data = new long[(int)k]; 20 for (long i = 0; i < k; ++i) 21 this.data[(int)i] = i; 22 } 23 24 public static long Choose(long n, long k) 25 { 26 if (n < 0 || k < 0) 27 try { 28 throw new Exception("Invalid negative parameter in Choose()"); 29 } catch (Exception e) { 30 // TODO Auto-generated catch block 31 e.printStackTrace(); 32 } 33 if (n < k) return 0; 34 if (n == k) return 1; 35 35 36 long delta, iMax;36 long delta, iMax; 37 37 38 if (k < n-k) // ex: Choose(100,3)39 {40 delta = n-k;41 iMax = k;42 }43 else // ex: Choose(100,97)44 {45 delta = k;46 iMax = n-k;47 }38 if (k < n-k) // ex: Choose(100,3) 39 { 40 delta = n-k; 41 iMax = k; 42 } 43 else // ex: Choose(100,97) 44 { 45 delta = k; 46 iMax = n-k; 47 } 48 48 49 long ans = delta + 1;49 long ans = delta + 1; 50 50 51 for (long i = 2; i <= iMax; ++i)52 {53 ans = (ans * (delta + i)) / i;54 }51 for (long i = 2; i <= iMax; ++i) 52 { 53 ans = (ans * (delta + i)) / i; 54 } 55 55 56 return ans;57 }58 public long Choose()59 {60 61 if (n < k) return 0;62 if (n == k) return 1;56 return ans; 57 } 58 public long Choose() 59 { 60 61 if (n < k) return 0; 62 if (n == k) return 1; 63 63 64 long delta, iMax;64 long delta, iMax; 65 65 66 if (k < n-k) // ex: Choose(100,3)67 {68 delta = n-k;69 iMax = k;70 }71 else // ex: Choose(100,97)72 {73 delta = k;74 iMax = n-k;75 }66 if (k < n-k) // ex: Choose(100,3) 67 { 68 delta = n-k; 69 iMax = k; 70 } 71 else // ex: Choose(100,97) 72 { 73 delta = k; 74 iMax = n-k; 75 } 76 76 77 long ans = delta + 1;77 long ans = delta + 1; 78 78 79 for (long i = 2; i <= iMax; ++i)80 {81 ans = (ans * (delta + i)) / i;82 }79 for (long i = 2; i <= iMax; ++i) 80 { 81 ans = (ans * (delta + i)) / i; 82 } 83 83 84 return ans;85 }84 return ans; 85 } 86 86 87 88 public Combination Successor()89 {90 if (this.data.length == 0 ||91 this.data[0] == this.n - this.k)92 return null;87 88 public Combination Successor() 89 { 90 if (this.data.length == 0 || 91 this.data[0] == this.n - this.k) 92 return null; 93 93 94 Combination ans = new Combination(this.n, this.k);94 Combination ans = new Combination(this.n, this.k); 95 95 96 long i;97 for (i = 0; i < this.k; ++i){98 ans.data[(int)i] = this.data[(int)i];99 }100 for (i = this.k - 1; i > 0 && ans.data[(int)i] == this.n - this.k + i; --i) {};101 102 ++ans.data[(int)i];96 long i; 97 for (i = 0; i < this.k; ++i){ 98 ans.data[(int)i] = this.data[(int)i]; 99 } 100 for (i = this.k - 1; i > 0 && ans.data[(int)i] == this.n - this.k + i; --i) {}; 101 102 ++ans.data[(int)i]; 103 103 104 for (long j = i; j < this.k - 1; ++j){105 ans.data[(int)j+1] = ans.data[(int)j] + 1;106 }107 return ans;108 }109 110 public String ToString()111 {112 StringBuilder sb = new StringBuilder();113 sb.append("{");114 for (long i = 0; i < this.k; ++i){115 sb.append(this.data[(int)i]);116 if (i<this.k-1) sb.append(", ");117 }118 sb.append("}");119 return sb.toString();120 }104 for (long j = i; j < this.k - 1; ++j){ 105 ans.data[(int)j+1] = ans.data[(int)j] + 1; 106 } 107 return ans; 108 } 109 110 public String ToString() 111 { 112 StringBuilder sb = new StringBuilder(); 113 sb.append("{"); 114 for (long i = 0; i < this.k; ++i){ 115 sb.append(this.data[(int)i]); 116 if (i<this.k-1) sb.append(", "); 117 } 118 sb.append("}"); 119 return sb.toString(); 120 } 121 121 122 122 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/junctionchecking/JCheck.java
r25501 r30725 9 9 public class JCheck { 10 10 11 private int exnr;12 private String result = "";11 private int exnr; 12 private String result = ""; 13 13 14 public boolean jCheck(ArrayList<Channel> entries, ArrayList<Channel> exits,15 int n) {16 for (int i = 0; i < exits.size(); i++) {17 exits.get(i).setEnnrZero();18 }19 if (!(entries.size() == exits.size() && exits.size() == n)) {20 result="Rule 1 broken: " + entries.size() + " entries but "21 + exits.size() + " exits and n=" + n;22 return false;23 }24 for (int i = 0; i < entries.size(); i++) {25 if (!(entries.get(i).getIndegree() + entries.get(i).getOutdegree() >= 2)) {26 result="rule 4 broken: indegree from entrynode with ID: "27 + entries.get(i).getNewid() + ": "28 + entries.get(i).getIndegree() + " OutDegree: "29 + entries.get(i).getOutdegree();30 return false;31 }32 exnr = 0;33 for (int j = 0; j < exits.size(); j++) {34 if (!(exits.get(j).getIndegree() + exits.get(j).getOutdegree() >= 2)) {35 result="Rule 4 broken, indegree from exitnode with ID: "36 + exits.get(j).getNewid() + ": "37 + exits.get(j).getIndegree() + " and outdegree: "38 + exits.get(j).getOutdegree();39 //log.debug(exits.get(j).toString());40 return false;41 }42 if (entries.get(i).getReachableNodes().contains(exits.get(j))) {43 exnr++;44 exits.get(j).increaseEnnr();45 }46 if (exits.get(j).equals(entries.get(i))) {47 result="Rule 2 broken: node with ID: "48 + "entries.get(i).getNode().getId()"49 + "is both entry and exit node";50 return false;51 }52 }14 public boolean jCheck(ArrayList<Channel> entries, ArrayList<Channel> exits, 15 int n) { 16 for (int i = 0; i < exits.size(); i++) { 17 exits.get(i).setEnnrZero(); 18 } 19 if (!(entries.size() == exits.size() && exits.size() == n)) { 20 result="Rule 1 broken: " + entries.size() + " entries but " 21 + exits.size() + " exits and n=" + n; 22 return false; 23 } 24 for (int i = 0; i < entries.size(); i++) { 25 if (!(entries.get(i).getIndegree() + entries.get(i).getOutdegree() >= 2)) { 26 result="rule 4 broken: indegree from entrynode with ID: " 27 + entries.get(i).getNewid() + ": " 28 + entries.get(i).getIndegree() + " OutDegree: " 29 + entries.get(i).getOutdegree(); 30 return false; 31 } 32 exnr = 0; 33 for (int j = 0; j < exits.size(); j++) { 34 if (!(exits.get(j).getIndegree() + exits.get(j).getOutdegree() >= 2)) { 35 result="Rule 4 broken, indegree from exitnode with ID: " 36 + exits.get(j).getNewid() + ": " 37 + exits.get(j).getIndegree() + " and outdegree: " 38 + exits.get(j).getOutdegree(); 39 //log.debug(exits.get(j).toString()); 40 return false; 41 } 42 if (entries.get(i).getReachableNodes().contains(exits.get(j))) { 43 exnr++; 44 exits.get(j).increaseEnnr(); 45 } 46 if (exits.get(j).equals(entries.get(i))) { 47 result="Rule 2 broken: node with ID: " 48 + "entries.get(i).getNode().getId()" 49 + "is both entry and exit node"; 50 return false; 51 } 52 } 53 53 54 }55 if (!(exnr >= n - 1)) {56 result="Rule 1 broken";57 return false;58 }59 for (int i = 0; i < exits.size(); i++) {60 if (!(exits.get(i).getEnnr() >= (n - 1))) {61 result="Rule 1 broken, exit node with ID "62 + exits.get(i).getNewid() + "can only reached from "63 + exits.get(i).getEnnr() + " entries.";64 return false;65 }66 }67 result = "Jcheck erfolgreich bestanden";68 return true;69 }70 71 /**72 * gibt das Ergebnis des JChecks in Form als Satz mit Informationen zurück73 * @return74 */75 public String getResult() {76 return result;77 }54 } 55 if (!(exnr >= n - 1)) { 56 result="Rule 1 broken"; 57 return false; 58 } 59 for (int i = 0; i < exits.size(); i++) { 60 if (!(exits.get(i).getEnnr() >= (n - 1))) { 61 result="Rule 1 broken, exit node with ID " 62 + exits.get(i).getNewid() + "can only reached from " 63 + exits.get(i).getEnnr() + " entries."; 64 return false; 65 } 66 } 67 result = "Jcheck erfolgreich bestanden"; 68 return true; 69 } 70 71 /** 72 * gibt das Ergebnis des JChecks in Form als Satz mit Informationen zurück 73 * @return 74 */ 75 public String getResult() { 76 return result; 77 } 78 78 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/junctionchecking/JMinimality.java
r29854 r30725 9 9 import java.util.Iterator; 10 10 import java.util.List; 11 11 12 import org.openstreetmap.josm.gui.progress.ProgressMonitor; 12 13 import org.openstreetmap.josm.plugins.JunctionChecker.datastructure.Channel; … … 21 22 public class JMinimality { 22 23 23 private boolean CheckMinimal = true; 24 private final ArrayList<Channel> E; 25 private final int Grid[][]; 26 private final ArrayList<Channel> OrEn; 27 private final ArrayList<Channel> OrEx; 28 private final int n; 29 private final List<List<Object>> L = new ArrayList<List<Object>>(); //The list of columns to be sorted 30 private long EEovern = 0; 31 private final HashSet<Channel> subgraph = new HashSet<Channel>();//The candidate subgraph to be tested 32 private ProgressMonitor pm; 33 private final boolean pmenabled; 34 private final ArrayList<HashSet<Channel>> junctions = new ArrayList<HashSet<Channel>>(); 35 private final boolean searchFirstJunction; 36 private final ArrayList<Channel> subJunction = new ArrayList<Channel>(); 37 private final JPrepare jprepare; 38 private boolean Check = false; 39 private Iterator<int[]> it; 40 41 42 public JMinimality(int[][] Grid, int n, 43 ArrayList<Channel> E, 44 ArrayList<Channel> entries, 45 ArrayList<Channel> exits, 46 ChannelDiGraph channeldigraph, 47 boolean junctionsearch) { 48 49 this.E = E; 50 this.n = n; 51 this.Grid = Grid; 52 this.OrEn = entries; 53 this.OrEx = exits; 54 this.pmenabled = false; 55 this.searchFirstJunction = junctionsearch; 56 this.jprepare = new JPrepare(channeldigraph); 57 } 58 59 public JMinimality(int[][] Grid, int n, 60 ArrayList<Channel> E, 61 ArrayList<Channel> entries, 62 ArrayList<Channel> exits, 63 ChannelDiGraph channeldigraph, 64 ProgressMonitor pm, 65 boolean junctionsearch) { 66 67 this.E = E; 68 this.n = n; 69 this.Grid = Grid; 70 this.OrEn = entries; 71 this.OrEx = exits; 72 this.pm = pm; 73 this.pmenabled = true; 74 this.searchFirstJunction = junctionsearch; 75 this.jprepare = new JPrepare(channeldigraph); 76 //this.jCheck= new JCheck(); 77 } 78 79 public void GenerateSubcolumns () {/*Generates all combinations of subcolumns in the grid*/ 80 if (pmenabled) { 81 pm.setCustomText(tr ("generate all combinations from entrie/exit candidates")); 82 } 83 84 Combination c = new Combination(Grid.length, n); 85 EEovern = (int) Combination.Choose(Grid.length*Grid.length, n*n); 86 long ans = c.Choose(); //This is the number of subcolumns to be generated 87 int[][] v; // this is a column variable containing n y-index entries plus true false values (0/1) 88 List<Object> C; //The column is packed together with 2 indices into this variable 89 for (int i = 0; i < Grid.length;i++) { 90 int h = 0; //this is the index denoting the "n out of Grid.length"- combination, indicating a subcolumn of length n 91 do { 92 int missing = 0; 93 C = new ArrayList<Object>(3); 94 v = new int[n][2]; 95 C.add(i);//the first position of column variable C is the column index 96 C.add(h);//the second is the entry-subset index 97 for(int t = 0; t < c.data.length; t++){ 98 if (Grid[(int)c.data[t]][i] == 0){ 99 missing++; 100 v[t][1]= 0; //false 101 } 102 else{ 103 v[t][1]= 1; 104 } //true 105 v[t][0]=(int)c.data[t]; //Write a y index of the combination into column 106 } 107 if (missing <=1){//If column has at most one missing entry 108 C.add(v);//insert column as the third position of column variable C 109 L.add(C); //Insert C in list to be ordered 110 } 111 h++; //Iterate through all subcolumns 112 if (h < ans){c = c.Successor();}//generate the next combination 113 }while(h < ans); 114 c = new Combination(Grid.length, n); //For each original column in the grid, generate new subcolumns 115 } 116 Collections.sort(L, new Comparator<List<Object>>() { 24 private boolean CheckMinimal = true; 25 private final ArrayList<Channel> E; 26 private final int Grid[][]; 27 private final ArrayList<Channel> OrEn; 28 private final ArrayList<Channel> OrEx; 29 private final int n; 30 private final List<List<Object>> L = new ArrayList<List<Object>>(); //The list of columns to be sorted 31 private long EEovern = 0; 32 private final HashSet<Channel> subgraph = new HashSet<Channel>();//The candidate subgraph to be tested 33 private ProgressMonitor pm; 34 private final boolean pmenabled; 35 private final ArrayList<HashSet<Channel>> junctions = new ArrayList<HashSet<Channel>>(); 36 private final boolean searchFirstJunction; 37 private final ArrayList<Channel> subJunction = new ArrayList<Channel>(); 38 private final JPrepare jprepare; 39 private boolean Check = false; 40 private Iterator<int[]> it; 41 42 43 public JMinimality(int[][] Grid, int n, 44 ArrayList<Channel> E, 45 ArrayList<Channel> entries, 46 ArrayList<Channel> exits, 47 ChannelDiGraph channeldigraph, 48 boolean junctionsearch) { 49 50 this.E = E; 51 this.n = n; 52 this.Grid = Grid; 53 this.OrEn = entries; 54 this.OrEx = exits; 55 this.pmenabled = false; 56 this.searchFirstJunction = junctionsearch; 57 this.jprepare = new JPrepare(channeldigraph); 58 } 59 60 public JMinimality(int[][] Grid, int n, 61 ArrayList<Channel> E, 62 ArrayList<Channel> entries, 63 ArrayList<Channel> exits, 64 ChannelDiGraph channeldigraph, 65 ProgressMonitor pm, 66 boolean junctionsearch) { 67 68 this.E = E; 69 this.n = n; 70 this.Grid = Grid; 71 this.OrEn = entries; 72 this.OrEx = exits; 73 this.pm = pm; 74 this.pmenabled = true; 75 this.searchFirstJunction = junctionsearch; 76 this.jprepare = new JPrepare(channeldigraph); 77 //this.jCheck= new JCheck(); 78 } 79 80 public void GenerateSubcolumns () {/*Generates all combinations of subcolumns in the grid*/ 81 if (pmenabled) { 82 pm.setCustomText(tr ("generate all combinations from entrie/exit candidates")); 83 } 84 85 Combination c = new Combination(Grid.length, n); 86 EEovern = (int) Combination.Choose(Grid.length*Grid.length, n*n); 87 long ans = c.Choose(); //This is the number of subcolumns to be generated 88 int[][] v; // this is a column variable containing n y-index entries plus true false values (0/1) 89 List<Object> C; //The column is packed together with 2 indices into this variable 90 for (int i = 0; i < Grid.length;i++) { 91 int h = 0; //this is the index denoting the "n out of Grid.length"- combination, indicating a subcolumn of length n 92 do { 93 int missing = 0; 94 C = new ArrayList<Object>(3); 95 v = new int[n][2]; 96 C.add(i);//the first position of column variable C is the column index 97 C.add(h);//the second is the entry-subset index 98 for(int t = 0; t < c.data.length; t++){ 99 if (Grid[(int)c.data[t]][i] == 0){ 100 missing++; 101 v[t][1]= 0; //false 102 } 103 else{ 104 v[t][1]= 1; 105 } //true 106 v[t][0]=(int)c.data[t]; //Write a y index of the combination into column 107 } 108 if (missing <=1){//If column has at most one missing entry 109 C.add(v);//insert column as the third position of column variable C 110 L.add(C); //Insert C in list to be ordered 111 } 112 h++; //Iterate through all subcolumns 113 if (h < ans){c = c.Successor();}//generate the next combination 114 }while(h < ans); 115 c = new Combination(Grid.length, n); //For each original column in the grid, generate new subcolumns 116 } 117 Collections.sort(L, new Comparator<List<Object>>() { 118 @Override 117 119 public int compare(List<Object> o1, List<Object> o2) { 118 return (Integer)o1.get(1) - (Integer)o2.get(1); //sort according to h index in each column119 }});120 }121 122 public boolean IterateThroughKn() {//Iterates through all K_{n-1} subgrids of the Grid and tests them123 if (L.size()==0) {124 return true;125 }126 if (pmenabled) {127 pm.setTicksCount(L.size());128 pm.setCustomText("Iterates through all K_{n-1} subgrids of the Grid and tests them");129 }130 Combination c;131 Iterator<List<Object>> l = L.listIterator();132 List<Object> C;133 ArrayList<int[]> CandidateK = new ArrayList<int[]>(n*n); //saves the candidate K_{n-1} in entry-exit pairs134 long lindex= 0;135 int h = 0;136 int m = 0;137 int[][] v;138 int x_i;139 int y_j;140 int progressmonitorcounter = 1;141 boolean mchanged = false;142 boolean hchanged = false;143 C = l.next();144 do{ //Loop over list of columns L145 if (mchanged){146 C = l.next(); //Iterator in L147 lindex++; //Index in L148 if (hchanged) {149 m=1;150 hchanged = false;151 }152 }153 if ((Integer)C.get(1)==h && l.hasNext()){ //m counts the set of columns with index h154 m++;155 mchanged = true;156 }157 else{158 if (l.hasNext()==false){159 m++;lindex++;160 } //At the end of L, counter are set one up161 c = new Combination(m, n);162 long ans = c.Choose();163 int missing = 0;164 boolean smallerjunction = false;165 for (int k =0; k<ans;k++){ //Makes sure that subset of m columns contains an n*n subgrid, because ans = m over n would be 0 otherwise166 for (int y = 0; y < n; y++){//Iterates over all rows of subgrid k167 missing =0;//test = "";168 for (int x = 0; x <c.data.length;x++) { //Iterates over all columns of subgrid k169 x_i=((Integer)L.get((int)(lindex-m+c.data[x])).get(0));//columnindex in grid170 v=((int[][])(L.get((int)(lindex-m+c.data[x])).get(2))); //subcolumn of grid171 y_j= v[y][0]; //rowindex in grid172 if (v[y][1]==0){173 missing++;174 }else{175 CandidateK.add(new int[]{y_j,x_i});176 }//save entry/exit tuple177 if (smallerjunction == false && ((!OrEn.contains(E.get(v[y][0]))) &&(!OrEx.contains(E.get(x_i))))){ // Tests, whether y or x is not an original entry/exit178 smallerjunction = true; //Then k identifies a different junction than the original one179 }180 //test = test+" ("+y_j+", "+x_i+", "+v[y][1]+")";181 }182 if (missing > 1){183 break;184 }//If a row has more than one missing value, break185 }186 if (missing <=1 && smallerjunction == true){//The k-subgrid is a different junction candidate satisfying total reachability187 CheckMinimal = CheckSmallJunction(CandidateK)==false;// If the candidate is a smaller junction, then minimality is false188 //log.info("durchlauf: " + durchlauf + " Wert von CheckMinimal: " + CheckMinimal);189 if (!CheckMinimal) {190 break;191 }192 }193 CandidateK.clear();194 if (k+1 < ans){c = c.Successor();} //Produces the m over n combinations195 }196 m=1; //Sets m to the first column with next index h+1197 h++;198 mchanged = false;199 hchanged = true;200 }201 if (pmenabled) {202 progressmonitorcounter++;203 pm.setTicks(progressmonitorcounter);204 }205 }206 while(l.hasNext() && CheckMinimal);207 return CheckMinimal;208 }209 210 /**211 * gibt true zurück, wenn Kandidat eine Kreuzung ist, aber nicht, wenn junctionsearch auf true gesetzt ist212 * @param CandidateK213 * @return214 */215 public boolean CheckSmallJunction(ArrayList<int[]> CandidateK){216 Check = false;217 subgraph.clear();//Zu konstruierender Subgraph218 it = CandidateK.iterator();219 //Reconstruct small Junction from paths220 while (it.hasNext()){221 int[]point = it.next();222 for (int j = 0; j < E.get(point[0]).getReachableNodes().size(); j++) {223 if(E.get(point[0]).getReachableNodeAt(j).equals(E.get(point[1]))){224 subgraph.addAll(E.get(point[0]).getPathsAt(E.get(point[0]).getReachableNodeAt(j)));225 subgraph.add(E.get(point[0]));226 }227 }228 }229 jprepare.jPrepare(new ArrayList<Channel>(subgraph));230 JCheck jCheck = new JCheck();231 Check = jCheck.jCheck(jprepare.getEntries(), jprepare.getExits(), n);232 jprepare.resetSubgraph();233 if (Check) {234 subJunction.clear();235 subJunction.addAll(subgraph);236 //soll mehr als ein Kandidat gesucht werden? Dann Kandidaten speichern und Check wieder auf false stellen, damit die Hauptschleife weitergeht237 if (!searchFirstJunction) {238 boolean isin = false;239 for (int i = 0; i < junctions.size(); i++) {240 //log.debug("Kreuzung " + i +" hat Channels: " + junctions.get(i).size() + " subgraph: " + subgraph.size());241 if (junctions.get(i).size() == subgraph.size()) {242 Iterator<Channel> it = subgraph.iterator();243 isin = true;244 while (it.hasNext()) {245 if (!junctions.get(i).contains(it.next())) {246 isin = false;247 //log.info("nicht drin");248 }249 }250 }251 }252 if (isin == false) {253 junctions.add(new HashSet<Channel>(subgraph));254 //log.info("Kreuzungskandidat der Liste zugefügt" + junctions.size());255 }256 Check = false;257 }258 }259 return Check;260 }261 262 /**263 * enthält alle Channels des zuletzt durchlaufenden Kreuzungskandidaten (muß keine gültige Kreuzung sein)264 * @return265 */266 public ArrayList<Channel> getSubJunctionCandidate(){267 return new ArrayList<Channel>(subgraph);268 }269 270 /**271 * gibt alle gefundenen Kreuzungskandidaten zurück (ist leer, wenn junctionsearch auf true gesetzt wurde)272 * @return273 */274 public ArrayList<HashSet<Channel>> getJunctionCandidates() {275 return junctions;276 }120 return (Integer)o1.get(1) - (Integer)o2.get(1); //sort according to h index in each column 121 }}); 122 } 123 124 public boolean IterateThroughKn() {//Iterates through all K_{n-1} subgrids of the Grid and tests them 125 if (L.size()==0) { 126 return true; 127 } 128 if (pmenabled) { 129 pm.setTicksCount(L.size()); 130 pm.setCustomText("Iterates through all K_{n-1} subgrids of the Grid and tests them"); 131 } 132 Combination c; 133 Iterator<List<Object>> l = L.listIterator(); 134 List<Object> C; 135 ArrayList<int[]> CandidateK = new ArrayList<int[]>(n*n); //saves the candidate K_{n-1} in entry-exit pairs 136 long lindex= 0; 137 int h = 0; 138 int m = 0; 139 int[][] v; 140 int x_i; 141 int y_j; 142 int progressmonitorcounter = 1; 143 boolean mchanged = false; 144 boolean hchanged = false; 145 C = l.next(); 146 do{ //Loop over list of columns L 147 if (mchanged){ 148 C = l.next(); //Iterator in L 149 lindex++; //Index in L 150 if (hchanged) { 151 m=1; 152 hchanged = false; 153 } 154 } 155 if ((Integer)C.get(1)==h && l.hasNext()){ //m counts the set of columns with index h 156 m++; 157 mchanged = true; 158 } 159 else{ 160 if (l.hasNext()==false){ 161 m++;lindex++; 162 } //At the end of L, counter are set one up 163 c = new Combination(m, n); 164 long ans = c.Choose(); 165 int missing = 0; 166 boolean smallerjunction = false; 167 for (int k =0; k<ans;k++){ //Makes sure that subset of m columns contains an n*n subgrid, because ans = m over n would be 0 otherwise 168 for (int y = 0; y < n; y++){//Iterates over all rows of subgrid k 169 missing =0; //test = ""; 170 for (int x = 0; x <c.data.length;x++) { //Iterates over all columns of subgrid k 171 x_i=((Integer)L.get((int)(lindex-m+c.data[x])).get(0));//columnindex in grid 172 v=((int[][])(L.get((int)(lindex-m+c.data[x])).get(2))); //subcolumn of grid 173 y_j= v[y][0]; //rowindex in grid 174 if (v[y][1]==0){ 175 missing++; 176 }else{ 177 CandidateK.add(new int[]{y_j,x_i}); 178 }//save entry/exit tuple 179 if (smallerjunction == false && ((!OrEn.contains(E.get(v[y][0]))) &&(!OrEx.contains(E.get(x_i))))){ // Tests, whether y or x is not an original entry/exit 180 smallerjunction = true; //Then k identifies a different junction than the original one 181 } 182 //test = test+" ("+y_j+", "+x_i+", "+v[y][1]+")"; 183 } 184 if (missing > 1){ 185 break; 186 }//If a row has more than one missing value, break 187 } 188 if (missing <=1 && smallerjunction == true){//The k-subgrid is a different junction candidate satisfying total reachability 189 CheckMinimal = CheckSmallJunction(CandidateK)==false;// If the candidate is a smaller junction, then minimality is false 190 //log.info("durchlauf: " + durchlauf + " Wert von CheckMinimal: " + CheckMinimal); 191 if (!CheckMinimal) { 192 break; 193 } 194 } 195 CandidateK.clear(); 196 if (k+1 < ans){c = c.Successor();} //Produces the m over n combinations 197 } 198 m=1; //Sets m to the first column with next index h+1 199 h++; 200 mchanged = false; 201 hchanged = true; 202 } 203 if (pmenabled) { 204 progressmonitorcounter++; 205 pm.setTicks(progressmonitorcounter); 206 } 207 } 208 while(l.hasNext() && CheckMinimal); 209 return CheckMinimal; 210 } 211 212 /** 213 * gibt true zurück, wenn Kandidat eine Kreuzung ist, aber nicht, wenn junctionsearch auf true gesetzt ist 214 * @param CandidateK 215 * @return 216 */ 217 public boolean CheckSmallJunction(ArrayList<int[]> CandidateK){ 218 Check = false; 219 subgraph.clear();//Zu konstruierender Subgraph 220 it = CandidateK.iterator(); 221 //Reconstruct small Junction from paths 222 while (it.hasNext()){ 223 int[]point = it.next(); 224 for (int j = 0; j < E.get(point[0]).getReachableNodes().size(); j++) { 225 if(E.get(point[0]).getReachableNodeAt(j).equals(E.get(point[1]))){ 226 subgraph.addAll(E.get(point[0]).getPathsAt(E.get(point[0]).getReachableNodeAt(j))); 227 subgraph.add(E.get(point[0])); 228 } 229 } 230 } 231 jprepare.jPrepare(new ArrayList<Channel>(subgraph)); 232 JCheck jCheck = new JCheck(); 233 Check = jCheck.jCheck(jprepare.getEntries(), jprepare.getExits(), n); 234 jprepare.resetSubgraph(); 235 if (Check) { 236 subJunction.clear(); 237 subJunction.addAll(subgraph); 238 //soll mehr als ein Kandidat gesucht werden? Dann Kandidaten speichern und Check wieder auf false stellen, damit die Hauptschleife weitergeht 239 if (!searchFirstJunction) { 240 boolean isin = false; 241 for (int i = 0; i < junctions.size(); i++) { 242 //log.debug("Kreuzung " + i +" hat Channels: " + junctions.get(i).size() + " subgraph: " + subgraph.size()); 243 if (junctions.get(i).size() == subgraph.size()) { 244 Iterator<Channel> it = subgraph.iterator(); 245 isin = true; 246 while (it.hasNext()) { 247 if (!junctions.get(i).contains(it.next())) { 248 isin = false; 249 //log.info("nicht drin"); 250 } 251 } 252 } 253 } 254 if (isin == false) { 255 junctions.add(new HashSet<Channel>(subgraph)); 256 //log.info("Kreuzungskandidat der Liste zugefügt" + junctions.size()); 257 } 258 Check = false; 259 } 260 } 261 return Check; 262 } 263 264 /** 265 * enthält alle Channels des zuletzt durchlaufenden Kreuzungskandidaten (muß keine gültige Kreuzung sein) 266 * @return 267 */ 268 public ArrayList<Channel> getSubJunctionCandidate(){ 269 return new ArrayList<Channel>(subgraph); 270 } 271 272 /** 273 * gibt alle gefundenen Kreuzungskandidaten zurück (ist leer, wenn junctionsearch auf true gesetzt wurde) 274 * @return 275 */ 276 public ArrayList<HashSet<Channel>> getJunctionCandidates() { 277 return junctions; 278 } 277 279 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/junctionchecking/JPrepare.java
r25501 r30725 11 11 public class JPrepare { 12 12 13 private final ArrayList<Channel> entries;14 private final ArrayList<Channel> exits;15 private ArrayList<Channel> vertices;16 private final ChannelDiGraph digraph;13 private final ArrayList<Channel> entries; 14 private final ArrayList<Channel> exits; 15 private ArrayList<Channel> vertices; 16 private final ChannelDiGraph digraph; 17 17 18 public JPrepare(ChannelDiGraph digraph) {19 entries = new ArrayList<Channel>();20 exits = new ArrayList<Channel>();21 this.digraph = digraph;22 }18 public JPrepare(ChannelDiGraph digraph) { 19 entries = new ArrayList<Channel>(); 20 exits = new ArrayList<Channel>(); 21 this.digraph = digraph; 22 } 23 23 24 public void jPrepare (ArrayList<Channel> vertices) {25 this.vertices = vertices;26 entries.clear();27 exits.clear();24 public void jPrepare (ArrayList<Channel> vertices) { 25 this.vertices = vertices; 26 entries.clear(); 27 exits.clear(); 28 28 29 /*TODO: kann weg?30 digraph.ereaseChannelsInDegree();31 digraph.ereaseChannelsOutDegree();32 digraph.ereaseChannelsSubgraph();33 */34 for (int i = 0; i < vertices.size(); i++) {35 vertices.get(i).setSubgraph(true);36 }37 for (int i = 0; i < vertices.size(); i++) {38 for (int j = 0; j < vertices.get(i).getPredChannels().size(); j++) {39 if (vertices.get(i).getPredChannels().get(j).isSubgraph() == false ) {40 if (!entries.contains(vertices.get(i))) {41 entries.add(vertices.get(i));42 }43 }44 else {45 vertices.get(i).countupIndegree();46 //log.trace(vertices.get(i).toString());47 }48 }49 for (int j = 0; j < vertices.get(i).getLeadsTo().size(); j++) {50 if (vertices.get(i).getLeadsTo().get(j).getToChannel().isSubgraph() == false) {51 if (!exits.contains(vertices.get(i))) {52 exits.add(vertices.get(i));53 }54 }55 else {56 vertices.get(i).countupOutdegree();57 }58 }59 }60 }29 /*TODO: kann weg? 30 digraph.ereaseChannelsInDegree(); 31 digraph.ereaseChannelsOutDegree(); 32 digraph.ereaseChannelsSubgraph(); 33 */ 34 for (int i = 0; i < vertices.size(); i++) { 35 vertices.get(i).setSubgraph(true); 36 } 37 for (int i = 0; i < vertices.size(); i++) { 38 for (int j = 0; j < vertices.get(i).getPredChannels().size(); j++) { 39 if (vertices.get(i).getPredChannels().get(j).isSubgraph() == false ) { 40 if (!entries.contains(vertices.get(i))) { 41 entries.add(vertices.get(i)); 42 } 43 } 44 else { 45 vertices.get(i).countupIndegree(); 46 //log.trace(vertices.get(i).toString()); 47 } 48 } 49 for (int j = 0; j < vertices.get(i).getLeadsTo().size(); j++) { 50 if (vertices.get(i).getLeadsTo().get(j).getToChannel().isSubgraph() == false) { 51 if (!exits.contains(vertices.get(i))) { 52 exits.add(vertices.get(i)); 53 } 54 } 55 else { 56 vertices.get(i).countupOutdegree(); 57 } 58 } 59 } 60 } 61 61 62 public void resetSubgraph(){63 for (int i = 0; i < vertices.size(); i++) {64 vertices.get(i).setSubgraph(false);65 vertices.get(i).setIndegree(0);66 vertices.get(i).setOutdegree(0);67 }68 }62 public void resetSubgraph(){ 63 for (int i = 0; i < vertices.size(); i++) { 64 vertices.get(i).setSubgraph(false); 65 vertices.get(i).setIndegree(0); 66 vertices.get(i).setOutdegree(0); 67 } 68 } 69 69 70 /**71 * gibt die Anzahl der gefundenen Eingänge zurück72 * @return73 */74 public ArrayList<Channel> getEntries() {75 return entries;76 }70 /** 71 * gibt die Anzahl der gefundenen Eingänge zurück 72 * @return 73 */ 74 public ArrayList<Channel> getEntries() { 75 return entries; 76 } 77 77 78 /**79 * gibt die Anzahl der gefundenen Ausgänge zurück80 * @return81 */82 public ArrayList<Channel> getExits() {83 return exits;84 }78 /** 79 * gibt die Anzahl der gefundenen Ausgänge zurück 80 * @return 81 */ 82 public ArrayList<Channel> getExits() { 83 return exits; 84 } 85 85 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/junctionchecking/JProcess.java
r25501 r30725 14 14 public class JProcess { 15 15 16 private ArrayList<Channel> vertices;17 private ChannelDiGraph digraph;18 private TRDFS trdfs;19 private BackPropagation backpropagation;20 private ArrayList<LeadsTo> cycleEdges;16 private ArrayList<Channel> vertices; 17 private ChannelDiGraph digraph; 18 private TRDFS trdfs; 19 private BackPropagation backpropagation; 20 private ArrayList<LeadsTo> cycleEdges; 21 21 22 public JProcess(ArrayList<Channel> subgraph, ChannelDiGraph digraph) {23 this.digraph = digraph;24 this.vertices = subgraph;25 this.trdfs = new TRDFS(vertices, digraph);26 this.backpropagation = new BackPropagation(digraph);27 }22 public JProcess(ArrayList<Channel> subgraph, ChannelDiGraph digraph) { 23 this.digraph = digraph; 24 this.vertices = subgraph; 25 this.trdfs = new TRDFS(vertices, digraph); 26 this.backpropagation = new BackPropagation(digraph); 27 } 28 28 29 /**30 * ruft den TR-DFS und danach den Backpropagation-Algorithmus auf jPrepare31 * muß vorher durchgelaufen sein (die Eingänge müssen bekannt sein)32 *33 * @param entries34 */35 public void jProcess(ArrayList<Channel> entries) {36 ArrayList<Channel> nodes = digraph.getChannels();37 // alle Knoten des Subgraphen auf unbesucht stellen und38 // die evtl. gespeicherten erreichbaren Knoten löschen39 for (int i = 0; i < nodes.size(); i++) {40 nodes.get(i).setVisited(BacktrackingColors.WHITE);41 nodes.get(i).ereaseReachableNodes();42 }43 // alle Kanten auf keine ForwardEdge stellen44 for (int i = 0; i < digraph.getLeadsTo().size(); i++) {45 digraph.getLeadsTo().get(i).setForwardEdge(false);46 }47 trdfs.ereaseCycleEdges();29 /** 30 * ruft den TR-DFS und danach den Backpropagation-Algorithmus auf jPrepare 31 * muß vorher durchgelaufen sein (die Eingänge müssen bekannt sein) 32 * 33 * @param entries 34 */ 35 public void jProcess(ArrayList<Channel> entries) { 36 ArrayList<Channel> nodes = digraph.getChannels(); 37 // alle Knoten des Subgraphen auf unbesucht stellen und 38 // die evtl. gespeicherten erreichbaren Knoten löschen 39 for (int i = 0; i < nodes.size(); i++) { 40 nodes.get(i).setVisited(BacktrackingColors.WHITE); 41 nodes.get(i).ereaseReachableNodes(); 42 } 43 // alle Kanten auf keine ForwardEdge stellen 44 for (int i = 0; i < digraph.getLeadsTo().size(); i++) { 45 digraph.getLeadsTo().get(i).setForwardEdge(false); 46 } 47 trdfs.ereaseCycleEdges(); 48 48 49 for (int i = 0; i < entries.size(); i++) {50 if (entries.get(i).getVisited() == BacktrackingColors.WHITE) {51 trdfs.trdfs(entries.get(i));52 }53 }54 cycleEdges = trdfs.getCycleEdges();55 for (int j = 0; j < cycleEdges.size(); j++) {56 backpropagation.backPropagation(cycleEdges.get(j).getFromChannel(),57 cycleEdges.get(j).getToChannel(), cycleEdges.get(j).getToChannel());58 }59 }49 for (int i = 0; i < entries.size(); i++) { 50 if (entries.get(i).getVisited() == BacktrackingColors.WHITE) { 51 trdfs.trdfs(entries.get(i)); 52 } 53 } 54 cycleEdges = trdfs.getCycleEdges(); 55 for (int j = 0; j < cycleEdges.size(); j++) { 56 backpropagation.backPropagation(cycleEdges.get(j).getFromChannel(), 57 cycleEdges.get(j).getToChannel(), cycleEdges.get(j).getToChannel()); 58 } 59 } 60 60 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/junctionchecking/JunctionChecker.java
r30532 r30725 17 17 public class JunctionChecker { 18 18 19 private ArrayList<Channel> subgraph;20 private ArrayList<Channel> entries;21 private ArrayList<Channel> exits;22 private ArrayList<Channel> cycleedges;23 private ArrayList<Channel> subjunction;24 private int n;25 private final JPrepare jPrepare;26 private JProcess jProcess;27 private final ChannelDiGraph channeldigraph;28 private final JCheck jCheck;29 private ArrayList<Channel> E;30 private int Grid[][];31 private boolean Check;32 private boolean smallerJunction;33 private JMinimality m;34 // Variable wird beim KreuzungsSuchen benutzt, sonst ist sie leer!35 private ArrayList<HashSet<Channel>> junctions = new ArrayList<HashSet<Channel>>();36 //dient zur Zeitmessung37 private long startIterate = 0;38 private long stopIterate = 0;39 private long startGenerate = 0;40 41 public JunctionChecker(ChannelDiGraph channeldigraph, int n) {42 this.jPrepare = new JPrepare(channeldigraph);43 this.channeldigraph = channeldigraph;44 this.n = n;45 this.jCheck = new JCheck();46 this.subjunction = new ArrayList<Channel>();47 smallerJunction = false;48 }49 50 /**51 * startet das Überprüfen einer Teilmenge auf die Kreuzungskriterien52 * @param subgraph53 * @param pm54 */55 public void checkjunctions(ArrayList<Channel> subgraph, ProgressMonitor pm) {56 jPrepare.jPrepare(subgraph);57 entries = jPrepare.getEntries();58 exits = jPrepare.getExits();59 jProcess = new JProcess(subgraph, channeldigraph);60 jProcess.jProcess(jPrepare.getEntries());61 boolean result = jCheck.jCheck(entries, exits, n);62 //jPrepare.resetSubgraph();63 if (result == true) {64 this.collectECandidates(subgraph);65 this.ConstructGrid();66 m = new JMinimality(Grid, n, E, entries, exits, channeldigraph, pm,67 true);68 m.GenerateSubcolumns();69 Check = m.IterateThroughKn();70 if (!Check) {71 smallerJunction = true;72 }73 subjunction = m.getSubJunctionCandidate();74 } else {75 Check = false;76 }77 }78 79 /**80 * Diese Methode wird aufgerufen, wenn nach Kreuzungen in einer Teilmenge81 * gesucht werden soll82 *83 * @param subgraph84 * @param firstjunction soll nur die erste mögliche Kreuzung ausgegeben werden oder alle85 */86 public void junctionSearch(ArrayList<Channel> subgraph, ProgressMonitor pm) {87 jPrepare.jPrepare(subgraph);88 entries = jPrepare.getEntries();89 exits = jPrepare.getExits();90 jProcess = new JProcess(subgraph, channeldigraph);91 jProcess.jProcess(jPrepare.getEntries());92 this.collectECandidates(subgraph);93 this.ConstructGrid();94 jPrepare.resetSubgraph();95 m = new JMinimality(Grid, n, E, new ArrayList<Channel>(), new ArrayList<Channel>(), channeldigraph, pm, false);96 m.GenerateSubcolumns();97 Check = m.IterateThroughKn();98 junctions = checkJunctionCandidates(m.getJunctionCandidates());99 }100 101 public void junctionSearch(ArrayList<Channel> subgraph) {102 jPrepare.jPrepare(subgraph);103 entries = jPrepare.getEntries();104 exits = jPrepare.getExits();105 jProcess = new JProcess(subgraph, channeldigraph);106 jProcess.jProcess(jPrepare.getEntries());107 this.collectECandidates(subgraph);108 this.ConstructGrid();109 jPrepare.resetSubgraph();110 m = new JMinimality(Grid, n, E, new ArrayList<Channel>(), new ArrayList<Channel>(), channeldigraph, false);111 startGenerate = System.currentTimeMillis();112 m.GenerateSubcolumns();113 startIterate = System.currentTimeMillis();114 Check = m.IterateThroughKn();115 stopIterate = System.currentTimeMillis();116 junctions = checkJunctionCandidates(m.getJunctionCandidates());117 }118 119 /**120 * Überprüft die Kreuzunskandidaten, die JMinimality gefunden hat, welche davon eine Kreuzung darstellen (eine Kreuzung121 * darf keine weiteren Kreuzungen enthalten)122 */123 private ArrayList<HashSet<Channel>> checkJunctionCandidates(ArrayList<HashSet<Channel>> junctioncandidates){124 @SuppressWarnings("unchecked")19 private ArrayList<Channel> subgraph; 20 private ArrayList<Channel> entries; 21 private ArrayList<Channel> exits; 22 private ArrayList<Channel> cycleedges; 23 private ArrayList<Channel> subjunction; 24 private int n; 25 private final JPrepare jPrepare; 26 private JProcess jProcess; 27 private final ChannelDiGraph channeldigraph; 28 private final JCheck jCheck; 29 private ArrayList<Channel> E; 30 private int Grid[][]; 31 private boolean Check; 32 private boolean smallerJunction; 33 private JMinimality m; 34 // Variable wird beim KreuzungsSuchen benutzt, sonst ist sie leer! 35 private ArrayList<HashSet<Channel>> junctions = new ArrayList<HashSet<Channel>>(); 36 //dient zur Zeitmessung 37 private long startIterate = 0; 38 private long stopIterate = 0; 39 private long startGenerate = 0; 40 41 public JunctionChecker(ChannelDiGraph channeldigraph, int n) { 42 this.jPrepare = new JPrepare(channeldigraph); 43 this.channeldigraph = channeldigraph; 44 this.n = n; 45 this.jCheck = new JCheck(); 46 this.subjunction = new ArrayList<Channel>(); 47 smallerJunction = false; 48 } 49 50 /** 51 * startet das Überprüfen einer Teilmenge auf die Kreuzungskriterien 52 * @param subgraph 53 * @param pm 54 */ 55 public void checkjunctions(ArrayList<Channel> subgraph, ProgressMonitor pm) { 56 jPrepare.jPrepare(subgraph); 57 entries = jPrepare.getEntries(); 58 exits = jPrepare.getExits(); 59 jProcess = new JProcess(subgraph, channeldigraph); 60 jProcess.jProcess(jPrepare.getEntries()); 61 boolean result = jCheck.jCheck(entries, exits, n); 62 //jPrepare.resetSubgraph(); 63 if (result == true) { 64 this.collectECandidates(subgraph); 65 this.ConstructGrid(); 66 m = new JMinimality(Grid, n, E, entries, exits, channeldigraph, pm, 67 true); 68 m.GenerateSubcolumns(); 69 Check = m.IterateThroughKn(); 70 if (!Check) { 71 smallerJunction = true; 72 } 73 subjunction = m.getSubJunctionCandidate(); 74 } else { 75 Check = false; 76 } 77 } 78 79 /** 80 * Diese Methode wird aufgerufen, wenn nach Kreuzungen in einer Teilmenge 81 * gesucht werden soll 82 * 83 * @param subgraph 84 * @param firstjunction soll nur die erste mögliche Kreuzung ausgegeben werden oder alle 85 */ 86 public void junctionSearch(ArrayList<Channel> subgraph, ProgressMonitor pm) { 87 jPrepare.jPrepare(subgraph); 88 entries = jPrepare.getEntries(); 89 exits = jPrepare.getExits(); 90 jProcess = new JProcess(subgraph, channeldigraph); 91 jProcess.jProcess(jPrepare.getEntries()); 92 this.collectECandidates(subgraph); 93 this.ConstructGrid(); 94 jPrepare.resetSubgraph(); 95 m = new JMinimality(Grid, n, E, new ArrayList<Channel>(), new ArrayList<Channel>(), channeldigraph, pm, false); 96 m.GenerateSubcolumns(); 97 Check = m.IterateThroughKn(); 98 junctions = checkJunctionCandidates(m.getJunctionCandidates()); 99 } 100 101 public void junctionSearch(ArrayList<Channel> subgraph) { 102 jPrepare.jPrepare(subgraph); 103 entries = jPrepare.getEntries(); 104 exits = jPrepare.getExits(); 105 jProcess = new JProcess(subgraph, channeldigraph); 106 jProcess.jProcess(jPrepare.getEntries()); 107 this.collectECandidates(subgraph); 108 this.ConstructGrid(); 109 jPrepare.resetSubgraph(); 110 m = new JMinimality(Grid, n, E, new ArrayList<Channel>(), new ArrayList<Channel>(), channeldigraph, false); 111 startGenerate = System.currentTimeMillis(); 112 m.GenerateSubcolumns(); 113 startIterate = System.currentTimeMillis(); 114 Check = m.IterateThroughKn(); 115 stopIterate = System.currentTimeMillis(); 116 junctions = checkJunctionCandidates(m.getJunctionCandidates()); 117 } 118 119 /** 120 * Überprüft die Kreuzunskandidaten, die JMinimality gefunden hat, welche davon eine Kreuzung darstellen (eine Kreuzung 121 * darf keine weiteren Kreuzungen enthalten) 122 */ 123 private ArrayList<HashSet<Channel>> checkJunctionCandidates(ArrayList<HashSet<Channel>> junctioncandidates){ 124 @SuppressWarnings("unchecked") 125 125 ArrayList<HashSet<Channel>> junctions = (ArrayList<HashSet<Channel>>) junctioncandidates.clone(); 126 for (int i = 0; i < junctioncandidates.size(); i++) {127 for (int j = 0; j < junctioncandidates.size(); j++) {128 if (junctioncandidates.get(i).containsAll(junctioncandidates.get(j))) {129 junctions.removeAll(junctioncandidates.get(i));130 }131 else {132 }133 }134 }135 return junctions;136 }137 138 139 private void collectECandidates(ArrayList<Channel> subgraph) {140 E = new ArrayList<Channel>();141 for (int i = 0; i < subgraph.size(); i++) {142 if ((subgraph.get(i).getIndegree() + subgraph.get(i).getOutdegree() >= 3)143 || entries.contains(subgraph.get(i))144 || exits.contains(subgraph.get(i))) {145 E.add(subgraph.get(i));146 }147 }148 }149 150 private void ConstructGrid() {151 Grid = new int[E.size()][E.size()];152 for (int y = 0; y < E.size(); y++) {153 for (int x = 0; x < E.size(); x++) {154 if (x != y && !(entries.contains(E.get(x)))155 && !(exits.contains(E.get(y)))156 && E.get(y).getReachableNodes().contains(E.get(x))) {157 Grid[y][x] = 1;158 //log.trace("Grid-Position auf 1 gesetzT (y/x): " + y + ":"159 //+ x + "(Entry/exit):" + E.get(y).getNewid() + ":" +160 //E.get(x).getNewid());161 } else {162 Grid[y][x] = 0;163 }164 }165 }166 }167 168 public long getMeasuredIterateTime() {169 return (stopIterate - startIterate);170 }171 172 public long getMeasuredGenerateTime() {173 return (startIterate - startGenerate);174 }175 176 public ArrayList<Channel> getSubgraph() {177 return subgraph;178 }179 180 public void setSubgraph(ArrayList<Channel> subgraph) {181 this.subgraph = subgraph;182 }183 184 public ArrayList<Channel> getEntries() {185 return entries;186 }187 188 public void setEntries(ArrayList<Channel> entries) {189 this.entries = entries;190 }191 192 public ArrayList<Channel> getExits() {193 return exits;194 }195 196 public void setExits(ArrayList<Channel> exits) {197 this.exits = exits;198 }199 200 public ArrayList<Channel> getCycleedges() {201 return cycleedges;202 }203 204 public void setCycleedges(ArrayList<Channel> cycleedges) {205 this.cycleedges = cycleedges;206 }207 208 public int getN() {209 return n;210 }211 212 public void setN(int n) {213 this.n = n;214 }215 216 /**217 * gibt die kleinere, gefundene Kreuzung zurück (wenn es sie gibt)218 *219 * @return220 */221 public ArrayList<Channel> getSubJunction() {222 return subjunction;223 }224 225 /**226 * gibt das Ergebnis des JCheck zurück (bei false keine generelle Aussage227 * möglich)228 *229 * @return false = keine Kreuzung ODER enthält kleinere Kreuzung true =230 * Kreuzung231 *232 */233 public boolean getCheck() {234 return Check;235 }236 237 /**238 * gibt den Wert des JMinimality zurück (wenn er ausgeführt wurde)239 *240 * @return true = keine kleinere kreuzung, false = kleinere kreuzung241 * enthalten242 */243 public boolean isSmallerJunction() {244 return smallerJunction;245 }246 247 /**248 * das Ergebnis des JCheck als String249 *250 * @return251 */252 public String getJCheckResult() {253 return jCheck.getResult();254 }255 256 /**257 * gitb die bei der Kruezungssuche gefundenen Kreuzungen zurück, sonst258 * nichts259 *260 * @return261 */262 public ArrayList<HashSet<Channel>> getJunctions() {263 return junctions;264 }126 for (int i = 0; i < junctioncandidates.size(); i++) { 127 for (int j = 0; j < junctioncandidates.size(); j++) { 128 if (junctioncandidates.get(i).containsAll(junctioncandidates.get(j))) { 129 junctions.removeAll(junctioncandidates.get(i)); 130 } 131 else { 132 } 133 } 134 } 135 return junctions; 136 } 137 138 139 private void collectECandidates(ArrayList<Channel> subgraph) { 140 E = new ArrayList<Channel>(); 141 for (int i = 0; i < subgraph.size(); i++) { 142 if ((subgraph.get(i).getIndegree() + subgraph.get(i).getOutdegree() >= 3) 143 || entries.contains(subgraph.get(i)) 144 || exits.contains(subgraph.get(i))) { 145 E.add(subgraph.get(i)); 146 } 147 } 148 } 149 150 private void ConstructGrid() { 151 Grid = new int[E.size()][E.size()]; 152 for (int y = 0; y < E.size(); y++) { 153 for (int x = 0; x < E.size(); x++) { 154 if (x != y && !(entries.contains(E.get(x))) 155 && !(exits.contains(E.get(y))) 156 && E.get(y).getReachableNodes().contains(E.get(x))) { 157 Grid[y][x] = 1; 158 //log.trace("Grid-Position auf 1 gesetzT (y/x): " + y + ":" 159 // + x + "(Entry/exit):" + E.get(y).getNewid() + ":" + 160 // E.get(x).getNewid()); 161 } else { 162 Grid[y][x] = 0; 163 } 164 } 165 } 166 } 167 168 public long getMeasuredIterateTime() { 169 return (stopIterate - startIterate); 170 } 171 172 public long getMeasuredGenerateTime() { 173 return (startIterate - startGenerate); 174 } 175 176 public ArrayList<Channel> getSubgraph() { 177 return subgraph; 178 } 179 180 public void setSubgraph(ArrayList<Channel> subgraph) { 181 this.subgraph = subgraph; 182 } 183 184 public ArrayList<Channel> getEntries() { 185 return entries; 186 } 187 188 public void setEntries(ArrayList<Channel> entries) { 189 this.entries = entries; 190 } 191 192 public ArrayList<Channel> getExits() { 193 return exits; 194 } 195 196 public void setExits(ArrayList<Channel> exits) { 197 this.exits = exits; 198 } 199 200 public ArrayList<Channel> getCycleedges() { 201 return cycleedges; 202 } 203 204 public void setCycleedges(ArrayList<Channel> cycleedges) { 205 this.cycleedges = cycleedges; 206 } 207 208 public int getN() { 209 return n; 210 } 211 212 public void setN(int n) { 213 this.n = n; 214 } 215 216 /** 217 * gibt die kleinere, gefundene Kreuzung zurück (wenn es sie gibt) 218 * 219 * @return 220 */ 221 public ArrayList<Channel> getSubJunction() { 222 return subjunction; 223 } 224 225 /** 226 * gibt das Ergebnis des JCheck zurück (bei false keine generelle Aussage 227 * möglich) 228 * 229 * @return false = keine Kreuzung ODER enthält kleinere Kreuzung true = 230 * Kreuzung 231 * 232 */ 233 public boolean getCheck() { 234 return Check; 235 } 236 237 /** 238 * gibt den Wert des JMinimality zurück (wenn er ausgeführt wurde) 239 * 240 * @return true = keine kleinere kreuzung, false = kleinere kreuzung 241 * enthalten 242 */ 243 public boolean isSmallerJunction() { 244 return smallerJunction; 245 } 246 247 /** 248 * das Ergebnis des JCheck als String 249 * 250 * @return 251 */ 252 public String getJCheckResult() { 253 return jCheck.getResult(); 254 } 255 256 /** 257 * gitb die bei der Kruezungssuche gefundenen Kreuzungen zurück, sonst 258 * nichts 259 * 260 * @return 261 */ 262 public ArrayList<HashSet<Channel>> getJunctions() { 263 return junctions; 264 } 265 265 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/junctionchecking/TRDFS.java
r25501 r30725 13 13 public class TRDFS { 14 14 15 private final ArrayList<Channel> vertices;16 private Channel startNode;17 private final ArrayList<LeadsTo> cycleEdges;18 private final ChannelDiGraph digraph;15 private final ArrayList<Channel> vertices; 16 private Channel startNode; 17 private final ArrayList<LeadsTo> cycleEdges; 18 private final ChannelDiGraph digraph; 19 19 20 /**21 *22 *23 * @param adnodes24 */25 public TRDFS(ArrayList<Channel> adnodes, ChannelDiGraph digraph) {26 this.vertices = adnodes;27 this.digraph = digraph;28 this.cycleEdges = new ArrayList<LeadsTo>();29 }20 /** 21 * 22 * 23 * @param adnodes 24 */ 25 public TRDFS(ArrayList<Channel> adnodes, ChannelDiGraph digraph) { 26 this.vertices = adnodes; 27 this.digraph = digraph; 28 this.cycleEdges = new ArrayList<LeadsTo>(); 29 } 30 30 31 31 32 public void trdfs(Channel startNode) {33 Channel succNode;34 startNode.setVisited(BacktrackingColors.GREY);35 startNode.addReachableNode(startNode);36 startNode.appendChannelToPath(startNode, startNode);37 for (int i = 0; i < startNode.getLeadsTo().size(); i++) {38 succNode = startNode.getLeadsTo().get(i).getToChannel();39 if (succNode.isSubgraph()) {40 if (succNode.getVisited() == BacktrackingColors.WHITE) {41 digraph.setForwardEdge(startNode, succNode);42 trdfs(succNode);43 } else if (succNode.getVisited() == BacktrackingColors.GREY) {44 cycleEdges.add(digraph.getLeadsTo(startNode,45 succNode));46 }47 for (int j = 0; j < succNode.getReachableNodes().size(); j++) {32 public void trdfs(Channel startNode) { 33 Channel succNode; 34 startNode.setVisited(BacktrackingColors.GREY); 35 startNode.addReachableNode(startNode); 36 startNode.appendChannelToPath(startNode, startNode); 37 for (int i = 0; i < startNode.getLeadsTo().size(); i++) { 38 succNode = startNode.getLeadsTo().get(i).getToChannel(); 39 if (succNode.isSubgraph()) { 40 if (succNode.getVisited() == BacktrackingColors.WHITE) { 41 digraph.setForwardEdge(startNode, succNode); 42 trdfs(succNode); 43 } else if (succNode.getVisited() == BacktrackingColors.GREY) { 44 cycleEdges.add(digraph.getLeadsTo(startNode, 45 succNode)); 46 } 47 for (int j = 0; j < succNode.getReachableNodes().size(); j++) { 48 48 49 startNode.addReachableNode(succNode.getReachableNodeAt(j));50 succNode.appendChannelToPath(succNode.getReachableNodeAt(j), succNode.getReachableNodeAt(j));51 succNode.appendChannelToPath(succNode.getReachableNodeAt(j), succNode);52 startNode.appendPath(succNode.getReachableNodeAt(j), succNode.getPathsAt(succNode.getReachableNodeAt(j)));53 }54 }49 startNode.addReachableNode(succNode.getReachableNodeAt(j)); 50 succNode.appendChannelToPath(succNode.getReachableNodeAt(j), succNode.getReachableNodeAt(j)); 51 succNode.appendChannelToPath(succNode.getReachableNodeAt(j), succNode); 52 startNode.appendPath(succNode.getReachableNodeAt(j), succNode.getPathsAt(succNode.getReachableNodeAt(j))); 53 } 54 } 55 55 56 }57 startNode.setVisited(BacktrackingColors.BLACK);58 }56 } 57 startNode.setVisited(BacktrackingColors.BLACK); 58 } 59 59 60 public void ereaseCycleEdges() {61 cycleEdges.clear();62 }60 public void ereaseCycleEdges() { 61 cycleEdges.clear(); 62 } 63 63 64 public int getCycleedgesSize() {65 return cycleEdges.size();66 }64 public int getCycleedgesSize() { 65 return cycleEdges.size(); 66 } 67 67 68 public LeadsTo getCycleEdgeAt(int i) {69 return cycleEdges.get(i);70 }68 public LeadsTo getCycleEdgeAt(int i) { 69 return cycleEdges.get(i); 70 } 71 71 72 public ArrayList<LeadsTo> getCycleEdges() {73 return cycleEdges;74 }72 public ArrayList<LeadsTo> getCycleEdges() { 73 return cycleEdges; 74 } 75 75 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/reader/ColorSchemeXMLReader.java
r25501 r30725 8 8 public class ColorSchemeXMLReader extends XMLReader{ 9 9 10 private HashMap<String, Color> colorScheme;10 private HashMap<String, Color> colorScheme; 11 11 12 public ColorSchemeXMLReader(String filename) {13 super(filename);14 parseXML();15 }12 public ColorSchemeXMLReader(String filename) { 13 super(filename); 14 parseXML(); 15 } 16 16 17 /**18 * gibt die zu dieser Objektklasse gespeicherte Farbe zurück19 * @param s Objektklasse20 * @return die passende Farbe, existiert keine wird grey zurückgegeben21 */22 public Color getColor(String s) {23 if (colorScheme.containsKey(s)) {24 return colorScheme.get(s);25 }26 else {27 return Color.GRAY;28 }29 }17 /** 18 * gibt die zu dieser Objektklasse gespeicherte Farbe zurück 19 * @param s Objektklasse 20 * @return die passende Farbe, existiert keine wird grey zurückgegeben 21 */ 22 public Color getColor(String s) { 23 if (colorScheme.containsKey(s)) { 24 return colorScheme.get(s); 25 } 26 else { 27 return Color.GRAY; 28 } 29 } 30 30 31 @Override32 public void parseXML() {33 colorScheme = new HashMap<String, Color>();34 String tempValue;35 //String tempKeyValue ="";36 try {37 while (parser.hasNext()) {38 switch (parser.getEventType()) {31 @Override 32 public void parseXML() { 33 colorScheme = new HashMap<String, Color>(); 34 String tempValue; 35 //String tempKeyValue =""; 36 try { 37 while (parser.hasNext()) { 38 switch (parser.getEventType()) { 39 39 40 case XMLStreamConstants.START_ELEMENT:41 tempValue = parser.getAttributeValue(null, "color");42 if (tempValue != null) {43 String[] erg = tempValue.split(",");44 Color c = new Color(Integer.parseInt(erg[0]), Integer.parseInt(erg[1]), Integer.parseInt(erg[2]));45 colorScheme.put(parser.getLocalName(),c);46 }47 break;48 }49 parser.next();50 }51 } catch (XMLStreamException e) {52 System.out.println(e);53 }54 }40 case XMLStreamConstants.START_ELEMENT: 41 tempValue = parser.getAttributeValue(null, "color"); 42 if (tempValue != null) { 43 String[] erg = tempValue.split(","); 44 Color c = new Color(Integer.parseInt(erg[0]), Integer.parseInt(erg[1]), Integer.parseInt(erg[2])); 45 colorScheme.put(parser.getLocalName(),c); 46 } 47 break; 48 } 49 parser.next(); 50 } 51 } catch (XMLStreamException e) { 52 System.out.println(e); 53 } 54 } 55 55 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/reader/OSMXMLReader.java
r25501 r30725 16 16 public class OSMXMLReader extends XMLReader { 17 17 18 private OSMGraph osmgraph = new OSMGraph();18 private OSMGraph osmgraph = new OSMGraph(); 19 19 20 public OSMXMLReader(String filename) {21 super(filename);22 }20 public OSMXMLReader(String filename) { 21 super(filename); 22 } 23 23 24 public OSMXMLReader(File file) {25 super(file);26 }24 public OSMXMLReader(File file) { 25 super(file); 26 } 27 27 28 private void readAttributes(OSMEntity entity) {29 String temp = parser.getAttributeValue(null, "changeset");30 if (temp != null) {31 entity.setChangeset(Integer.parseInt(temp));32 }33 entity.setId(Long.parseLong(parser.getAttributeValue(null, "id")));34 entity.setTimestamp(parser.getAttributeValue(null, "timestamp"));28 private void readAttributes(OSMEntity entity) { 29 String temp = parser.getAttributeValue(null, "changeset"); 30 if (temp != null) { 31 entity.setChangeset(Integer.parseInt(temp)); 32 } 33 entity.setId(Long.parseLong(parser.getAttributeValue(null, "id"))); 34 entity.setTimestamp(parser.getAttributeValue(null, "timestamp")); 35 35 36 temp = parser.getAttributeValue(null, "uid");37 if (temp != null)38 entity.setUid(Integer.parseInt(temp));36 temp = parser.getAttributeValue(null, "uid"); 37 if (temp != null) 38 entity.setUid(Integer.parseInt(temp)); 39 39 40 temp = parser.getAttributeValue(null, "uid");41 if (temp != null) {42 entity.setUid(Integer.parseInt(temp));43 }44 entity.setUser(parser.getAttributeValue(null, "user"));40 temp = parser.getAttributeValue(null, "uid"); 41 if (temp != null) { 42 entity.setUid(Integer.parseInt(temp)); 43 } 44 entity.setUser(parser.getAttributeValue(null, "user")); 45 45 46 temp = parser.getAttributeValue(null, "visible");47 if (temp != null) {48 if (temp.equals("true") || temp.equals("1")) {49 entity.setVisible(true);50 }51 } else {52 entity.setVisible(false);53 }54 temp = parser.getAttributeValue(null, "version");55 if (temp != null) {56 entity.setversion(Integer.parseInt(temp));57 }58 }46 temp = parser.getAttributeValue(null, "visible"); 47 if (temp != null) { 48 if (temp.equals("true") || temp.equals("1")) { 49 entity.setVisible(true); 50 } 51 } else { 52 entity.setVisible(false); 53 } 54 temp = parser.getAttributeValue(null, "version"); 55 if (temp != null) { 56 entity.setversion(Integer.parseInt(temp)); 57 } 58 } 59 59 60 private void readMember(OSMRelation relation) {61 if (parser.getAttributeValue(null, "type").equals("node")) {62 relation.addMember(osmgraph.getNode(Integer.parseInt(parser63 .getAttributeValue(null, "ref"))), parser64 .getAttributeValue(null, "role"));65 }66 else if (parser.getAttributeValue(null, "type").equals("way")) {67 relation.addMember(osmgraph.getWay(Long.parseLong(parser68 .getAttributeValue(null, "ref"))), parser69 .getAttributeValue(null, "role"));70 }71 else if (parser.getAttributeValue(null, "type").equals("relation")) {72 relation.addMember(osmgraph.getRelation(Integer.parseInt(parser73 .getAttributeValue(null, "ref"))), parser74 .getAttributeValue(null, "role"));75 }76 }60 private void readMember(OSMRelation relation) { 61 if (parser.getAttributeValue(null, "type").equals("node")) { 62 relation.addMember(osmgraph.getNode(Integer.parseInt(parser 63 .getAttributeValue(null, "ref"))), parser 64 .getAttributeValue(null, "role")); 65 } 66 else if (parser.getAttributeValue(null, "type").equals("way")) { 67 relation.addMember(osmgraph.getWay(Long.parseLong(parser 68 .getAttributeValue(null, "ref"))), parser 69 .getAttributeValue(null, "role")); 70 } 71 else if (parser.getAttributeValue(null, "type").equals("relation")) { 72 relation.addMember(osmgraph.getRelation(Integer.parseInt(parser 73 .getAttributeValue(null, "ref"))), parser 74 .getAttributeValue(null, "role")); 75 } 76 } 77 77 78 @Override79 public void parseXML() {80 String xmlelement;81 OSMNode node = new OSMNode();82 OSMWay way = new OSMWay();83 OSMRelation relation = new OSMRelation();84 HashMap<String, String> hashmap = new HashMap<String, String>();85 try {86 while (parser.hasNext()) {87 switch (parser.getEventType()) {78 @Override 79 public void parseXML() { 80 String xmlelement; 81 OSMNode node = new OSMNode(); 82 OSMWay way = new OSMWay(); 83 OSMRelation relation = new OSMRelation(); 84 HashMap<String, String> hashmap = new HashMap<String, String>(); 85 try { 86 while (parser.hasNext()) { 87 switch (parser.getEventType()) { 88 88 89 case XMLStreamConstants.START_ELEMENT:90 xmlelement = parser.getLocalName();89 case XMLStreamConstants.START_ELEMENT: 90 xmlelement = parser.getLocalName(); 91 91 92 if (xmlelement.equals("node")) {93 node = new OSMNode();94 hashmap = new HashMap<String, String>();95 readAttributes(node);96 node.setLatitude(Double.parseDouble(parser97 .getAttributeValue(null, "lat")));98 node.setLongitude(Double.parseDouble(parser99 .getAttributeValue(null, "lon")));100 }92 if (xmlelement.equals("node")) { 93 node = new OSMNode(); 94 hashmap = new HashMap<String, String>(); 95 readAttributes(node); 96 node.setLatitude(Double.parseDouble(parser 97 .getAttributeValue(null, "lat"))); 98 node.setLongitude(Double.parseDouble(parser 99 .getAttributeValue(null, "lon"))); 100 } 101 101 102 if (xmlelement.equals("way")) {103 way = new OSMWay();104 hashmap = new HashMap<String, String>();105 readAttributes(way);106 }102 if (xmlelement.equals("way")) { 103 way = new OSMWay(); 104 hashmap = new HashMap<String, String>(); 105 readAttributes(way); 106 } 107 107 108 if (xmlelement.equals("relation")) {109 relation = new OSMRelation();110 hashmap = new HashMap<String, String>();111 readAttributes(relation);112 }108 if (xmlelement.equals("relation")) { 109 relation = new OSMRelation(); 110 hashmap = new HashMap<String, String>(); 111 readAttributes(relation); 112 } 113 113 114 if (xmlelement.equals("member")) {115 readMember(relation);116 }114 if (xmlelement.equals("member")) { 115 readMember(relation); 116 } 117 117 118 if (xmlelement.equals("bounds")) {119 osmgraph.setBbbottom(Double.parseDouble(parser120 .getAttributeValue(null, "minlat")));121 osmgraph.setBbtop(Double.parseDouble(parser122 .getAttributeValue(null, "maxlat")));123 osmgraph.setBbleft(Double.parseDouble(parser124 .getAttributeValue(null, "minlon")));125 osmgraph.setBbright(Double.parseDouble(parser126 .getAttributeValue(null, "maxlon")));127 }118 if (xmlelement.equals("bounds")) { 119 osmgraph.setBbbottom(Double.parseDouble(parser 120 .getAttributeValue(null, "minlat"))); 121 osmgraph.setBbtop(Double.parseDouble(parser 122 .getAttributeValue(null, "maxlat"))); 123 osmgraph.setBbleft(Double.parseDouble(parser 124 .getAttributeValue(null, "minlon"))); 125 osmgraph.setBbright(Double.parseDouble(parser 126 .getAttributeValue(null, "maxlon"))); 127 } 128 128 129 if (xmlelement.equals("nd")) {130 way.addNode(osmgraph.getNode(Integer.parseInt(parser131 .getAttributeValue(0))));132 }129 if (xmlelement.equals("nd")) { 130 way.addNode(osmgraph.getNode(Integer.parseInt(parser 131 .getAttributeValue(0)))); 132 } 133 133 134 if (xmlelement.equals("tag")) {135 hashmap.put(parser.getAttributeValue(null, "k"), parser136 .getAttributeValue(null, "v"));137 }134 if (xmlelement.equals("tag")) { 135 hashmap.put(parser.getAttributeValue(null, "k"), parser 136 .getAttributeValue(null, "v")); 137 } 138 138 139 if (xmlelement.equals("relation")) {140 relation = new OSMRelation();141 hashmap = new HashMap<String, String>();142 readAttributes(relation);143 }139 if (xmlelement.equals("relation")) { 140 relation = new OSMRelation(); 141 hashmap = new HashMap<String, String>(); 142 readAttributes(relation); 143 } 144 144 145 //TODO: kann wohl wech!146 /*147 if (xmlelement.equals("member")) {148 relation.addMember(parser.getAttributeValue(null,149 "type"), Integer.parseInt(parser150 .getAttributeValue(null, "ref")), parser151 .getAttributeValue(null, "role"));152 }153 */154 break;145 //TODO: kann wohl wech! 146 /* 147 if (xmlelement.equals("member")) { 148 relation.addMember(parser.getAttributeValue(null, 149 "type"), Integer.parseInt(parser 150 .getAttributeValue(null, "ref")), parser 151 .getAttributeValue(null, "role")); 152 } 153 */ 154 break; 155 155 156 case XMLStreamConstants.END_ELEMENT:157 if (parser.getLocalName() == "node") {158 node.setHashmap(hashmap);159 osmgraph.addNode(node);160 }156 case XMLStreamConstants.END_ELEMENT: 157 if (parser.getLocalName() == "node") { 158 node.setHashmap(hashmap); 159 osmgraph.addNode(node); 160 } 161 161 162 if (parser.getLocalName() == "way") {163 way.setHashmap(hashmap);164 osmgraph.addWay(way);165 }162 if (parser.getLocalName() == "way") { 163 way.setHashmap(hashmap); 164 osmgraph.addWay(way); 165 } 166 166 167 if (parser.getLocalName().equals("relation")) {168 relation.setHashmap(hashmap);169 osmgraph.addRelation(relation);170 }171 break;172 }173 parser.next();174 }175 } catch (XMLStreamException e) {176 e.printStackTrace();177 }178 }167 if (parser.getLocalName().equals("relation")) { 168 relation.setHashmap(hashmap); 169 osmgraph.addRelation(relation); 170 } 171 break; 172 } 173 parser.next(); 174 } 175 } catch (XMLStreamException e) { 176 e.printStackTrace(); 177 } 178 } 179 179 180 public void setOSMGraph(OSMGraph osmgraph) {181 this.osmgraph = osmgraph;182 }180 public void setOSMGraph(OSMGraph osmgraph) { 181 this.osmgraph = osmgraph; 182 } 183 183 184 public OSMGraph getOSMGraph() {185 return osmgraph;186 }184 public OSMGraph getOSMGraph() { 185 return osmgraph; 186 } 187 187 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/reader/XMLFilterReader.java
r25501 r30725 11 11 public class XMLFilterReader extends XMLReader{ 12 12 13 Vector<Filter> filters;14 Filter filter;13 Vector<Filter> filters; 14 Filter filter; 15 15 16 public XMLFilterReader(String filename) {17 super(filename);18 filters = new Vector<Filter>();19 }16 public XMLFilterReader(String filename) { 17 super(filename); 18 filters = new Vector<Filter>(); 19 } 20 20 21 @Override22 public void parseXML() {23 String tempValue ="";24 String tempKeyValue ="";25 try {26 while (parser.hasNext()) {21 @Override 22 public void parseXML() { 23 String tempValue =""; 24 String tempKeyValue =""; 25 try { 26 while (parser.hasNext()) { 27 27 28 switch (parser.getEventType()) {29 case XMLStreamConstants.START_ELEMENT:30 tempValue = parser.getAttributeValue(null, "entity");31 if (tempValue.equals("k")) {32 filter = new Filter();33 filter.setKeyValue(parser.getLocalName());34 tempKeyValue = parser.getLocalName();35 }36 if (tempValue.equalsIgnoreCase("v")) {37 filter.setTagValue(parser.getLocalName());38 }39 break;28 switch (parser.getEventType()) { 29 case XMLStreamConstants.START_ELEMENT: 30 tempValue = parser.getAttributeValue(null, "entity"); 31 if (tempValue.equals("k")) { 32 filter = new Filter(); 33 filter.setKeyValue(parser.getLocalName()); 34 tempKeyValue = parser.getLocalName(); 35 } 36 if (tempValue.equalsIgnoreCase("v")) { 37 filter.setTagValue(parser.getLocalName()); 38 } 39 break; 40 40 41 case XMLStreamConstants.END_ELEMENT:42 if (tempKeyValue.equalsIgnoreCase(parser.getLocalName())) {43 filters.add(filter);44 }45 break;41 case XMLStreamConstants.END_ELEMENT: 42 if (tempKeyValue.equalsIgnoreCase(parser.getLocalName())) { 43 filters.add(filter); 44 } 45 break; 46 46 47 }48 parser.next();49 }50 } catch (XMLStreamException e) {51 e.printStackTrace();52 }53 }47 } 48 parser.next(); 49 } 50 } catch (XMLStreamException e) { 51 e.printStackTrace(); 52 } 53 } 54 54 55 public Filter[] getFilters() {56 Filter[] filterarray= new Filter[filters.size()];57 return filters.toArray(filterarray);58 }55 public Filter[] getFilters() { 56 Filter[] filterarray= new Filter[filters.size()]; 57 return filters.toArray(filterarray); 58 } 59 59 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/reader/XMLReader.java
r25501 r30725 9 9 10 10 public abstract class XMLReader { 11 12 protected String filename;13 protected XMLInputFactory factory = XMLInputFactory.newInstance();14 protected XMLStreamReader parser;15 16 public XMLReader(String filename) {17 try {18 parser = factory19 .createXMLStreamReader(this.getClass().getResourceAsStream(filename));20 } catch (XMLStreamException e) {21 e.printStackTrace();22 }23 }24 25 public XMLReader(File file) {26 try {27 parser = factory28 .createXMLStreamReader(new FileInputStream(file));29 } catch (FileNotFoundException e) {30 e.printStackTrace();31 } catch (XMLStreamException e) {32 e.printStackTrace();33 }34 }35 36 public abstract void parseXML();11 12 protected String filename; 13 protected XMLInputFactory factory = XMLInputFactory.newInstance(); 14 protected XMLStreamReader parser; 15 16 public XMLReader(String filename) { 17 try { 18 parser = factory 19 .createXMLStreamReader(this.getClass().getResourceAsStream(filename)); 20 } catch (XMLStreamException e) { 21 e.printStackTrace(); 22 } 23 } 24 25 public XMLReader(File file) { 26 try { 27 parser = factory 28 .createXMLStreamReader(new FileInputStream(file)); 29 } catch (FileNotFoundException e) { 30 e.printStackTrace(); 31 } catch (XMLStreamException e) { 32 e.printStackTrace(); 33 } 34 } 35 36 public abstract void parseXML(); 37 37 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/util/RelationProducer.java
r25501 r30725 19 19 public class RelationProducer { 20 20 21 private JunctionCheckerPlugin plugin;22 private HashSet<HashSet<Channel>> storedRelations;21 private JunctionCheckerPlugin plugin; 22 private HashSet<HashSet<Channel>> storedRelations; 23 23 24 public RelationProducer(JunctionCheckerPlugin plugin) {25 this.plugin = plugin;26 storedRelations = new HashSet<HashSet<Channel>>();27 }24 public RelationProducer(JunctionCheckerPlugin plugin) { 25 this.plugin = plugin; 26 storedRelations = new HashSet<HashSet<Channel>>(); 27 } 28 28 29 public void produceRelation(HashSet<Channel> subset, int n) {30 if (isProduced(subset)) {31 return;32 }33 LinkedList<OsmPrimitive> ways = new LinkedList<OsmPrimitive>();34 Iterator<Channel> cit = subset.iterator();35 while (cit.hasNext()) {36 Channel c = cit.next();37 // System.out.println(c.getWay().getId());38 if (!(ways.contains(plugin.getOsmlayer().data.getPrimitiveById(c39 .getWay().getId(), OsmPrimitiveType.WAY)))) {40 ways.add(plugin.getOsmlayer().data.getPrimitiveById(c.getWay()41 .getId(), OsmPrimitiveType.WAY));42 }43 }44 Main.map.mapView.setActiveLayer(plugin.getOsmlayer());45 plugin.getOsmlayer().data.setSelected(ways);29 public void produceRelation(HashSet<Channel> subset, int n) { 30 if (isProduced(subset)) { 31 return; 32 } 33 LinkedList<OsmPrimitive> ways = new LinkedList<OsmPrimitive>(); 34 Iterator<Channel> cit = subset.iterator(); 35 while (cit.hasNext()) { 36 Channel c = cit.next(); 37 // System.out.println(c.getWay().getId()); 38 if (!(ways.contains(plugin.getOsmlayer().data.getPrimitiveById(c 39 .getWay().getId(), OsmPrimitiveType.WAY)))) { 40 ways.add(plugin.getOsmlayer().data.getPrimitiveById(c.getWay() 41 .getId(), OsmPrimitiveType.WAY)); 42 } 43 } 44 Main.map.mapView.setActiveLayer(plugin.getOsmlayer()); 45 plugin.getOsmlayer().data.setSelected(ways); 46 46 47 Relation jrelation = new Relation();48 jrelation.put("type", "junction");49 jrelation.put("n", Integer.toString(n));50 for (int i = 0; i < ways.size(); i++) {51 jrelation.addMember(new RelationMember("part of", ways.get(i)));52 }47 Relation jrelation = new Relation(); 48 jrelation.put("type", "junction"); 49 jrelation.put("n", Integer.toString(n)); 50 for (int i = 0; i < ways.size(); i++) { 51 jrelation.addMember(new RelationMember("part of", ways.get(i))); 52 } 53 53 54 plugin.getOsmlayer().data.addPrimitive(jrelation);55 }54 plugin.getOsmlayer().data.addPrimitive(jrelation); 55 } 56 56 57 private boolean isProduced(HashSet<Channel> subset) {58 if (storedRelations.contains(subset)) {59 return true;60 } else {61 storedRelations.add(subset);62 }63 return false;64 }57 private boolean isProduced(HashSet<Channel> subset) { 58 if (storedRelations.contains(subset)) { 59 return true; 60 } else { 61 storedRelations.add(subset); 62 } 63 return false; 64 } 65 65 } -
applications/editors/josm/plugins/junctionchecking/src/org/openstreetmap/josm/plugins/JunctionChecker/writing/OSMXMLWriter.java
r25501 r30725 22 22 public class OSMXMLWriter { 23 23 24 String filename;25 ChannelDiGraph digraph;26 XMLStreamWriter writer;24 String filename; 25 ChannelDiGraph digraph; 26 XMLStreamWriter writer; 27 27 28 public OSMXMLWriter(String filename, ChannelDiGraph digraph) {29 this.filename = filename;30 this.digraph = digraph;31 }28 public OSMXMLWriter(String filename, ChannelDiGraph digraph) { 29 this.filename = filename; 30 this.digraph = digraph; 31 } 32 32 33 public void writeXML() throws FileNotFoundException, XMLStreamException {34 XMLOutputFactory factory = XMLOutputFactory.newInstance();35 writer = factory.createXMLStreamWriter(36 new FileOutputStream( filename ) );37 // Der XML-Header wird erzeugt38 writer.writeStartDocument("utf-8", "1.0");39 // Zuerst wird das Wurzelelement mit Attribut geschrieben40 writer.writeStartElement( "osm" );41 writer.writeAttribute( "version", "0.6" );42 writer.writeAttribute("generator", "channelGenerator");33 public void writeXML() throws FileNotFoundException, XMLStreamException { 34 XMLOutputFactory factory = XMLOutputFactory.newInstance(); 35 writer = factory.createXMLStreamWriter( 36 new FileOutputStream( filename ) ); 37 // Der XML-Header wird erzeugt 38 writer.writeStartDocument("utf-8", "1.0"); 39 // Zuerst wird das Wurzelelement mit Attribut geschrieben 40 writer.writeStartElement( "osm" ); 41 writer.writeAttribute( "version", "0.6" ); 42 writer.writeAttribute("generator", "channelGenerator"); 43 43 44 writer.writeEmptyElement("bounds");45 writer.writeAttribute("minlat", Double.toString(digraph.getBbbottom()));46 writer.writeAttribute("minlon", Double.toString(digraph.getBbleft()));47 writer.writeAttribute("maxlat", Double.toString(digraph.getBbtop()));48 writer.writeAttribute("maxlon", Double.toString(digraph.getBbright()));44 writer.writeEmptyElement("bounds"); 45 writer.writeAttribute("minlat", Double.toString(digraph.getBbbottom())); 46 writer.writeAttribute("minlon", Double.toString(digraph.getBbleft())); 47 writer.writeAttribute("maxlat", Double.toString(digraph.getBbtop())); 48 writer.writeAttribute("maxlon", Double.toString(digraph.getBbright())); 49 49 50 50 51 OSMNode[] nodes = digraph.getAllOSMNodes();52 for (int i = 0; i < nodes.length; i++) {53 //writer.writeStartElement("node");54 writer.writeEmptyElement("node");55 writeAttributes(nodes[i]);56 }51 OSMNode[] nodes = digraph.getAllOSMNodes(); 52 for (int i = 0; i < nodes.length; i++) { 53 //writer.writeStartElement("node"); 54 writer.writeEmptyElement("node"); 55 writeAttributes(nodes[i]); 56 } 57 57 58 ArrayList<Channel> ways = digraph.getChannels();59 for (int i = 0; i < ways.size(); i++) {60 writer.writeStartElement("way");61 writer.writeAttribute("id", Integer.toString(ways.get(i).getNewid()));62 writeAttributes(ways.get(i).getWay());63 writer.writeEmptyElement("nd");64 writer.writeAttribute("ref", Long.toString(ways.get(i).getFromNode().getId()));65 //writer.writeEndElement();66 writer.writeEmptyElement("nd");67 writer.writeAttribute("ref", Long.toString(ways.get(i).getToNode().getId()));68 //writer.writeEndElement();58 ArrayList<Channel> ways = digraph.getChannels(); 59 for (int i = 0; i < ways.size(); i++) { 60 writer.writeStartElement("way"); 61 writer.writeAttribute("id", Integer.toString(ways.get(i).getNewid())); 62 writeAttributes(ways.get(i).getWay()); 63 writer.writeEmptyElement("nd"); 64 writer.writeAttribute("ref", Long.toString(ways.get(i).getFromNode().getId())); 65 //writer.writeEndElement(); 66 writer.writeEmptyElement("nd"); 67 writer.writeAttribute("ref", Long.toString(ways.get(i).getToNode().getId())); 68 //writer.writeEndElement(); 69 69 70 HashMap<String, String> tags = ways.get(i).getWay().getHashmap();71 Set<String> keys = tags.keySet();72 String t;73 Iterator<String> iterator = keys.iterator();74 while (iterator.hasNext()) {75 t = iterator.next();76 writer.writeEmptyElement("tag");77 writer.writeAttribute("k", t);78 writer.writeAttribute("v", tags.get(t));79 }80 writer.writeEmptyElement("tag");81 writer.writeAttribute("k", "ID");82 writer.writeAttribute("v", Integer.toString(ways.get(i).getNewid()));83 writer.writeEmptyElement("tag");70 HashMap<String, String> tags = ways.get(i).getWay().getHashmap(); 71 Set<String> keys = tags.keySet(); 72 String t; 73 Iterator<String> iterator = keys.iterator(); 74 while (iterator.hasNext()) { 75 t = iterator.next(); 76 writer.writeEmptyElement("tag"); 77 writer.writeAttribute("k", t); 78 writer.writeAttribute("v", tags.get(t)); 79 } 80 writer.writeEmptyElement("tag"); 81 writer.writeAttribute("k", "ID"); 82 writer.writeAttribute("v", Integer.toString(ways.get(i).getNewid())); 83 writer.writeEmptyElement("tag"); 84 84 writer.writeAttribute("k", "SCC"); 85 85 if (ways.get(i).isStrongConnected()) { … … 90 90 } 91 91 writer.writeEndElement(); 92 }92 } 93 93 94 writer.writeEndElement();95 writer.writeEndDocument();96 writer.close();97 }94 writer.writeEndElement(); 95 writer.writeEndDocument(); 96 writer.close(); 97 } 98 98 99 private void writeAttributes(OSMEntity ent) throws FileNotFoundException, XMLStreamException{100 if (ent instanceof OSMNode) {101 writer.writeAttribute("id", Long.toString(ent.getId()) );102 writer.writeAttribute("lat", Double.toString(((OSMNode) ent).getLatitude()));103 writer.writeAttribute("lon", Double.toString(((OSMNode) ent).getLongitude()));104 }99 private void writeAttributes(OSMEntity ent) throws FileNotFoundException, XMLStreamException{ 100 if (ent instanceof OSMNode) { 101 writer.writeAttribute("id", Long.toString(ent.getId()) ); 102 writer.writeAttribute("lat", Double.toString(((OSMNode) ent).getLatitude())); 103 writer.writeAttribute("lon", Double.toString(((OSMNode) ent).getLongitude())); 104 } 105 105 106 if (ent.getTimestamp()!=null) {107 writer.writeAttribute("timestamp", ent.getTimestamp());108 }109 if (ent.isVisible())110 writer.writeAttribute("visible", "true");111 else writer.writeAttribute("visible", "false");112 writer.writeAttribute("version", Integer.toString(ent.getVersion()));113 }106 if (ent.getTimestamp()!=null) { 107 writer.writeAttribute("timestamp", ent.getTimestamp()); 108 } 109 if (ent.isVisible()) 110 writer.writeAttribute("visible", "true"); 111 else writer.writeAttribute("visible", "false"); 112 writer.writeAttribute("version", Integer.toString(ent.getVersion())); 113 } 114 114 }
Note:
See TracChangeset
for help on using the changeset viewer.
