From 384d5c2deb8e12e9503ff2ab649d76b1a2db8143 Mon Sep 17 00:00:00 2001 From: Yamil Essus Date: Fri, 16 Jan 2026 13:51:26 -0500 Subject: [PATCH 1/7] added bearing computation --- rust/bambam-omf/src/graph/omf_graph.rs | 4 +++- rust/bambam-omf/src/graph/serialize_ops.rs | 18 +++++++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/rust/bambam-omf/src/graph/omf_graph.rs b/rust/bambam-omf/src/graph/omf_graph.rs index 13ceb34e..90516886 100644 --- a/rust/bambam-omf/src/graph/omf_graph.rs +++ b/rust/bambam-omf/src/graph/omf_graph.rs @@ -31,6 +31,7 @@ pub struct OmfEdgeList { pub classes: Vec, pub speeds: Vec, pub speed_lookup: HashMap, + pub bearings: Vec } impl OmfGraphVectorized { @@ -96,7 +97,7 @@ impl OmfGraphVectorized { edge_list_id, )?; let geometries = ops::create_geometries(&segments, &segment_lookup, &splits)?; - + let bearings = ops::bearing_deg_from_geometries(&geometries)?; let classes = ops::create_segment_full_types(&segments, &segment_lookup, &splits)?; let speeds = ops::create_speeds(&segments, &segment_lookup, &splits)?; @@ -140,6 +141,7 @@ impl OmfGraphVectorized { classes, speeds, speed_lookup, + bearings }; edge_lists.push(edge_list); } diff --git a/rust/bambam-omf/src/graph/serialize_ops.rs b/rust/bambam-omf/src/graph/serialize_ops.rs index 5fa8488d..2b923112 100644 --- a/rust/bambam-omf/src/graph/serialize_ops.rs +++ b/rust/bambam-omf/src/graph/serialize_ops.rs @@ -1,4 +1,4 @@ -use geo::{Coord, LineString}; +use geo::{Coord, LineString, Haversine, Bearing}; use itertools::Itertools; use kdam::{tqdm, Bar, BarExt}; use rayon::prelude::*; @@ -281,3 +281,19 @@ pub fn get_global_average_speed( Ok(weighted_sum / total_length) } + +/// Computes the outward bearings of the geometries representing +/// segment splits using the last two point in the LineStrings +pub fn bearing_deg_from_geometries(geometries: &[LineString]) -> Result, OvertureMapsCollectionError>{ + geometries.iter().map( + |linestring|{ + let n = linestring.0.len(); + if n < 2 { + return Err(OvertureMapsCollectionError::InternalError(format!("cannot compute bearing on linestring with less than two points: {:?}", linestring))); + } + let p0 = linestring.0[n - 2]; + let p1 = linestring.0[n - 1]; + Ok(Haversine.bearing(p0.into(), p1.into()) as f64) + } + ).collect() +} \ No newline at end of file From 04453dd577cb373b17eefb7aebfa815363d91ee2 Mon Sep 17 00:00:00 2001 From: Yamil Essus Date: Fri, 16 Jan 2026 14:18:42 -0500 Subject: [PATCH 2/7] refactor serialization of attributes --- rust/bambam-omf/src/graph/omf_graph.rs | 313 +++++++-------------- rust/bambam-omf/src/graph/serialize_ops.rs | 22 +- rust/bambam-omf/src/util/fs.rs | 100 ++++++- 3 files changed, 209 insertions(+), 226 deletions(-) diff --git a/rust/bambam-omf/src/graph/omf_graph.rs b/rust/bambam-omf/src/graph/omf_graph.rs index 90516886..17829852 100644 --- a/rust/bambam-omf/src/graph/omf_graph.rs +++ b/rust/bambam-omf/src/graph/omf_graph.rs @@ -1,4 +1,4 @@ -use std::{collections::HashMap, fs::File, path::Path}; +use std::{collections::HashMap, path::Path}; use super::serialize_ops as ops; use crate::{ @@ -9,14 +9,20 @@ use crate::{ }, graph::{segment_ops, vertex_serializable::VertexSerializable}, }; -use csv::QuoteStyle; -use flate2::{write::GzEncoder, Compression}; use geo::LineString; +use itertools::Itertools; use kdam::tqdm; use rayon::prelude::*; use routee_compass_core::model::network::{EdgeConfig, EdgeList, EdgeListId, Vertex}; use wkt::ToWkt; +pub const COMPASS_VERTEX_FILENAME: &str = "vertices_compass.csv.gz"; +pub const COMPASS_EDGES_FILENAME: &str = "edges-compass.csv.gz"; +pub const GEOMETRIES_FILENAME: &str = "edges-geometries-enumerated.txt.gz"; +pub const SPEEDS_FILENAME: &str = "edges-speeds-mph-enumerated.txt.gz"; +pub const CLASSES_FILENAME: &str = "edges-classes-enumerated.txt.gz"; +pub const SPEED_MAPPING_FILENAME: &str = "edges-classes-speed-mapping.csv.gz"; + pub struct OmfGraphVectorized { pub vertices: Vec, pub edge_lists: Vec, @@ -31,7 +37,7 @@ pub struct OmfEdgeList { pub classes: Vec, pub speeds: Vec, pub speed_lookup: HashMap, - pub bearings: Vec + pub bearings: Vec, } impl OmfGraphVectorized { @@ -141,7 +147,7 @@ impl OmfGraphVectorized { classes, speeds, speed_lookup, - bearings + bearings, }; edge_lists.push(edge_list); } @@ -168,38 +174,21 @@ impl OmfGraphVectorized { })?; // create output directory if missing crate::util::fs::create_dirs(output_directory)?; + use crate::util::fs::serialize_into_csv; + use crate::util::fs::serialize_into_enumerated_txt; // write vertices - let mut vertex_writer = create_writer( + serialize_into_csv( + &self + .vertices + .iter() + .map(|v| VertexSerializable::from(*v)) + .collect::>(), + COMPASS_VERTEX_FILENAME, output_directory, - "vertices-compass.csv.gz", - true, - QuoteStyle::Necessary, overwrite, - ); - let v_iter = tqdm!( - self.vertices.iter(), - total = self.vertices.len(), - desc = "write vertex dataset" - ); - for vertex in v_iter { - if let Some(ref mut writer) = vertex_writer { - let vertex_ser = VertexSerializable::from(*vertex); - writer.serialize(vertex_ser).map_err(|e| { - OvertureMapsCollectionError::CsvWriteError(format!( - "Failed to write to vertices-compass.csv.gz: {e}" - )) - })?; - } - } - eprintln!(); - if let Some(ref mut writer) = vertex_writer { - writer.flush().map_err(|e| { - OvertureMapsCollectionError::CsvWriteError(format!( - "Failed to flush vertices-compass.csv.gz: {e}" - )) - })?; - } + "write vertex dataset", + )?; // write each edge list let edge_list_iter = tqdm!( @@ -209,182 +198,72 @@ impl OmfGraphVectorized { position = 0 ); for (edge_list, edge_list_config) in edge_list_iter { - let mode_dir = output_directory.join(&edge_list_config.mode); + let mode_str = &edge_list_config.mode; + let mode_dir = output_directory.join(mode_str); crate::util::fs::create_dirs(&mode_dir)?; - let mut edge_writer = create_writer( - &mode_dir, - "edges-compass.csv.gz", - true, - QuoteStyle::Necessary, - overwrite, - ); - let mut geometries_writer = create_writer( - &mode_dir, - "edges-geometries-enumerated.txt.gz", - false, - QuoteStyle::Never, - overwrite, - ); - let mut classes_writer = create_writer( - &mode_dir, - "edges-classes-enumerated.txt.gz", - false, - QuoteStyle::Never, - overwrite, - ); - let mut speeds_writer = create_writer( - &mode_dir, - "edges-speeds-mph-enumerated.txt.gz", - false, - QuoteStyle::Never, - overwrite, - ); - let mut speeds_mapping_writer = create_writer( - &mode_dir, - "edges-classes-speed-mapping.csv.gz", - true, - QuoteStyle::Necessary, - overwrite, - ); - // Write Edges - let e_iter = tqdm!( - edge_list.edges.0.iter(), - total = edge_list.edges.len(), - desc = "edges", - position = 1 - ); - for row in e_iter { - if let Some(ref mut writer) = edge_writer { - let edge = EdgeConfig { + serialize_into_csv( + &edge_list + .edges + .0 + .iter() + .map(|row| EdgeConfig { edge_id: row.edge_id, src_vertex_id: row.src_vertex_id, dst_vertex_id: row.dst_vertex_id, distance: row.distance.get::(), - }; - writer.serialize(edge).map_err(|e| { - OvertureMapsCollectionError::CsvWriteError(format!( - "Failed to write to edges-compass.csv.gz: {e}" - )) - })?; - } - } - eprintln!(); - - if let Some(ref mut writer) = edge_writer { - writer.flush().map_err(|e| { - OvertureMapsCollectionError::CsvWriteError(format!( - "Failed to flush edges-compass.csv.gz: {e}" - )) - })?; - } + }) + .collect::>(), + COMPASS_EDGES_FILENAME, + &mode_dir, + overwrite, + "write edges", + )?; // Write geometries - let g_iter = tqdm!( - edge_list.geometries.iter(), - total = edge_list.geometries.len(), - desc = "geometries", - position = 1 - ); - for row in g_iter { - if let Some(ref mut writer) = geometries_writer { - writer - .serialize(row.to_wkt().to_string()) - .map_err(|e| { - OvertureMapsCollectionError::CsvWriteError(format!( - "Failed to write to geometry file edges-geometries-enumerated.txt.gz: {e}" - )) - })?; - } - } - eprintln!(); - - if let Some(ref mut writer) = geometries_writer { - writer.flush().map_err(|e| { - OvertureMapsCollectionError::CsvWriteError(format!( - "Failed to flush edges-geometries-enumerated.txt.gz: {e}" - )) - })?; - } + serialize_into_enumerated_txt( + &edge_list + .geometries + .iter() + .map(|row| row.to_wkt().to_string()) + .collect::>(), + GEOMETRIES_FILENAME, + &mode_dir, + overwrite, + "write geometries", + )?; // Write speeds - let s_iter = tqdm!( - edge_list.speeds.iter(), - total = edge_list.edges.len(), - desc = "speeds", - position = 1 - ); - for row in s_iter { - if let Some(ref mut writer) = speeds_writer { - writer.serialize(row).map_err(|e| { - OvertureMapsCollectionError::CsvWriteError(format!( - "Failed to write to edges-speeds-mph-enumerated.txt.gz: {e}" - )) - })?; - } - } - eprintln!(); - - if let Some(ref mut writer) = speeds_writer { - writer.flush().map_err(|e| { - OvertureMapsCollectionError::CsvWriteError(format!( - "Failed to flush edges-speeds-mph-enumerated.txt.gz: {e}" - )) - })?; - } + serialize_into_enumerated_txt( + &edge_list.speeds, + SPEEDS_FILENAME, + &mode_dir, + overwrite, + "write speeds", + )?; // Write classes - let c_iter = tqdm!( - edge_list.classes.iter(), - total = edge_list.classes.len(), - desc = "classes", - position = 1 - ); - for row in c_iter { - if let Some(ref mut writer) = classes_writer { - writer.serialize(row.as_str()).map_err(|e| { - OvertureMapsCollectionError::CsvWriteError(format!( - "Failed to write to geometry file edges-classes-enumerated.txt.gz: {e}" - )) - })?; - } - } - eprintln!(); - - if let Some(ref mut writer) = classes_writer { - writer.flush().map_err(|e| { - OvertureMapsCollectionError::CsvWriteError(format!( - "Failed to flush edges-classes-enumerated.txt.gz: {e}" - )) - })?; - } - - // Write classes-speed mapping - let c_iter = tqdm!( - edge_list.speed_lookup.iter(), - total = edge_list.speed_lookup.len(), - desc = "classes-speed-mapping", - position = 1 - ); - for row in c_iter { - if let Some(ref mut writer) = speeds_mapping_writer { - writer.serialize(row).map_err(|e| { - OvertureMapsCollectionError::CsvWriteError(format!( - "Failed to write to geometry file edges-classes-speed-mapping.csv.gz: {e}" - )) - })?; - } - } - eprintln!(); + serialize_into_enumerated_txt( + &edge_list + .classes + .iter() + .map(|class| class.as_str()) + .collect::>(), + CLASSES_FILENAME, + &mode_dir, + overwrite, + "write classes", + )?; - if let Some(ref mut writer) = speeds_mapping_writer { - writer.flush().map_err(|e| { - OvertureMapsCollectionError::CsvWriteError(format!( - "Failed to flush edges-classes-speed-mapping.csv.gz: {e}" - )) - })?; - } + // Write speed_mapping + serialize_into_csv( + &edge_list.speed_lookup.iter().collect_vec(), + SPEED_MAPPING_FILENAME, + &mode_dir, + overwrite, + "write speed mapping", + )?; } eprintln!(); @@ -396,25 +275,25 @@ impl OmfGraphVectorized { } } -/// helper function to build a filewriter for writing either .csv.gz or -/// .txt.gz files for compass datasets while respecting the user's overwrite -/// preferences and properly formatting WKT outputs. -fn create_writer( - directory: &Path, - filename: &str, - has_headers: bool, - quote_style: QuoteStyle, - overwrite: bool, -) -> Option>> { - let filepath = directory.join(filename); - if filepath.exists() && !overwrite { - return None; - } - let file = File::create(filepath).unwrap(); - let buffer = GzEncoder::new(file, Compression::default()); - let writer = csv::WriterBuilder::new() - .has_headers(has_headers) - .quote_style(quote_style) - .from_writer(buffer); - Some(writer) -} +// /// helper function to build a filewriter for writing either .csv.gz or +// /// .txt.gz files for compass datasets while respecting the user's overwrite +// /// preferences and properly formatting WKT outputs. +// fn create_writer( +// directory: &Path, +// filename: &str, +// has_headers: bool, +// quote_style: QuoteStyle, +// overwrite: bool, +// ) -> Option>> { +// let filepath = directory.join(filename); +// if filepath.exists() && !overwrite { +// return None; +// } +// let file = File::create(filepath).unwrap(); +// let buffer = GzEncoder::new(file, Compression::default()); +// let writer = csv::WriterBuilder::new() +// .has_headers(has_headers) +// .quote_style(quote_style) +// .from_writer(buffer); +// Some(writer) +// } diff --git a/rust/bambam-omf/src/graph/serialize_ops.rs b/rust/bambam-omf/src/graph/serialize_ops.rs index 2b923112..6e1608d7 100644 --- a/rust/bambam-omf/src/graph/serialize_ops.rs +++ b/rust/bambam-omf/src/graph/serialize_ops.rs @@ -1,4 +1,4 @@ -use geo::{Coord, LineString, Haversine, Bearing}; +use geo::{Bearing, Coord, Haversine, LineString}; use itertools::Itertools; use kdam::{tqdm, Bar, BarExt}; use rayon::prelude::*; @@ -284,16 +284,22 @@ pub fn get_global_average_speed( /// Computes the outward bearings of the geometries representing /// segment splits using the last two point in the LineStrings -pub fn bearing_deg_from_geometries(geometries: &[LineString]) -> Result, OvertureMapsCollectionError>{ - geometries.iter().map( - |linestring|{ +pub fn bearing_deg_from_geometries( + geometries: &[LineString], +) -> Result, OvertureMapsCollectionError> { + geometries + .iter() + .map(|linestring| { let n = linestring.0.len(); if n < 2 { - return Err(OvertureMapsCollectionError::InternalError(format!("cannot compute bearing on linestring with less than two points: {:?}", linestring))); + return Err(OvertureMapsCollectionError::InternalError(format!( + "cannot compute bearing on linestring with less than two points: {:?}", + linestring + ))); } let p0 = linestring.0[n - 2]; let p1 = linestring.0[n - 1]; Ok(Haversine.bearing(p0.into(), p1.into()) as f64) - } - ).collect() -} \ No newline at end of file + }) + .collect() +} diff --git a/rust/bambam-omf/src/util/fs.rs b/rust/bambam-omf/src/util/fs.rs index 99a6db34..afbd95d1 100644 --- a/rust/bambam-omf/src/util/fs.rs +++ b/rust/bambam-omf/src/util/fs.rs @@ -1,4 +1,9 @@ -use std::path::Path; +use std::{fs::File, path::Path}; + +use csv::QuoteStyle; +use flate2::{write::GzEncoder, Compression}; +use kdam::tqdm; +use serde::Serialize; use crate::collection::OvertureMapsCollectionError; @@ -20,3 +25,96 @@ where Ok(()) } } + +pub fn serialize_into_csv( + iterable: &[T], + filename: &str, + output_directory: &Path, + overwrite: bool, + desc: &str, +) -> Result<(), OvertureMapsCollectionError> { + let mut writer: Option>> = create_writer( + output_directory, + filename, + true, + QuoteStyle::Necessary, + overwrite, + ); + let iter = tqdm!(iterable.iter(), total = iterable.len(), desc = desc); + for element in iter { + if let Some(ref mut writer) = writer { + // let vertex_ser = VertexSerializable::from(*vertex); + writer.serialize(element).map_err(|e| { + OvertureMapsCollectionError::CsvWriteError(format!( + "Failed to write to {filename}: {e}" + )) + })?; + } + } + eprintln!(); + if let Some(ref mut writer) = writer { + writer.flush().map_err(|e| { + OvertureMapsCollectionError::CsvWriteError(format!("Failed to flush {filename}: {e}")) + })?; + }; + + Ok(()) +} + +pub fn serialize_into_enumerated_txt( + iterable: &[T], + filename: &str, + output_directory: &Path, + overwrite: bool, + desc: &str, +) -> Result<(), OvertureMapsCollectionError> { + let mut writer: Option>> = create_writer( + output_directory, + filename, + false, + QuoteStyle::Never, + overwrite, + ); + let iter = tqdm!(iterable.iter(), total = iterable.len(), desc = desc); + for element in iter { + if let Some(ref mut writer) = writer { + // let vertex_ser = VertexSerializable::from(*vertex); + writer.serialize(element).map_err(|e| { + OvertureMapsCollectionError::CsvWriteError(format!( + "Failed to write to {filename}: {e}" + )) + })?; + } + } + eprintln!(); + if let Some(ref mut writer) = writer { + writer.flush().map_err(|e| { + OvertureMapsCollectionError::CsvWriteError(format!("Failed to flush {filename}: {e}")) + })?; + }; + + Ok(()) +} + +/// helper function to build a filewriter for writing either .csv.gz or +/// .txt.gz files for compass datasets while respecting the user's overwrite +/// preferences and properly formatting WKT outputs. +fn create_writer( + directory: &Path, + filename: &str, + has_headers: bool, + quote_style: QuoteStyle, + overwrite: bool, +) -> Option>> { + let filepath = directory.join(filename); + if filepath.exists() && !overwrite { + return None; + } + let file = File::create(filepath).unwrap(); + let buffer = GzEncoder::new(file, Compression::default()); + let writer = csv::WriterBuilder::new() + .has_headers(has_headers) + .quote_style(quote_style) + .from_writer(buffer); + Some(writer) +} From 8e90e38f916183d589ab49d8ccfd4d9a8d227eb5 Mon Sep 17 00:00:00 2001 From: Yamil Essus Date: Fri, 16 Jan 2026 14:21:07 -0500 Subject: [PATCH 3/7] remove commented code --- rust/bambam-omf/src/graph/omf_graph.rs | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/rust/bambam-omf/src/graph/omf_graph.rs b/rust/bambam-omf/src/graph/omf_graph.rs index 17829852..a6c935d7 100644 --- a/rust/bambam-omf/src/graph/omf_graph.rs +++ b/rust/bambam-omf/src/graph/omf_graph.rs @@ -274,26 +274,3 @@ impl OmfGraphVectorized { Ok(()) } } - -// /// helper function to build a filewriter for writing either .csv.gz or -// /// .txt.gz files for compass datasets while respecting the user's overwrite -// /// preferences and properly formatting WKT outputs. -// fn create_writer( -// directory: &Path, -// filename: &str, -// has_headers: bool, -// quote_style: QuoteStyle, -// overwrite: bool, -// ) -> Option>> { -// let filepath = directory.join(filename); -// if filepath.exists() && !overwrite { -// return None; -// } -// let file = File::create(filepath).unwrap(); -// let buffer = GzEncoder::new(file, Compression::default()); -// let writer = csv::WriterBuilder::new() -// .has_headers(has_headers) -// .quote_style(quote_style) -// .from_writer(buffer); -// Some(writer) -// } From c0d05292672850377dc518ace676dbc40bb550a1 Mon Sep 17 00:00:00 2001 From: Yamil Essus Date: Fri, 16 Jan 2026 14:26:20 -0500 Subject: [PATCH 4/7] write bearings --- rust/bambam-omf/src/graph/omf_graph.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/rust/bambam-omf/src/graph/omf_graph.rs b/rust/bambam-omf/src/graph/omf_graph.rs index a6c935d7..5f104333 100644 --- a/rust/bambam-omf/src/graph/omf_graph.rs +++ b/rust/bambam-omf/src/graph/omf_graph.rs @@ -22,6 +22,7 @@ pub const GEOMETRIES_FILENAME: &str = "edges-geometries-enumerated.txt.gz"; pub const SPEEDS_FILENAME: &str = "edges-speeds-mph-enumerated.txt.gz"; pub const CLASSES_FILENAME: &str = "edges-classes-enumerated.txt.gz"; pub const SPEED_MAPPING_FILENAME: &str = "edges-classes-speed-mapping.csv.gz"; +pub const BEARINGS_FILENAME: &str = "edges-bearings-enumerated.txt.gz"; pub struct OmfGraphVectorized { pub vertices: Vec, @@ -255,7 +256,7 @@ impl OmfGraphVectorized { overwrite, "write classes", )?; - + // Write speed_mapping serialize_into_csv( &edge_list.speed_lookup.iter().collect_vec(), @@ -264,6 +265,15 @@ impl OmfGraphVectorized { overwrite, "write speed mapping", )?; + + // Write bearings + serialize_into_enumerated_txt( + &edge_list.bearings, + BEARINGS_FILENAME, + &mode_dir, + overwrite, + "write bearings", + )?; } eprintln!(); From 954e25e037bf8e484ba2f3870d6f59667bcc702d Mon Sep 17 00:00:00 2001 From: Yamil Essus Date: Fri, 16 Jan 2026 14:46:37 -0500 Subject: [PATCH 5/7] optimized serializer functions --- rust/bambam-omf/src/graph/omf_graph.rs | 38 +++++++++----------------- rust/bambam-omf/src/util/fs.rs | 36 ++++++++++++++++-------- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/rust/bambam-omf/src/graph/omf_graph.rs b/rust/bambam-omf/src/graph/omf_graph.rs index 5f104333..df975532 100644 --- a/rust/bambam-omf/src/graph/omf_graph.rs +++ b/rust/bambam-omf/src/graph/omf_graph.rs @@ -10,7 +10,6 @@ use crate::{ graph::{segment_ops, vertex_serializable::VertexSerializable}, }; use geo::LineString; -use itertools::Itertools; use kdam::tqdm; use rayon::prelude::*; use routee_compass_core::model::network::{EdgeConfig, EdgeList, EdgeListId, Vertex}; @@ -180,11 +179,7 @@ impl OmfGraphVectorized { // write vertices serialize_into_csv( - &self - .vertices - .iter() - .map(|v| VertexSerializable::from(*v)) - .collect::>(), + self.vertices.iter().map(|v| VertexSerializable::from(*v)), COMPASS_VERTEX_FILENAME, output_directory, overwrite, @@ -205,17 +200,12 @@ impl OmfGraphVectorized { // Write Edges serialize_into_csv( - &edge_list - .edges - .0 - .iter() - .map(|row| EdgeConfig { - edge_id: row.edge_id, - src_vertex_id: row.src_vertex_id, - dst_vertex_id: row.dst_vertex_id, - distance: row.distance.get::(), - }) - .collect::>(), + edge_list.edges.0.iter().map(|row| EdgeConfig { + edge_id: row.edge_id, + src_vertex_id: row.src_vertex_id, + dst_vertex_id: row.dst_vertex_id, + distance: row.distance.get::(), + }), COMPASS_EDGES_FILENAME, &mode_dir, overwrite, @@ -224,11 +214,10 @@ impl OmfGraphVectorized { // Write geometries serialize_into_enumerated_txt( - &edge_list + edge_list .geometries .iter() - .map(|row| row.to_wkt().to_string()) - .collect::>(), + .map(|row| row.to_wkt().to_string()), GEOMETRIES_FILENAME, &mode_dir, overwrite, @@ -246,20 +235,19 @@ impl OmfGraphVectorized { // Write classes serialize_into_enumerated_txt( - &edge_list + edge_list .classes .iter() - .map(|class| class.as_str()) - .collect::>(), + .map(|class| class.as_str()), CLASSES_FILENAME, &mode_dir, overwrite, "write classes", )?; - + // Write speed_mapping serialize_into_csv( - &edge_list.speed_lookup.iter().collect_vec(), + edge_list.speed_lookup.iter(), SPEED_MAPPING_FILENAME, &mode_dir, overwrite, diff --git a/rust/bambam-omf/src/util/fs.rs b/rust/bambam-omf/src/util/fs.rs index afbd95d1..640e35fe 100644 --- a/rust/bambam-omf/src/util/fs.rs +++ b/rust/bambam-omf/src/util/fs.rs @@ -26,13 +26,18 @@ where } } -pub fn serialize_into_csv( - iterable: &[T], +pub fn serialize_into_csv( + iterable: I, filename: &str, output_directory: &Path, overwrite: bool, desc: &str, -) -> Result<(), OvertureMapsCollectionError> { +) -> Result<(), OvertureMapsCollectionError> +where + I: IntoIterator, + I::IntoIter: ExactSizeIterator, + I::Item: Serialize, +{ let mut writer: Option>> = create_writer( output_directory, filename, @@ -40,10 +45,11 @@ pub fn serialize_into_csv( QuoteStyle::Necessary, overwrite, ); - let iter = tqdm!(iterable.iter(), total = iterable.len(), desc = desc); - for element in iter { + let iter = iterable.into_iter(); + let total = iter.len(); + let bar_iter = tqdm!(iter, total = total, desc = desc); + for element in bar_iter { if let Some(ref mut writer) = writer { - // let vertex_ser = VertexSerializable::from(*vertex); writer.serialize(element).map_err(|e| { OvertureMapsCollectionError::CsvWriteError(format!( "Failed to write to {filename}: {e}" @@ -61,13 +67,18 @@ pub fn serialize_into_csv( Ok(()) } -pub fn serialize_into_enumerated_txt( - iterable: &[T], +pub fn serialize_into_enumerated_txt( + iterable: I, filename: &str, output_directory: &Path, overwrite: bool, desc: &str, -) -> Result<(), OvertureMapsCollectionError> { +) -> Result<(), OvertureMapsCollectionError> +where + I: IntoIterator, + I::IntoIter: ExactSizeIterator, + I::Item: Serialize, +{ let mut writer: Option>> = create_writer( output_directory, filename, @@ -75,10 +86,11 @@ pub fn serialize_into_enumerated_txt( QuoteStyle::Never, overwrite, ); - let iter = tqdm!(iterable.iter(), total = iterable.len(), desc = desc); - for element in iter { + let iter = iterable.into_iter(); + let total = iter.len(); + let bar_iter = tqdm!(iter, total = total, desc = desc); + for element in bar_iter { if let Some(ref mut writer) = writer { - // let vertex_ser = VertexSerializable::from(*vertex); writer.serialize(element).map_err(|e| { OvertureMapsCollectionError::CsvWriteError(format!( "Failed to write to {filename}: {e}" From 813705e6361c24e4bd99bb81aecf67fe1d94dae2 Mon Sep 17 00:00:00 2001 From: Yamil Essus Date: Fri, 16 Jan 2026 14:47:31 -0500 Subject: [PATCH 6/7] fmt clippy --- rust/bambam-omf/src/graph/omf_graph.rs | 5 +---- rust/bambam-omf/src/graph/serialize_ops.rs | 3 +-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/rust/bambam-omf/src/graph/omf_graph.rs b/rust/bambam-omf/src/graph/omf_graph.rs index df975532..d7931d4b 100644 --- a/rust/bambam-omf/src/graph/omf_graph.rs +++ b/rust/bambam-omf/src/graph/omf_graph.rs @@ -235,10 +235,7 @@ impl OmfGraphVectorized { // Write classes serialize_into_enumerated_txt( - edge_list - .classes - .iter() - .map(|class| class.as_str()), + edge_list.classes.iter().map(|class| class.as_str()), CLASSES_FILENAME, &mode_dir, overwrite, diff --git a/rust/bambam-omf/src/graph/serialize_ops.rs b/rust/bambam-omf/src/graph/serialize_ops.rs index 6e1608d7..0cfdb534 100644 --- a/rust/bambam-omf/src/graph/serialize_ops.rs +++ b/rust/bambam-omf/src/graph/serialize_ops.rs @@ -293,8 +293,7 @@ pub fn bearing_deg_from_geometries( let n = linestring.0.len(); if n < 2 { return Err(OvertureMapsCollectionError::InternalError(format!( - "cannot compute bearing on linestring with less than two points: {:?}", - linestring + "cannot compute bearing on linestring with less than two points: {linestring:?}" ))); } let p0 = linestring.0[n - 2]; From f7f1d5068f33b2f9bae0a2114a5509609bcde42d Mon Sep 17 00:00:00 2001 From: Yamil Essus Date: Fri, 16 Jan 2026 14:53:34 -0500 Subject: [PATCH 7/7] Update rust/bambam-omf/src/graph/omf_graph.rs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- rust/bambam-omf/src/graph/omf_graph.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/bambam-omf/src/graph/omf_graph.rs b/rust/bambam-omf/src/graph/omf_graph.rs index d7931d4b..3bd98ab9 100644 --- a/rust/bambam-omf/src/graph/omf_graph.rs +++ b/rust/bambam-omf/src/graph/omf_graph.rs @@ -15,7 +15,7 @@ use rayon::prelude::*; use routee_compass_core::model::network::{EdgeConfig, EdgeList, EdgeListId, Vertex}; use wkt::ToWkt; -pub const COMPASS_VERTEX_FILENAME: &str = "vertices_compass.csv.gz"; +pub const COMPASS_VERTEX_FILENAME: &str = "vertices-compass.csv.gz"; pub const COMPASS_EDGES_FILENAME: &str = "edges-compass.csv.gz"; pub const GEOMETRIES_FILENAME: &str = "edges-geometries-enumerated.txt.gz"; pub const SPEEDS_FILENAME: &str = "edges-speeds-mph-enumerated.txt.gz";