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 地理空间
65 每月下载量
在 osm-geo-mapper 中使用
34KB
829 代码行
osm-xml
简单的 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