| | 414 | * Import may create duplicate ways were one is member of a multipolygon and untagged and the other is tagged. |
| | 415 | * Try to merge them here. |
| | 416 | */ |
| | 417 | private void mergeEqualMultipolygonWays() { |
| | 418 | DuplicateWay test = new DuplicateWay(); |
| | 419 | test.startTest(null); |
| | 420 | for (Way w: getDataSet().getWays()) { |
| | 421 | test.visit(w); |
| | 422 | } |
| | 423 | test.endTest(); |
| | 424 | |
| | 425 | if (test.getErrors().isEmpty()) |
| | 426 | return; |
| | 427 | |
| | 428 | for (TestError e : test.getErrors()) { |
| | 429 | if (e.getPrimitives().size() == 2 && !e.isFixable()) { |
| | 430 | Way mpWay = null; |
| | 431 | Way tagged = null; |
| | 432 | for (OsmPrimitive p : e.getPrimitives()) { |
| | 433 | if (p.isTagged() && p.referrers(Relation.class).count() == 0) |
| | 434 | tagged = (Way) p; |
| | 435 | else if (p.referrers(Relation.class).anyMatch(Relation::isMultipolygon)) |
| | 436 | mpWay = (Way) p; |
| | 437 | } |
| | 438 | if (mpWay != null && tagged != null) { |
| | 439 | for (Relation r : mpWay.referrers(Relation.class).filter(Relation::isMultipolygon) |
| | 440 | .collect(Collectors.toList())) { |
| | 441 | for (int i = 0; i < r.getMembersCount(); i++) { |
| | 442 | if (r.getMember(i).getMember().equals(mpWay)) { |
| | 443 | r.setMember(i, new RelationMember(r.getRole(i), tagged)); |
| | 444 | } |
| | 445 | } |
| | 446 | } |
| | 447 | mpWay.setDeleted(true); |
| | 448 | } |
| | 449 | } |
| | 450 | } |
| | 451 | ds.cleanupDeletedPrimitives(); |
| | 452 | } |
| | 453 | |
| | 454 | /** |