- Timestamp:
- 2022-10-18T00:43:38+02:00 (23 months ago)
- Location:
- trunk
- Files:
-
- 2 added
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/data/imagery/vectortile/mapbox/style/Layers.java
r18211 r18578 76 76 77 77 /** Default paint properties for this layer */ 78 private final String paint ;78 private final String paintProperties; 79 79 80 80 /** A source description to be used with this layer. Required for everything <i>but</i> {@link Type#BACKGROUND} */ … … 106 106 this.filter = Expression.EMPTY_EXPRESSION; 107 107 } 108 this.maxZoom = layerInfo.getInt("maxzoom", Integer.MAX_VALUE);108 // minZoom <= showable zooms < maxZoom. This should be fractional, but our mapcss implementations expects ints. 109 109 this.minZoom = layerInfo.getInt("minzoom", Integer.MIN_VALUE); 110 int tMaxZoom = layerInfo.getInt("maxzoom", Integer.MAX_VALUE); 111 if (tMaxZoom == Integer.MAX_VALUE) { 112 this.maxZoom = Integer.MAX_VALUE; 113 } else { 114 this.maxZoom = Math.max(this.minZoom, Math.max(0, tMaxZoom - 1)); 115 } 110 116 // There is a metadata field (I don't *think* I need it?) 111 117 // source is only optional with {@link Type#BACKGROUND}. … … 123 129 case FILL: 124 130 // area 125 this.paint = parsePaintFill(paintObject);131 this.paintProperties = parsePaintFill(paintObject); 126 132 break; 127 133 case LINE: 128 134 // way 129 this.paint = parsePaintLine(layoutObject, paintObject);135 this.paintProperties = parsePaintLine(layoutObject, paintObject); 130 136 break; 131 137 case CIRCLE: 132 138 // point 133 this.paint = parsePaintCircle(paintObject);139 this.paintProperties = parsePaintCircle(paintObject); 134 140 break; 135 141 case SYMBOL: 136 142 // point 137 this.paint = parsePaintSymbol(layoutObject, paintObject);143 this.paintProperties = parsePaintSymbol(layoutObject, paintObject); 138 144 break; 139 145 case BACKGROUND: 140 146 // canvas only 141 this.paint = parsePaintBackground(paintObject);147 this.paintProperties = parsePaintBackground(paintObject); 142 148 break; 143 149 default: 144 this.paint = EMPTY_STRING;150 this.paintProperties = EMPTY_STRING; 145 151 } 146 152 } else { 147 this.paint = EMPTY_STRING;153 this.paintProperties = EMPTY_STRING; 148 154 } 149 155 } else { 150 this.paint = EMPTY_STRING;156 this.paintProperties = EMPTY_STRING; 151 157 } 152 158 this.sourceLayer = layerInfo.getString("source-layer", null); … … 454 460 @Override 455 461 public String toString() { 456 if (this.filter.toString().isEmpty() && this.paint .isEmpty()) {462 if (this.filter.toString().isEmpty() && this.paintProperties.isEmpty()) { 457 463 return EMPTY_STRING; 458 464 } else if (this.type == Type.BACKGROUND) { 459 465 // AFAIK, paint has no zoom levels, and doesn't accept a layer 460 return "canvas{" + this.paint + "}";466 return "canvas{" + this.paintProperties + "}"; 461 467 } 462 468 … … 473 479 zoomSelector = EMPTY_STRING; 474 480 } 475 final String commonData = zoomSelector + this.filter.toString() + "::" + this.id + "{" + this.paint + "}";481 final String commonData = zoomSelector + this.filter.toString() + "::" + this.id + "{" + this.paintProperties + "}"; 476 482 477 483 if (this.type == Type.CIRCLE || this.type == Type.SYMBOL) { … … 513 519 && Objects.equals(this.source, o.source) 514 520 && Objects.equals(this.filter, o.filter) 515 && Objects.equals(this.paint , o.paint);521 && Objects.equals(this.paintProperties, o.paintProperties); 516 522 } 517 523 return false; … … 521 527 public int hashCode() { 522 528 return Objects.hash(this.type, this.minZoom, this.maxZoom, this.id, this.styleId, this.sourceLayer, this.source, 523 this.filter, this.paint );529 this.filter, this.paintProperties); 524 530 } 525 531 } -
trunk/src/org/openstreetmap/josm/data/osm/PrimitiveId.java
r13924 r18578 17 17 18 18 /** 19 * Gets the type of object represented by this object. 19 * Gets the type of object represented by this object. Note that this should 20 * return the base primitive type ({@link OsmPrimitiveType#NODE}, 21 * {@link OsmPrimitiveType#WAY}, and {@link OsmPrimitiveType#RELATION}). 20 22 * 21 23 * @return the object type -
trunk/src/org/openstreetmap/josm/data/vector/VectorDataStore.java
r18478 r18578 78 78 if (mergedRelation.getMemberPrimitivesList().stream().allMatch(IWay.class::isInstance)) { 79 79 // This pretty much does the "right" thing 80 this.mergeWays(mergedRelation);80 mergeWays(mergedRelation); 81 81 } else if (!(primitive instanceof IWay)) { 82 82 // Can't merge, ever (one of the childs is a node/relation) 83 83 mergedRelation.remove(JOSM_MERGE_TYPE_KEY); 84 84 } 85 } else if (mergedRelation != null && primitive instanceof IRelation) {85 } else if (mergedRelation != null && primitive instanceof VectorRelation) { 86 86 // Just add to the relation 87 87 ((VectorRelation) primitive).getMembers().forEach(mergedRelation::addRelationMember); … … 99 99 } 100 100 101 private VectorPrimitive mergeWays(VectorRelation relation) {101 private static VectorPrimitive mergeWays(VectorRelation relation) { 102 102 List<VectorRelationMember> members = RelationSorter.sortMembersByConnectivity(relation.getMembers()); 103 103 Collection<VectorWay> relationWayList = members.stream().map(VectorRelationMember::getMember) … … 268 268 Collection<VectorPrimitive> featureObjects, Area area) { 269 269 VectorRelation vectorRelation = new VectorRelation(layer.getName()); 270 for (VectorPrimitive member : pathIteratorToObjects(tile, layer, featureObjects, area.getPathIterator(null))) { 270 PathIterator pathIterator = area.getPathIterator(null); 271 int windingRule = pathIterator.getWindingRule(); 272 for (VectorPrimitive member : pathIteratorToObjects(tile, layer, featureObjects, pathIterator)) { 271 273 final String role; 272 274 if (member instanceof VectorWay && ((VectorWay) member).isClosed()) { 275 // Area messes up the winding. See #22404. 276 if (windingRule == PathIterator.WIND_NON_ZERO) { 277 VectorWay vectorWay = (VectorWay) member; 278 List<VectorNode> nodes = new ArrayList<>(vectorWay.getNodes()); 279 Collections.reverse(nodes); 280 vectorWay.setNodes(nodes); 281 } 273 282 role = Geometry.isClockwise(((VectorWay) member).getNodes()) ? "outer" : "inner"; 274 283 } else { … … 375 384 primitive = pathToWay(tile, layer, featureObjects, (Path2D) shape).stream().findFirst().orElse(null); 376 385 } else if (shape instanceof Area) { 377 primitive = areaToRelation(tile, layer, featureObjects, (Area) shape); 378 primitive.put(RELATION_TYPE, MULTIPOLYGON_TYPE); 386 VectorRelation vectorRelation = areaToRelation(tile, layer, featureObjects, (Area) shape); 387 if (vectorRelation.getMembersCount() != 1) { 388 primitive = vectorRelation; 389 primitive.put(RELATION_TYPE, MULTIPOLYGON_TYPE); 390 } else { 391 primitive = vectorRelation.getMember(0).getMember(); 392 } 379 393 } else { 380 394 // We shouldn't hit this, but just in case -
trunk/src/org/openstreetmap/josm/data/vector/VectorWay.java
r18214 r18578 131 131 @Override 132 132 public OsmPrimitiveType getType() { 133 return OsmPrimitiveType.WAY; 134 } 135 136 @Override 137 public OsmPrimitiveType getDisplayType() { 133 138 return this.isClosed() ? OsmPrimitiveType.CLOSEDWAY : OsmPrimitiveType.WAY; 134 139 } -
trunk/test/unit/org/openstreetmap/josm/data/imagery/vectortile/mapbox/style/LayersTest.java
r17879 r18578 62 62 void testFill() { 63 63 // Test a layer without a source (should fail) 64 assertThrows(NullPointerException.class, () -> new Layers(Json.createObjectBuilder()64 JsonObject emptyFill = Json.createObjectBuilder() 65 65 .add("type", Layers.Type.FILL.name()) 66 .add("id", "Empty Fill").build())); 66 .add("id", "Empty Fill").build(); 67 assertThrows(NullPointerException.class, () -> new Layers(emptyFill)); 67 68 68 69 // Test an empty fill layer … … 118 119 void testLine() { 119 120 // Test a layer without a source (should fail) 120 assertThrows(NullPointerException.class, () -> new Layers(Json.createObjectBuilder() 121 .add("type", Layers.Type.LINE.name()) 122 .add("id", "Empty Line").build())); 121 JsonObject emptyLine = Json.createObjectBuilder() 122 .add("type", Layers.Type.RASTER.name()) 123 .add("id", "Empty Raster").build(); 124 assertThrows(NullPointerException.class, () -> new Layers(emptyLine)); 123 125 124 126 JsonObject allLayoutProperties = Json.createObjectBuilder() … … 173 175 void testSymbol() { 174 176 // Test a layer without a source (should fail) 175 assertThrows(NullPointerException.class, () -> new Layers(Json.createObjectBuilder() 176 .add("type", Layers.Type.SYMBOL.name()) 177 .add("id", "Empty Symbol").build())); 177 JsonObject emptySymbol = Json.createObjectBuilder() 178 .add("type", Layers.Type.RASTER.name()) 179 .add("id", "Empty Raster").build(); 180 assertThrows(NullPointerException.class, () -> new Layers(emptySymbol)); 178 181 179 182 JsonObject allPaintProperties = Json.createObjectBuilder() … … 306 309 void testRaster() { 307 310 // Test a layer without a source (should fail) 308 assertThrows(NullPointerException.class, () -> new Layers(Json.createObjectBuilder()311 JsonObject emptyRaster = Json.createObjectBuilder() 309 312 .add("type", Layers.Type.RASTER.name()) 310 .add("id", "Empty Raster").build())); 313 .add("id", "Empty Raster").build(); 314 assertThrows(NullPointerException.class, () -> new Layers(emptyRaster)); 311 315 312 316 JsonObject allPaintProperties = Json.createObjectBuilder() … … 349 353 void testCircle() { 350 354 // Test a layer without a source (should fail) 351 assertThrows(NullPointerException.class, () -> new Layers(Json.createObjectBuilder()355 JsonObject emptyCircle = Json.createObjectBuilder() 352 356 .add("type", Layers.Type.CIRCLE.name()) 353 .add("id", "Empty Circle").build())); 357 .add("id", "Empty Circle").build(); 358 assertThrows(NullPointerException.class, () -> new Layers(emptyCircle)); 354 359 355 360 JsonObject allPaintProperties = Json.createObjectBuilder() … … 400 405 void testFillExtrusion() { 401 406 // Test a layer without a source (should fail) 402 assertThrows(NullPointerException.class, () -> new Layers(Json.createObjectBuilder()407 JsonObject emptyFillExtrusion = Json.createObjectBuilder() 403 408 .add("type", Layers.Type.FILL_EXTRUSION.name()) 404 .add("id", "Empty Fill Extrusion").build())); 409 .add("id", "Empty Fill Extrusion").build(); 410 assertThrows(NullPointerException.class, () -> new Layers(emptyFillExtrusion)); 405 411 406 412 JsonObject allPaintProperties = Json.createObjectBuilder() … … 439 445 void testHeatmap() { 440 446 // Test a layer without a source (should fail) 441 assertThrows(NullPointerException.class, () -> new Layers(Json.createObjectBuilder()447 JsonObject emptyHeatmap = Json.createObjectBuilder() 442 448 .add("type", Layers.Type.HEATMAP.name()) 443 .add("id", "Empty Heatmap").build())); 449 .add("id", "Empty Heatmap").build(); 450 assertThrows(NullPointerException.class, () -> new Layers(emptyHeatmap)); 444 451 445 452 JsonObject allPaintProperties = Json.createObjectBuilder() … … 476 483 void testHillshade() { 477 484 // Test a layer without a source (should fail) 478 assertThrows(NullPointerException.class, () -> new Layers(Json.createObjectBuilder()485 JsonObject emptyHillshade = Json.createObjectBuilder() 479 486 .add("type", Layers.Type.HILLSHADE.name()) 480 .add("id", "Empty Hillshade").build())); 487 .add("id", "Empty Hillshade").build(); 488 assertThrows(NullPointerException.class, () -> new Layers(emptyHillshade)); 481 489 482 490 JsonObject allPaintProperties = Json.createObjectBuilder() … … 516 524 void testSky() { 517 525 // Test a layer without a source (should fail) 518 assertThrows(NullPointerException.class, () -> new Layers(Json.createObjectBuilder()526 JsonObject emptySky = Json.createObjectBuilder() 519 527 .add("type", Layers.Type.SKY.name()) 520 .add("id", "Empty Sky").build())); 528 .add("id", "Empty Sky").build(); 529 assertThrows(NullPointerException.class, () -> new Layers(emptySky)); 521 530 522 531 JsonObject allPaintProperties = Json.createObjectBuilder() … … 580 589 .add("maxzoom", 24) 581 590 .build()); 582 assertEquals(MessageFormat.format(baseString, "|z-2 4"), maxZoomLayer.toString());591 assertEquals(MessageFormat.format(baseString, "|z-23"), maxZoomLayer.toString()); 583 592 584 593 Layers minMaxZoomLayer = new Layers(Json.createObjectBuilder(baseInformation) 585 594 .add("minzoom", 1) 586 .add("maxzoom", 2)595 .add("maxzoom", 3) 587 596 .build()); 588 597 assertEquals(MessageFormat.format(baseString, "|z1-2"), minMaxZoomLayer.toString()); … … 593 602 .build()); 594 603 assertEquals(MessageFormat.format(baseString, "|z2"), sameMinMaxZoomLayer.toString()); 604 Layers zeroMaxZoom = new Layers(Json.createObjectBuilder(baseInformation) 605 .add("maxzoom", 0) 606 .build()); 607 assertEquals(MessageFormat.format(baseString, "|z-0"), zeroMaxZoom.toString()); 595 608 } 596 609 -
trunk/test/unit/org/openstreetmap/josm/data/vector/VectorWayTest.java
r18037 r18578 87 87 assertFalse(way.isClosed()); 88 88 assertEquals(OsmPrimitiveType.WAY, way.getType()); 89 assertEquals(OsmPrimitiveType.WAY, way.getDisplayType()); 89 90 List<VectorNode> nodes = new ArrayList<>(way.getNodes()); 90 91 nodes.add(nodes.get(0)); 91 92 way.setNodes(nodes); 92 93 assertTrue(way.isClosed()); 93 assertEquals(OsmPrimitiveType.CLOSEDWAY, way.getType()); 94 assertEquals(OsmPrimitiveType.WAY, way.getType()); 95 assertEquals(OsmPrimitiveType.CLOSEDWAY, way.getDisplayType()); 94 96 } 95 97
Note:
See TracChangeset
for help on using the changeset viewer.