5个不稳定版本

使用旧的Rust 2015

0.6.2 2018年2月3日
0.6.1 2018年2月3日
0.5.1 2017年4月25日
0.5.0 2016年7月28日
0.4.0 2016年7月22日

#143 in 地理空间

Download history 22/week @ 2024-03-16 9/week @ 2024-03-23 39/week @ 2024-03-30 39/week @ 2024-04-06 27/week @ 2024-04-13 18/week @ 2024-04-20 29/week @ 2024-04-27 14/week @ 2024-05-04 18/week @ 2024-05-11 24/week @ 2024-05-18 23/week @ 2024-05-25 19/week @ 2024-06-01 10/week @ 2024-06-08 21/week @ 2024-06-15 24/week @ 2024-06-22 7/week @ 2024-06-29

65 每月下载量
osm-geo-mapper 中使用

MIT 许可证

34KB
829 代码行

osm-xml

Build Status Crates.io version Crates.io license

简单的 osm xml v0.6 解析器。

解析数据结构紧密遵循OSM文档的构成方式:我们有一个包含边界的顶级OSM结构,包含节点数组、方式数组和关系数组。每个解析元素都紧密遵循它们在osm-wiki中的条目。

文档中其他元素的引用在解析形式中未解决。存在API来解析单个引用到相应元素,但整个文档无法连接起来。

标签 存储在 .tags 字段中,作为 Tag { key: String, val: String } 的数组。

用法

以下是一个简单的示例程序,该程序从给定的osm文档中挖掘出一些统计数据。这包括解析文档、查找和使用所有不同类型的元素以及解析引用(可解析和不可解析的)。

extern crate osm_xml as osm;

use std::fs::File;

fn main() {
    let f = File::open("/path/to/map.osm").unwrap();
    let doc = osm::OSM::parse(f).unwrap();
    let rel_info = relation_reference_statistics(&doc);
    let way_info = way_reference_statistics(&doc);
    let poly_count = doc.ways.values().fold(0, |acc, way| {
        if way.is_polygon() {
            return acc + 1
        }

        acc
    });

    println!("Node count {}", doc.nodes.len());
    println!("Way count {}", doc.ways.len());
    println!("Polygon count {}", poly_count);
    println!("Relation count {}", doc.relations.len());
    println!("Tag count {}", tag_count(&doc));

    println!("Way reference count: {}, invalid references: {}",  way_info.0, way_info.1);
    println!("Relation reference count: {}, resolved: {}, unresolved: {}", rel_info.0, rel_info.1, rel_info.2);
}

fn relation_reference_statistics(doc: &osm::OSM) -> (usize, usize, usize) {
    doc.relations.values()
        .flat_map(|relation| relation.members.iter())
        .fold((0, 0, 0), |acc, member| {
            let el_ref = match *member {
                 osm::Member::Node(ref el_ref, _) => el_ref,
                 osm::Member::Way(ref el_ref, _) => el_ref,
                 osm::Member::Relation(ref el_ref, _) => el_ref,
            };

            match doc.resolve_reference(&el_ref) {
                osm::Reference::Unresolved => (acc.0 + 1, acc.1, acc.2 + 1),
                osm::Reference::Node(_)     |
                osm::Reference::Way(_)      |
                osm::Reference::Relation(_) => (acc.0 + 1, acc.1 + 1, acc.2)
            }
        })
}

fn way_reference_statistics(doc: &osm::OSM) -> (usize, usize) {
    doc.ways.values()
        .flat_map(|way| way.nodes.iter())
        .fold((0, 0), |acc, node| {
            match doc.resolve_reference(&node) {
                osm::Reference::Node(_) => (acc.0 + 1, acc.1),
                osm::Reference::Unresolved  |
                osm::Reference::Way(_)      |
                osm::Reference::Relation(_) => (acc.0, acc.1 + 1)
            }
        })
}

fn tag_count(doc: &osm::OSM) -> usize {
    let node_tag_count = doc.nodes.values()
        .map(|node| node.tags.len())
        .fold(0, |acc, c| acc + c);
    let way_tag_count = doc.ways.values()
        .map(|way| way.tags.len())
        .fold(0, |acc, c| acc + c);
    let relation_tag_count = doc.relations.values()
        .map(|relation| relation.tags.len())
        .fold(0, |acc, c| acc + c);

    node_tag_count + way_tag_count + relation_tag_count
}

1.0版本中缺失的功能

  • 合并OSM结构(做一些简单的事情,使其更容易更新地图边界内的现有元素)
  • 写入OSM文档
  • 常见元素属性解析(可见性、作者、更改集等)
  • 自定义解析行为(错误短路、可选字段等)
  • 更好的错误报告:违规元素在osm文档中的位置

希望拥有的功能

  • tag "database":将加快带有标签的元素的查找速度/在解析结构上节省内存,因为标签只是对实际字符串的引用

变更日志

0.6.0

2018-02-03

  • 将核心数据结构从vector更改为hashmap(这是一个不兼容的更改)
  • 升级依赖项

0.5.1

2017-04-25

  • Relax OSM::parse 以接收 Read 而不是 File

0.5.0

2016-07-28

  • Way::is_polygon

0.4.0

2016-07-22

  • 初始版本

许可证

osm-xml 在MIT许可证下许可。更多信息请参阅 LICENSE

依赖项

~380KB