Changeset 18477 in josm for trunk/src


Ignore:
Timestamp:
2022-06-08T20:21:41+02:00 (4 years ago)
Author:
taylor.smock
Message:

Fix tests broken in r18473, see #22032

This was caused by vector tiles not always having points,
then ways, then polygons. The code now ensures that we
add points first, followed by ways, and finally by polygons.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/vector/VectorDataStore.java

    r18473 r18477  
    1717import java.util.Map;
    1818import java.util.Objects;
     19import java.util.stream.Collectors;
    1920
    2021import org.openstreetmap.gui.jmapviewer.Tile;
     
    2526import org.openstreetmap.josm.data.imagery.vectortile.VectorTile;
    2627import org.openstreetmap.josm.data.imagery.vectortile.mapbox.Feature;
     28import org.openstreetmap.josm.data.imagery.vectortile.mapbox.GeometryTypes;
    2729import org.openstreetmap.josm.data.imagery.vectortile.mapbox.Layer;
    2830import org.openstreetmap.josm.data.osm.BBox;
     
    294296        final Map<ILatLon, VectorNode> nodeMap = new HashMap<>();
    295297        for (Layer layer : tile.getLayers()) {
    296             for (Feature feature : layer.getFeatures()) {
    297                 try {
    298                     addFeatureData(tile, layer, feature, nodeMap);
    299                 } catch (IllegalArgumentException e) {
    300                     Logging.error("Cannot add vector data for feature {0} of tile {1}: {2}", feature, tile, e.getMessage());
    301                     Logging.error(e);
     298            Map<GeometryTypes, List<Feature>> grouped = layer.getFeatures().stream().collect(Collectors.groupingBy(Feature::getGeometryType));
     299            // Unknown -> Point -> LineString -> Polygon
     300            for (GeometryTypes type : GeometryTypes.values()) {
     301                if (grouped.containsKey(type)) {
     302                    addFeatureData(tile, layer, grouped.get(type), nodeMap);
    302303                }
    303304            }
     
    312313    }
    313314
     315    private <T extends Tile & VectorTile> void addFeatureData(T tile, Layer layer, Collection<Feature> features, Map<ILatLon, VectorNode> nodeMap) {
     316        for (Feature feature : features) {
     317            try {
     318                addFeatureData(tile, layer, feature, nodeMap);
     319            } catch (IllegalArgumentException e) {
     320                Logging.error("Cannot add vector data for feature {0} of tile {1}: {2}", feature, tile, e.getMessage());
     321                Logging.error(e);
     322            }
     323        }
     324    }
     325
    314326    private <T extends Tile & VectorTile> void addFeatureData(T tile, Layer layer, Feature feature, Map<ILatLon, VectorNode> nodeMap) {
    315327        // This will typically be larger than primaryFeatureObjects, but this at least avoids quite a few ArrayList#grow calls
    316328        List<VectorPrimitive> featureObjects = new ArrayList<>(feature.getGeometryObject().getShapes().size());
    317         List<VectorPrimitive> primaryFeatureObjects = new ArrayList<>(featureObjects.size());
     329        List<VectorPrimitive> primaryFeatureObjects = new ArrayList<>(feature.getGeometryObject().getShapes().size());
    318330        for (Shape shape : feature.getGeometryObject().getShapes()) {
    319331            primaryFeatureObjects.add(shapeToPrimaryFeatureObject(tile, layer, shape, featureObjects, nodeMap));
Note: See TracChangeset for help on using the changeset viewer.