@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(); } }
/** * Converts a RelationMember to a polygon if that member is an area. * * @param member * any RelationMember object * @return an polygon containing the geometry of member if it is an area, otherwise an empty * optional. */ private Optional<Polygon> toPolygon(final RelationMember member) { if (member.getEntity().getType().equals(ItemType.AREA)) { return Optional.of(((Area) member.getEntity()).asPolygon()); } return Optional.empty(); }
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); }
/** * 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))); }
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; }
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; }
/** * 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 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()); } } } } }
/** * 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))); } }
@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; }
/** * @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 boolean differentRelationMemberListsWithMatch(final RelationMemberList baseMembers, final RelationMemberList alterMembers) { final SortedSet<Edge> baseEdges = Iterables.stream(baseMembers) .map(member -> member.getEntity()).filter(entity -> entity instanceof Edge) .map(entity -> (Edge) entity).collectToSortedSet(); final SortedSet<Edge> alterEdges = Iterables.stream(alterMembers) .map(member -> member.getEntity()).filter(entity -> entity instanceof Edge) .map(entity -> (Edge) entity).collectToSortedSet(); return differentEdgeSet(baseEdges, alterEdges); }
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 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); }
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 testRelationMemberLocationItemInclusion() { // Based on https://www.openstreetmap.org/relation/578254 - the Node in the Relation gets // created as both an Atlas point and node. Let's verify that the Relation consists of both. final Atlas slicedRawAtlas = this.setup.getNodeAndPointAsRelationMemberAtlas(); final CountryBoundaryMap boundaryMap = CountryBoundaryMap .fromPlainText(new InputStreamResource(() -> WaySectionProcessorTest.class .getResourceAsStream("nodeAndPointRelationMemberBoundaryMap.txt"))); final Atlas finalAtlas = new WaySectionProcessor(slicedRawAtlas, AtlasLoadingOption.createOptionWithAllEnabled(boundaryMap)).run(); final RelationMemberList members = finalAtlas.relation(578254000000L).members(); Assert.assertEquals("Six members - 2 pairs of reverse edges, 1 node and 1 point", 6, members.size()); Assert.assertEquals("Single point", 1, members.stream() .filter(member -> member.getEntity().getType() == ItemType.POINT).count()); Assert.assertEquals("Single node", 1, members.stream() .filter(member -> member.getEntity().getType() == ItemType.NODE).count()); }
@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()); }