A Rust library for reading the OpenStreetMap PBF file format (*.osm.pbf).

read.rs 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. extern crate osmpbf;
  2. use osmpbf::*;
  3. static TEST_FILE_PATH: &str = "tests/test.osm.pbf";
  4. fn approx_eq(a: f64, b: f64) -> bool {
  5. (a - b).abs() < 1.0e-6
  6. }
  7. #[test]
  8. fn read() {
  9. let reader = BlobReader::from_path(TEST_FILE_PATH).unwrap();
  10. let blobs = reader.collect::<Result<Vec<_>>>().unwrap();
  11. assert_eq!(blobs.len(), 2);
  12. assert_eq!(blobs[0].get_type(), BlobType::OsmHeader);
  13. assert_eq!(blobs[1].get_type(), BlobType::OsmData);
  14. {
  15. let header = blobs[0].to_headerblock().unwrap();
  16. assert!(header.required_features().contains(&String::from("OsmSchema-V0.6")));
  17. assert!(header.required_features().contains(&String::from("DenseNodes")));
  18. }
  19. {
  20. let primitive_block = blobs[1].to_primitiveblock().unwrap();
  21. let nodes = primitive_block.groups().flat_map(|g| g.nodes()).count();
  22. assert_eq!(nodes, 0);
  23. {
  24. let dense_nodes: Vec<_> = primitive_block.groups().flat_map(|g| g.dense_nodes()).collect();
  25. assert_eq!(dense_nodes.len(), 3);
  26. assert!(approx_eq(dense_nodes[1].lat(), 52.11992359584));
  27. assert!(approx_eq(dense_nodes[1].lon(), 11.62564468943));
  28. assert!(approx_eq(dense_nodes[2].lat(), 52.11989910567));
  29. assert!(approx_eq(dense_nodes[2].lon(), 11.63101926915));
  30. assert_eq!(dense_nodes[0].id, 105);
  31. assert_eq!(dense_nodes[1].id, 106);
  32. assert_eq!(dense_nodes[2].id, 108);
  33. assert_eq!(dense_nodes[0].uid, 17);
  34. assert_eq!(dense_nodes[1].uid, 17);
  35. assert_eq!(dense_nodes[2].uid, 17);
  36. }
  37. {
  38. let ways: Vec<_> = primitive_block.groups().flat_map(|g| g.ways()).collect();
  39. assert_eq!(ways.len(), 1);
  40. let way_tags = ways[0].tags().collect::<Vec<_>>();
  41. assert_eq!(way_tags.len(), 2);
  42. assert!(way_tags.contains(&("building", "yes")));
  43. assert!(way_tags.contains(&("name", "triangle")));
  44. }
  45. }
  46. }
  47. #[test]
  48. fn mmap_read() {
  49. let mmap = unsafe { Mmap::from_path(TEST_FILE_PATH).unwrap() };
  50. let reader = MmapBlobReader::new(&mmap);
  51. let blobs = reader.collect::<Result<Vec<_>>>().unwrap();
  52. assert_eq!(blobs.len(), 2);
  53. assert_eq!(blobs[0].get_type(), BlobType::OsmHeader);
  54. assert_eq!(blobs[1].get_type(), BlobType::OsmData);
  55. if let BlobDecode::OsmHeader(header) = blobs[0].decode().unwrap() {
  56. assert!(header.required_features().contains(&String::from("OsmSchema-V0.6")));
  57. assert!(header.required_features().contains(&String::from("DenseNodes")));
  58. } else {
  59. panic!("Unexpected blob type");
  60. }
  61. if let BlobDecode::OsmData(primitive_block) = blobs[1].decode().unwrap() {
  62. let nodes = primitive_block.groups().flat_map(|g| g.nodes()).count();
  63. assert_eq!(nodes, 0);
  64. {
  65. let dense_nodes: Vec<_> = primitive_block.groups().flat_map(|g| g.dense_nodes()).collect();
  66. assert_eq!(dense_nodes.len(), 3);
  67. assert!(approx_eq(dense_nodes[1].lat(), 52.11992359584));
  68. assert!(approx_eq(dense_nodes[1].lon(), 11.62564468943));
  69. assert!(approx_eq(dense_nodes[2].lat(), 52.11989910567));
  70. assert!(approx_eq(dense_nodes[2].lon(), 11.63101926915));
  71. assert_eq!(dense_nodes[0].id, 105);
  72. assert_eq!(dense_nodes[1].id, 106);
  73. assert_eq!(dense_nodes[2].id, 108);
  74. assert_eq!(dense_nodes[0].uid, 17);
  75. assert_eq!(dense_nodes[1].uid, 17);
  76. assert_eq!(dense_nodes[2].uid, 17);
  77. }
  78. {
  79. let ways: Vec<_> = primitive_block.groups().flat_map(|g| g.ways()).collect();
  80. assert_eq!(ways.len(), 1);
  81. let way_tags = ways[0].tags().collect::<Vec<_>>();
  82. assert_eq!(way_tags.len(), 2);
  83. assert!(way_tags.contains(&("building", "yes")));
  84. assert!(way_tags.contains(&("name", "triangle")));
  85. }
  86. } else {
  87. panic!("Unexpected blob type");
  88. }
  89. }
  90. #[test]
  91. fn decode_blob() {
  92. let reader = BlobReader::from_path(TEST_FILE_PATH).unwrap();
  93. let blobs = reader.collect::<Result<Vec<_>>>().unwrap();
  94. assert_eq!(blobs.len(), 2);
  95. assert_eq!(blobs[0].get_type(), BlobType::OsmHeader);
  96. assert_eq!(blobs[1].get_type(), BlobType::OsmData);
  97. // decoding to the wrong blob type should not panic, but produce an Err.
  98. assert!(blobs[0].to_primitiveblock().is_err());
  99. assert!(blobs[1].to_headerblock().is_err());
  100. assert!(blobs[0].to_headerblock().is_ok());
  101. assert!(blobs[1].to_primitiveblock().is_ok());
  102. }