Changeset 8904 in osm for applications/editors/josm
- Timestamp:
- 2008-07-10T10:54:26+02:00 (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/WronglyOrderedWays.java
r6374 r8904 16 16 /** 17 17 * Check cyclic ways for errors 18 * 18 * 19 19 * @author jrreid 20 20 */ 21 21 public class WronglyOrderedWays extends Test { 22 /** All ways, grouped by cells */ 23 Map<Point2D,List<Way>> _cellWays; 24 /** The already detected errors */ 25 Bag<Way, Way> _errorWays; 22 /** The already detected errors */ 23 Bag<Way, Way> _errorWays; 26 24 27 25 /** 28 26 * Constructor 29 27 */ 30 public WronglyOrderedWays() 28 public WronglyOrderedWays() 31 29 { 32 30 super(tr("Wrongly Ordered Ways."), … … 34 32 } 35 33 36 @Override 37 public void startTest() 38 { 39 _cellWays = new HashMap<Point2D,List<Way>>(1000); 40 _errorWays = new Bag<Way, Way>(); 41 } 34 @Override 35 public void startTest() 36 { 37 _errorWays = new Bag<Way, Way>(); 38 } 42 39 43 @Override44 public void endTest()45 {46 _cellWays = null;47 _errorWays = null;48 }49 50 40 @Override 51 public void visit(Way w) 41 public void endTest() 42 { 43 _errorWays = null; 44 } 45 46 @Override 47 public void visit(Way w) 52 48 { 53 49 String errortype = ""; 54 50 55 if( w.deleted || w.incomplete ) 56 return; 57 58 String natural = w.get("natural"); 59 if( natural == null) 60 return; 61 62 if(!natural.equals("coastline") ){ 63 errortype = "Clockwise coastline"; 64 }else if(!natural.equals("water") ){ 65 errortype = "Clockwise water"; 66 }else if(!natural.equals("land") ){ 67 errortype = "Clockwise land"; 68 } else { 69 return; 70 } 71 72 /** 73 * Test the directionality of the way 74 * 75 * Checks if the node following the northern-most node is further 76 * west then the node previous 77 * 78 * Only tests ways that the first and last node is the same currently 79 * 80 */ 81 82 if(w.nodes.get(0) == w.nodes.get(w.nodes.size()-1)){ 83 int maxnode = -1; 84 double maxlat = -90; 85 86 for (int node = 0; node < w.nodes.size(); node++){ 87 double lat = w.nodes.get(node).coor.lat(); 88 if(lat > maxlat){ 89 maxnode = node; 90 maxlat = lat; 91 } 92 } 93 94 int nextnode; 95 int prevnode; 96 97 // Determine the previous and next nodes in the loop 98 if(maxnode==0){ 99 nextnode = 1; 100 prevnode = w.nodes.size()-1; 101 }else if(maxnode == w.nodes.size()-1){ 102 nextnode = 0; 103 prevnode = maxnode - 1; 104 } else { 105 nextnode = maxnode + 1; 106 prevnode = maxnode - 1; 107 } 108 109 double prevlon = w.nodes.get(prevnode).coor.lon(); 110 double nextlon = w.nodes.get(nextnode).coor.lon(); 111 112 if(((natural.equals("coastline") || natural.equals("land")) && prevlon < nextlon) 113 || (natural.equals("water") && prevlon > nextlon)){ 114 List<OsmPrimitive> primitives = new ArrayList<OsmPrimitive>(); 115 primitives.add(w); 116 errors.add( new TestError(this, Severity.WARNING, tr(errortype), primitives) ); 117 _errorWays.add(w,w); 118 } 119 } 51 if( w.deleted || w.incomplete ) 52 return; 53 54 String natural = w.get("natural"); 55 if( natural == null) 56 return; 57 58 if( natural.equals("coastline") ) 59 errortype = tr("Reversed coastline: land not on left side"); 60 else if(natural.equals("water") ) 61 errortype = tr("Reversed water: land not on left side"); 62 else if( natural.equals("land") ) 63 errortype = tr("Reversed land: land not on left side"); 64 else 65 return; 66 67 68 /** 69 * Test the directionality of the way 70 * 71 * Assuming a closed non-looping way, compute twice the area 72 * of the polygon using the formula 2*a = sum (Xn * Yn+1 - Xn+1 * Yn) 73 * If the area is negative the way is ordered in a clockwise direction 74 * 75 */ 76 77 if(w.nodes.get(0) == w.nodes.get(w.nodes.size()-1)) 78 { 79 double area2 = 0; 80 81 for (int node = 1; node < w.nodes.size(); node++) 82 { 83 area2 += (w.nodes.get(node-1).coor.lon() * w.nodes.get(node).coor.lat() 84 - w.nodes.get(node).coor.lon() * w.nodes.get(node-1).coor.lat()); 85 } 86 87 if(((natural.equals("coastline") || natural.equals("land")) && area2 < 0.) 88 || (natural.equals("water") && area2 > 0.)) 89 { 90 List<OsmPrimitive> primitives = new ArrayList<OsmPrimitive>(); 91 primitives.add(w); 92 errors.add( new TestError(this, Severity.WARNING, errortype, primitives) ); 93 _errorWays.add(w,w); 94 } 95 } 120 96 } 121 97 }
Note:
See TracChangeset
for help on using the changeset viewer.