private static Collection<Way> findRoofLinesWays(Way way) { List<Way> process = new ArrayList<Way>(); process.add(way); Set<Way> processed = new HashSet<Way>(); // processed.add(way); while (!process.isEmpty()) { Way proc = process.remove(0); List<Way> childWays = findChildRoofLines(proc); for(Way childWay : childWays) { if (processed.contains(childWay)) { continue; } if (isEdge(childWay) || isRidge(childWay)) { processed.add(childWay); process.add(childWay); } } } // test if it is inside outline! //TODO return processed; }
/** * @param apexNode * @param roofLine */ private static void findApexNodes(List<Node> apexNode, Way roofLine) { for (int i = 0; i < roofLine.getNodesCount(); i++) { Node node = roofLine.getNode(i); if (isApex(node)) { apexNode.add(node); } } }
roofLinesWays = findRoofLinesWays(way); findApexNodes(apexNode, way); roofHeight = parseRoofHeight(primitive); } else if (primitive instanceof Relation && ((Relation) primitive).isMultipolygon()) { Relation mp = (Relation) primitive; roofHeight = parseRoofHeight(primitive); roofLinesWays.addAll(findRoofLinesWays(way)); findApexNodes(apexNode, way); roofLinesWays.addAll(findRoofLinesWays(way)); findApexNodes(apexNode, way); if (isEdge(roofLine)) { edgesWay.add(roofLine); } else if (isRidge(roofLine)) { ridgesWay.add(roofLine); findApexNodes(apexNode, roofLine); Point2d [] points = transform(edgeWay, perspective); for (int i = 1; i < points.length; i++) { innerSegments.add(new LineSegment2d(points[i-1], points[i])); Point2d [] points = transform(ridgeWay, perspective); for (int i = 0; i < points.length; i++) { roofHeightMap.put(points[i], ridgeHeight);
private static List<Way> findChildRoofLines(Way way) { List<Way> ret = new ArrayList<Way>(); for (int i = 0; i < way.getNodesCount(); i++) { Node node = way.getNode(i); List<OsmPrimitive> referrers = node.getReferrers(); for(OsmPrimitive ref : referrers) { if (ref.equals(way)) { continue; } if (!(ref instanceof Way)) { continue; } if (isEdge(( Way)ref) || isRidge(( Way)ref)) { ret.add((Way)ref); } } } return ret; }
/** * Parse roof model from way. * * @param primitive * @param perspective * @return roof model */ public static RoofModel parse(OsmPrimitive primitive, Perspective perspective) { if (hasRoofLines(primitive)) { return RoofLinesParser.parse(primitive, perspective); } return parseDormerRoof(primitive, perspective); }
private static boolean hasRoofLines(OsmPrimitive primitive) { if (!StringUtil.isBlankOrNull(parseRoofShape(primitive))) { return false; } // not tagged flat roofs should be resolved as regular flat roofs! return RoofLinesParser.hasRoofLines(primitive); }
public static boolean hasRoofLines(OsmPrimitive primitive) { if (primitive instanceof Way) { Way way = (Way) primitive; return hasWayRoofLines(way); } else if(primitive instanceof Relation && ((Relation) primitive).isMultipolygon()) { Relation mp = (Relation) primitive; for (RelationMember relationMember : mp.getMembers()) { Way way = relationMember.getWay(); if (way == null) { continue; } if (hasWayRoofLines(way)) { return true; } } } else { // TODO for relations //PolygonWithHolesUtil.findPolygonsWithHoles(pRelation, pPerspective) } return false; }
/** * @param way */ private static boolean hasWayRoofLines(Way way) { for (int i = 0; i < way.getNodesCount(); i++) { Node node = way.getNode(i); List<OsmPrimitive> referrers = node.getReferrers(); for (OsmPrimitive ref : referrers) { if (ref.equals(way)) { continue; } if (!(ref instanceof Way)) { continue; } if (isEdge((Way) ref) || isRidge((Way) ref)) { return true; } } } return false; }