Changeset 4682 in josm


Ignore:
Timestamp:
21.12.2011 10:37:23 (5 months ago)
Author:
simon04
Message:

fix #2746 - add validation: Way connected to Area

Location:
trunk/src/org/openstreetmap/josm
Files:
1 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/osm/AbstractPrimitive.java

    r4431 r4682  
    55 
    66import java.text.MessageFormat; 
     7import java.util.Arrays; 
    78import java.util.Collection; 
    89import java.util.Collections; 
     
    693694    } 
    694695 
     696    /** 
     697     * Tests whether this primitive contains a tag consisting of {@code key} and any of {@code values}. 
     698     * @param key the key forming the tag. 
     699     * @param values one or many values forming the tag. 
     700     * @return true iff primitive contains a tag consisting of {@code key} and any of {@code values}. 
     701     */ 
     702    public boolean hasTag(String key, String... values) { 
     703        return hasTag(key, Arrays.asList(values)); 
     704    } 
     705 
     706    /** 
     707     * Tests whether this primitive contains a tag consisting of {@code key} and any of {@code values}. 
     708     * @param key the key forming the tag. 
     709     * @param values one or many values forming the tag. 
     710     * @return true iff primitive contains a tag consisting of {@code key} and any of {@code values}. 
     711     */ 
     712    public boolean hasTag(String key, Collection<String> values) { 
     713        return values.contains(get(key)); 
     714    } 
    695715} 
  • trunk/src/org/openstreetmap/josm/data/osm/Way.java

    r4671 r4682  
    448448    } 
    449449 
     450    /** 
     451     * Returns the last node of this way. 
     452     * The result equals <tt>{@link #getNode getNode}({@link #getNodesCount getNodesCount} - 1)</tt>. 
     453     * @return the last node of this way 
     454     */ 
    450455    public Node lastNode() { 
    451456        Node[] nodes = this.nodes; 
     
    454459    } 
    455460 
     461    /** 
     462     * Returns the first node of this way. 
     463     * The result equals {@link #getNode getNode}{@code (0)}. 
     464     * @return the first node of this way 
     465     */ 
    456466    public Node firstNode() { 
    457467        Node[] nodes = this.nodes; 
  • trunk/src/org/openstreetmap/josm/data/validation/OsmValidator.java

    r4448 r4682  
    4848import org.openstreetmap.josm.data.validation.tests.UntaggedNode; 
    4949import org.openstreetmap.josm.data.validation.tests.UntaggedWay; 
     50import org.openstreetmap.josm.data.validation.tests.WayConnectedToArea; 
    5051import org.openstreetmap.josm.data.validation.tests.WronglyOrderedWays; 
    5152import org.openstreetmap.josm.gui.MapView.LayerChangeListener; 
     
    102103        DeprecatedTags.class, // ID 2101 .. 2199 
    103104        OverlappingAreas.class, // ID 2201 .. 2299 
     105        WayConnectedToArea.class, // ID 2301 .. 2399 
    104106    }; 
    105107 
  • trunk/src/org/openstreetmap/josm/data/validation/tests/MultipolygonTest.java

    r4627 r4682  
    2626import org.openstreetmap.josm.data.validation.TestError; 
    2727import org.openstreetmap.josm.gui.mappaint.AreaElemStyle; 
    28 import org.openstreetmap.josm.gui.mappaint.ElemStyle; 
    2928import org.openstreetmap.josm.gui.mappaint.ElemStyles; 
    3029import org.openstreetmap.josm.gui.mappaint.MapPaintStyles; 
     
    117116    @Override 
    118117    public void visit(Way w) { 
    119         if (styles != null && !w.isClosed()) { 
    120             for (ElemStyle s : styles.generateStyles(w, SCALE, null, false).a) { 
    121                 if (s instanceof AreaElemStyle) { 
    122                     List<Node> nodes = w.getNodes(); 
    123                     errors.add(new TestError(this, Severity.WARNING, tr("Area style way is not closed"), NOT_CLOSED,  
    124                             Collections.singletonList(w), Arrays.asList(nodes.get(0), nodes.get(nodes.size() - 1)))); 
    125                     break; 
    126                 } 
    127             } 
     118        if (!w.isClosed() && ElemStyles.hasAreaElemStyle(w, false)) { 
     119            List<Node> nodes = w.getNodes(); 
     120            errors.add(new TestError(this, Severity.WARNING, tr("Area style way is not closed"), NOT_CLOSED, 
     121                    Collections.singletonList(w), Arrays.asList(nodes.get(0), nodes.get(nodes.size() - 1)))); 
    128122        } 
    129123    } 
     
    157151            if (styles != null) { 
    158152 
    159                 AreaElemStyle area = null; 
    160                 boolean areaStyle = false; 
    161                 for (ElemStyle s : styles.generateStyles(r, SCALE, null, false).a) { 
    162                     if (s instanceof AreaElemStyle) { 
    163                         area = (AreaElemStyle) s; 
    164                         areaStyle = true; 
    165                         break; 
    166                     } 
    167                 } 
     153                AreaElemStyle area = ElemStyles.getAreaElemStyle(r, false); 
     154                boolean areaStyle = area != null; 
    168155                // If area style was not found for relation then use style of ways 
    169156                if (area == null) { 
    170157                    for (Way w : polygon.getOuterWays()) { 
    171  
    172                         for (ElemStyle s : styles.generateStyles(w, SCALE, null, true).a) { 
    173                             if (s instanceof AreaElemStyle) { 
    174                                 area = (AreaElemStyle) s; 
    175                                 break; 
    176                             } 
    177                         } 
     158                        area = ElemStyles.getAreaElemStyle(w, true); 
    178159                        if (area != null) { 
    179160                            break; 
     
    189170                if (area != null) { 
    190171                    for (Way wInner : polygon.getInnerWays()) { 
    191                         AreaElemStyle areaInner = null; 
    192                         for (ElemStyle s : styles.generateStyles(wInner, SCALE, null, false).a) { 
    193                             if (s instanceof AreaElemStyle) { 
    194                                 areaInner = (AreaElemStyle) s; 
    195                                 break; 
    196                             } 
    197                         } 
     172                        AreaElemStyle areaInner = ElemStyles.getAreaElemStyle(wInner, false); 
    198173 
    199174                        if (areaInner != null && area.equals(areaInner)) { 
     
    207182                    if(!areaStyle) { 
    208183                        for (Way wOuter : polygon.getOuterWays()) { 
    209                             AreaElemStyle areaOuter = null; 
    210                             for (ElemStyle s : styles.generateStyles(wOuter, SCALE, null, false).a) { 
    211                                 if (s instanceof AreaElemStyle) { 
    212                                     areaOuter = (AreaElemStyle) s; 
    213                                     break; 
    214                                 } 
    215                             } 
     184                            AreaElemStyle areaOuter = ElemStyles.getAreaElemStyle(wOuter, false); 
    216185                            if (areaOuter != null && !area.equals(areaOuter)) { 
    217186                                List<OsmPrimitive> l = new ArrayList<OsmPrimitive>(); 
  • trunk/src/org/openstreetmap/josm/data/validation/tests/OverlappingAreas.java

    r4448 r4682  
    55import java.util.Collection; 
    66import java.util.Collections; 
    7 import org.openstreetmap.josm.data.osm.OsmPrimitive; 
    87import org.openstreetmap.josm.data.osm.QuadBuckets; 
    98import org.openstreetmap.josm.data.osm.Way; 
     
    1110import org.openstreetmap.josm.data.validation.Test; 
    1211import org.openstreetmap.josm.data.validation.TestError; 
    13 import org.openstreetmap.josm.gui.mappaint.AreaElemStyle; 
    14 import org.openstreetmap.josm.gui.mappaint.ElemStyle; 
    1512import org.openstreetmap.josm.gui.mappaint.ElemStyles; 
    16 import org.openstreetmap.josm.gui.mappaint.MapPaintStyles; 
    1713import org.openstreetmap.josm.tools.Geometry; 
    1814import org.openstreetmap.josm.tools.Predicate; 
     
    2319    protected static int OVERLAPPING_AREAS = 2201; 
    2420    protected QuadBuckets<Way> index = new QuadBuckets<Way>(); 
    25     private static ElemStyles styles = MapPaintStyles.getStyles(); 
    2621 
    2722    public OverlappingAreas() { 
     
    3126    @Override 
    3227    public void visit(Way w) { 
    33         if (w.isUsable() && w.isClosed() && hasAreaElemStyle(w)) { 
     28        if (w.isUsable() && w.isClosed() && ElemStyles.hasAreaElemStyle(w, false)) { 
    3429            index.add(w); 
    3530        } 
     
    6055    } 
    6156 
    62     private boolean hasAreaElemStyle(OsmPrimitive p) { 
    63         for (ElemStyle s : styles.generateStyles(p, 1.0, null, false).a) { 
    64             if (s instanceof AreaElemStyle) { 
    65                 return true; 
    66             } 
    67         } 
    68         return false; 
    69     } 
    7057} 
  • trunk/src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java

    r4623 r4682  
    410410        styleSources.addAll(sources); 
    411411    } 
     412 
     413    /** 
     414     * Returns the first AreaElemStyle for a given primitive. 
     415     * @param p the OSM primitive 
     416     * @param pretendWayIsClosed For styles that require the way to be closed, 
     417     * we pretend it is. This is useful for generating area styles from the (segmented) 
     418     * outer ways of a multipolygon. 
     419     * @return first AreaElemStyle found or {@code null}. 
     420     */ 
     421    public static AreaElemStyle getAreaElemStyle(OsmPrimitive p, boolean pretendWayIsClosed) { 
     422        if (MapPaintStyles.getStyles() == null) { 
     423            return null; 
     424        } 
     425        for (ElemStyle s : MapPaintStyles.getStyles().generateStyles(p, 1.0, null, pretendWayIsClosed).a) { 
     426            if (s instanceof AreaElemStyle) { 
     427                return (AreaElemStyle) s; 
     428            } 
     429        } 
     430        return null; 
     431    } 
     432 
     433    /** 
     434     * Determines whether primitive has an AreaElemStyle. 
     435     * @param p the OSM primitive 
     436     * @param pretendWayIsClosed For styles that require the way to be closed, 
     437     * we pretend it is. This is useful for generating area styles from the (segmented) 
     438     * outer ways of a multipolygon. 
     439     * @return {@code true} iff primitive has an AreaElemStyle 
     440     */ 
     441    public static boolean hasAreaElemStyle(OsmPrimitive p, boolean pretendWayIsClosed) { 
     442        return getAreaElemStyle(p, pretendWayIsClosed) != null; 
     443    } 
    412444} 
Note: See TracChangeset for help on using the changeset viewer.