Skip to content

Commit

Permalink
Merge pull request #232 from louis-e/multipolygon-building-levels-fix
Browse files Browse the repository at this point in the history
fix: respect building:levels tag from OSM relations
  • Loading branch information
louis-e authored Jan 7, 2025
2 parents 05cd857 + 6e8160c commit aea28d1
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 13 deletions.
2 changes: 1 addition & 1 deletion src/data_processing.rs
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ pub fn generate_world(
match element {
ProcessedElement::Way(way) => {
if way.tags.contains_key("building") || way.tags.contains_key("building:part") {
buildings::generate_buildings(&mut editor, way, ground_level, args);
buildings::generate_buildings(&mut editor, way, ground_level, args, None);
} else if way.tags.contains_key("highway") {
highways::generate_highways(&mut editor, element, ground_level, args);
} else if way.tags.contains_key("landuse") {
Expand Down
24 changes: 21 additions & 3 deletions src/element_processing/buildings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ pub fn generate_buildings(
element: &ProcessedWay,
ground_level: i32,
args: &Args,
relation_levels: Option<i32>,
) {
let mut previous_node: Option<(i32, i32)> = None;
let mut corner_addup: (i32, i32, i32) = (0, 0, 0);
Expand Down Expand Up @@ -80,6 +81,10 @@ pub fn generate_buildings(
}
}

if let Some(levels) = relation_levels {
building_height = levels * 4 + 2;
}

if let Some(amenity_type) = element.tags.get("amenity") {
if amenity_type == "shelter" {
let roof_block: Block = STONE_BRICK_SLAB;
Expand Down Expand Up @@ -410,15 +415,28 @@ pub fn generate_building_from_relation(
ground_level: i32,
args: &Args,
) {
// Extract levels from relation tags
let relation_levels = relation
.tags
.get("building:levels")
.and_then(|l| l.parse::<i32>().ok())
.unwrap_or(2); // Default to 2 levels

// Process the outer way to create the building walls
for member in &relation.members {
if member.role == ProcessedMemberRole::Outer {
generate_buildings(editor, &member.way, ground_level, args);
generate_buildings(
editor,
&member.way,
ground_level,
args,
Some(relation_levels),
);
}
}

// Handle inner ways (holes, courtyards, etc.)
for member in &relation.members {
/*for member in &relation.members {
if member.role == ProcessedMemberRole::Inner {
let polygon_coords: Vec<(i32, i32)> =
member.way.nodes.iter().map(|n| (n.x, n.z)).collect();
Expand All @@ -430,7 +448,7 @@ pub fn generate_building_from_relation(
editor.set_block(AIR, x, ground_level, z, None, Some(&[SPONGE]));
}
}
}
}*/
}

fn find_nearest_block_in_color_map(
Expand Down
3 changes: 2 additions & 1 deletion src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -128,12 +128,13 @@ fn main() {
panic::set_hook(Box::new(|panic_info| {
let message = format!("Application panicked: {:?}", panic_info);
error!("{}", message);
std::process::exit(1);
}));

tauri::Builder::default()
.plugin(
LogBuilder::default()
.level(LevelFilter::Trace)
.level(LevelFilter::Warn)
.targets([
Target::new(TargetKind::LogDir {
file_name: Some("arnis.log".into()),
Expand Down
11 changes: 3 additions & 8 deletions src/osm_parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,9 @@ pub struct ProcessedMember {

#[derive(Debug)]
pub struct ProcessedRelation {
id: u64,
pub members: Vec<ProcessedMember>,
pub id: u64,
pub tags: HashMap<String, String>,
pub members: Vec<ProcessedMember>,
}

#[derive(Debug)]
Expand Down Expand Up @@ -240,12 +240,7 @@ pub fn parse_osm_data(
let role = match mem.role.as_str() {
"outer" => ProcessedMemberRole::Outer,
"inner" => ProcessedMemberRole::Inner,
_ => {
// We only care about outer/inner because
// we just want multipolygons at the current time

return None;
}
_ => return None,
};

let way: ProcessedWay = ways_map
Expand Down

0 comments on commit aea28d1

Please sign in to comment.