private boolean listContains(final RelationMemberList list, final String role) { for (final RelationMember member : list) { if (member.getRole().equals(role)) { return true; } } return false; } }
private boolean isSameRoadViaAndTo(final Relation relation) { final Set<Long> fromIdentifiers = new TreeSet<>(); final Set<Long> toIdentifiers = new TreeSet<>(); relation.members().stream().filter(member -> "to".equals(member.getRole())) .forEach(member -> toIdentifiers.add(member.getEntity().getIdentifier())); relation.members().stream().filter(member -> "from".equals(member.getRole())) .forEach(member -> fromIdentifiers.add(member.getEntity().getIdentifier())); return fromIdentifiers.equals(toIdentifiers); }
@Override public String toString() { final StringBuilder builder = new StringBuilder(); builder.append("{Member: ID = "); builder.append(this.getEntity().getIdentifier()); builder.append(", Type = "); builder.append(this.getEntity().getType()); builder.append(", Role = "); builder.append(this.getRole()); builder.append("}"); return builder.toString(); } }
@Override public boolean equals(final Object other) { if (other instanceof RelationMember) { final RelationMember that = (RelationMember) other; return StringUtils.equals(this.getRole(), that.getRole()) && this.getRelationIdentifier() == that.getRelationIdentifier() && this.entity.getIdentifier() == that.getEntity().getIdentifier(); } return false; }
/** * Checks if an {@link AtlasObject} is a outline or part member of a building relation. This is * an equivalent tagging to building=* or building:part=yes. * * @param object * {@link AtlasObject} to check * @return true if the object is part of any relation where it has role outline or part */ private boolean isBuildingRelationMember(final AtlasObject object) { return object instanceof AtlasEntity && ((AtlasEntity) object).relations().stream() .anyMatch(relation -> Validators.isOfType(relation, RelationTypeTag.class, RelationTypeTag.BUILDING) && relation.members().stream() .anyMatch(member -> member.getEntity().equals(object) && (member.getRole().equals("outline")) || member.getRole().equals("part"))); }
private boolean hasChildAreaAsBuilding(final Relation relation) { for (final RelationMember member : relation.members()) { final AtlasEntity entity = member.getEntity(); final String role = member.getRole(); if (entity instanceof Area && RelationTypeTag.MULTIPOLYGON_ROLE_OUTER.equals(role) && isBuilding((Area) entity)) { return true; } } return false; }
/** * Helper function for filtering invalid Relation members. Each Relation member must be an Area, * have either an inner or outer role, and the inner role must not contain the natural=rock tag. * * @param member * - RelationMember * @return true if member is valid */ private boolean isValidMultiPolygonRelationMember(final RelationMember member) { return member.getEntity() instanceof Area && !this.isFlagged(member.getEntity().getIdentifier()) && (member.getRole().equals(RelationTypeTag.MULTIPOLYGON_ROLE_OUTER) || (member.getRole().equals(RelationTypeTag.MULTIPOLYGON_ROLE_INNER) && !Validators.isOfType(member.getEntity(), NaturalTag.class, NaturalTag.ROCK))); }
/** * This check determines whether an entity is part of an associated street relation. * * @param object * An Atlas entity * @return True if the point is part of an associated street relation, false otherwise. */ private boolean hasAssociatedStreetRelation(final AtlasObject object) { final Point point = (Point) object; return point.relations().stream() .filter(relation -> Validators.isOfType(relation, RelationTypeTag.class, RelationTypeTag.ASSOCIATEDSTREET)) .anyMatch(relation -> relation.members().stream() .anyMatch(member -> member.getRole().equals(STREET_RELATION_ROLE) && member.getEntity().getType().equals(ItemType.EDGE))); } }
private boolean shouldAddRelationMember(final Set<TemporaryRelationMember> membersToRemove, final RelationMember member) { final TemporaryRelationMember temporary = new TemporaryRelationMember( member.getEntity().getIdentifier(), member.getRole(), member.getEntity().getType()); if (membersToRemove.contains(temporary)) { // Optimization to shorten our removal list membersToRemove.remove(temporary); return false; } // If we get here, this member isn't on the list of removed members return true; } }
public RelationBean asBean() { final RelationBean result = new RelationBean(); for (final RelationMember member : this.members) { result.addItem(member.getEntity().getIdentifier(), member.getRole(), member.getEntity().getType()); } this.explicitlyExcluded.forEach(result::addItemExplicitlyExcluded); return result; }
@Override public LocationIterableProperties toGeoJsonBuildingBlock() { final Map<String, String> tags = getTags(); tags.put("identifier", String.valueOf(getIdentifier())); tags.put("osmIdentifier", String.valueOf(getOsmIdentifier())); tags.put("itemType", String.valueOf(getType())); final Optional<String> shardName = getAtlas().metaData().getShardName(); shardName.ifPresent(shard -> tags.put("shard", shard)); final StringList parentRelations = new StringList(); this.relations().forEach(relation -> { final RelationMember member = relation.members().get(getIdentifier(), getType()); parentRelations.add(member.getRelationIdentifier() + "-" + member.getRole()); }); if (!parentRelations.isEmpty()) { tags.put("parentRelations", parentRelations.join(", ")); } return new GeoJsonBuilder.LocationIterableProperties(getClosedGeometry(), tags); }
/** * @return the {@link RelationBean} representation of the Relation */ public RelationBean getBean() { final RelationBean bean = new RelationBean(); for (final RelationMember member : this) { final AtlasEntity entity = member.getEntity(); bean.addItem(entity.getIdentifier(), member.getRole(), entity.getType()); } return bean; }
private void addRelation(final PackedAtlasBuilder builder, final Relation relation) { final RelationBean bean = new RelationBean(); relation.members().forEach(member -> bean.addItem(member.getEntity().getIdentifier(), member.getRole(), member.getEntity().getType())); builder.addRelation(relation.getIdentifier(), relation.osmRelationIdentifier(), bean, relation.getTags()); } }
private void validateRelationMembersPresent() { for (final Relation relation : this.atlas.relations()) { for (final RelationMember relationMember : relation.members()) { if (relationMember.getEntity() == null || this.atlas.entity(relationMember.getEntity().getIdentifier(), relationMember.getEntity().getType()) == null) { throw new CoreException( "Relation {} specifies a member with role \"{}\" that is not present in the Atlas.", relation.getIdentifier(), relationMember.getRole()); } } } } }
private String convertRelationBean(final Relation relation) { final StringList bean = new StringList(); for (final RelationMember member : relation.members()) { final StringList list = new StringList(); list.add(member.getEntity().getIdentifier()); list.add(member.getRole()); final ItemType type = ItemType.forEntity(member.getEntity()); list.add(type.toShortString()); bean.add(list.join(TERTIARY_SEPARATOR)); } return bean.join(SECONDARY_SEPARATOR); }
@Test public void testRemoveRelationMemberIsReflectedInMemberListAutomatically() { final Atlas atlas = this.rule.getAtlas(); final ChangeBuilder changeBuilder = new ChangeBuilder(); final Relation disconnectedFeatures = atlas.relation(41834000000L); // Remove the point from the list final RelationMemberList newMembers = new RelationMemberList(disconnectedFeatures.members() .stream().filter(member -> !(member.getEntity() instanceof Point)) .collect(Collectors.toList())); // Here only remove the point. Do not remove the member in the relation. It should // automatically be removed. changeBuilder.add(new FeatureChange(ChangeType.REMOVE, CompletePoint.shallowFrom(atlas.point(41822000000L)))); final Change change = changeBuilder.get(); final Atlas changeAtlas = new ChangeAtlas(atlas, change); Assert.assertEquals(newMembers.asBean(), changeAtlas.relation(41834000000L).members().asBean()); final Relation parentRelation = changeAtlas.relation(41860000000L); final Relation fromRelation = (Relation) Iterables.stream(parentRelation.members()) .firstMatching(member -> "child1".equals(member.getRole())).get().getEntity(); Assert.assertEquals(newMembers.asBean(), fromRelation.members().asBean()); }
private AtlasPrimitiveRelation convert(final Relation relation) { final RelationBean bean = new RelationBean(); for (final RelationMember member : relation.members()) { bean.addItem(member.getEntity().getIdentifier(), member.getRole(), member.getEntity().getType()); } return new AtlasPrimitiveRelation(relation.getIdentifier(), relation.getIdentifier(), bean, relation.getTags(), relation.bounds()); }
@Test public void testMovePoint() { final Atlas atlas = this.rule.getAtlas(); final ChangeBuilder changeBuilder = new ChangeBuilder(); final Point source = atlas.point(41822000000L); final Location newLocation = source.getLocation().shiftAlongGreatCircle(Heading.NORTH, Distance.ONE_METER); changeBuilder.add(new FeatureChange(ChangeType.ADD, CompletePoint.shallowFrom(source).withLocation(newLocation))); final Change change = changeBuilder.get(); final Atlas changeAtlas = new ChangeAtlas(atlas, change); Assert.assertEquals(newLocation, changeAtlas.point(41822000000L).getLocation()); final Relation disconnectedFeatures = changeAtlas.relation(41834000000L); final Point fromRelation = (Point) Iterables.stream(disconnectedFeatures.members()) .firstMatching(member -> "tree".equals(member.getRole())).get().getEntity(); Assert.assertEquals(newLocation, fromRelation.getLocation()); }
@Test public void testMoveLine() { final Atlas atlas = this.rule.getAtlas(); final ChangeBuilder changeBuilder = new ChangeBuilder(); final Line source = atlas.line(41771000000L); final PolyLine origin = source.asPolyLine(); final PolyLine newPolyLine = origin.shiftFirstAlongGreatCircle(Heading.NORTH, Distance.ONE_METER); changeBuilder.add(new FeatureChange(ChangeType.ADD, CompleteLine.shallowFrom(source).withPolyLine(newPolyLine))); final Change change = changeBuilder.get(); final Atlas changeAtlas = new ChangeAtlas(atlas, change); Assert.assertEquals(newPolyLine, changeAtlas.line(41771000000L).asPolyLine()); final Relation disconnectedFeatures = changeAtlas.relation(41834000000L); final Line fromRelation = (Line) Iterables.stream(disconnectedFeatures.members()) .firstMatching(member -> "river".equals(member.getRole())).get().getEntity(); Assert.assertEquals(newPolyLine, fromRelation.asPolyLine()); }
@Test public void testMoveArea() { final Atlas atlas = this.rule.getAtlas(); final ChangeBuilder changeBuilder = new ChangeBuilder(); final Area source = atlas.area(41795000000L); final Polygon origin = source.asPolygon(); final Polygon newPolygon = new Polygon( origin.shiftFirstAlongGreatCircle(Heading.NORTH, Distance.ONE_METER)); changeBuilder.add(new FeatureChange(ChangeType.ADD, CompleteArea.shallowFrom(source).withPolygon(newPolygon))); final Change change = changeBuilder.get(); final Atlas changeAtlas = new ChangeAtlas(atlas, change); Assert.assertEquals(newPolygon, changeAtlas.area(41795000000L).asPolygon()); final Relation disconnectedFeatures = changeAtlas.relation(41834000000L); final Area fromRelation = (Area) Iterables.stream(disconnectedFeatures.members()) .firstMatching(member -> "pond".equals(member.getRole())).get().getEntity(); Assert.assertEquals(newPolygon, fromRelation.asPolygon()); }