38 个版本 (3 个稳定版本)
| 1.2.0 | 2024年8月13日 |
|---|---|
| 1.0.0 | 2024年7月2日 |
| 0.29.0 | 2024年5月28日 |
| 0.23.0 | 2024年3月19日 |
| 0.1.0 | 2023年3月31日 |
在 地理空间 中排名 20
每月下载量 328 次
280KB
5.5K SLoC
osm-lump-ways 根据拓扑和共享标签对OSM线进行分组
回答关于OSM数据的问题,例如
- “最长的主街是哪条?”
- “在这个地区我可以开多远的不铺路?”
- “M1高速公路有多长?”
- “这些河流是否相通?”
- “河流的流域是什么?”
包含两个类似的程序:osm-lump-ways,它忽略OSM线的方向,以及osm-lump-ways-down,它使用OSM线的方向来生成数据,包括适合问答的文件。两者有相似之处。
背景
OSM线性特征(例如道路、河流、墙壁)存储为way对象。OSM标记模型通常要求一个特征映射为许多不同的方式。osm-lump-ways 将将它们全部组装在一起。
过滤OSM数据
有两种方法可以选择哪些OSM线将用于。目前所有关系都被忽略。
标记过滤规则
key/∃key线具有此标记~key_regex/∃~key_regex存在匹配此正则表达式的键。∄key线没有此键key=value线具有此键和此值key≠value线要么没有此键,要么如果有,则不等于值key∈value1,value2,…线具有此键,且值为此列表中的一个key∉value1,value2,…线要么没有此键,要么如果有,则不是此列表中的值key~regex方式具有此键,并且值与该正则表达式匹配。F1∨F2∨F3…其他标签过滤器的逻辑或,即 F1、F2、…F1∧F2∧F3…其他标签过滤器的逻辑与,即 F1、F2、…
流行的 regex 库 用于匹配。正则表达式和字符串比较都是区分大小写的。在正则表达式的开头添加 (?i) 以切换到不区分大小写(例如,name~(?i).* street)正则表达式匹配整个值,name~[Ss]treet 将匹配 Street 或 street,但不会匹配 Main Street North 或 Main Street。使用 name~.*[Ss]treet.* 匹配所有。
简单标签过滤
-f/--tag-filter 可以指定一次或多次,并且仅当 OSM 对象匹配 所有 定义过的过滤器时才包括,即所有过滤器的逻辑与。
-f highway:仅包括具有highway标签的路线-f highway -f name:仅包括具有highway和name标签的路线。-f highway -f ∄name:仅包括具有highway且没有name标签的路线。
更复杂的标签过滤函数
-F/--tag-filter-func 接受一个有序的标签过滤器列表(由 ; 分隔),并根据第一个匹配的过滤器函数(使用 →T 包括或使用 →F 排除)包括(或排除)OSM 对象。一个裸露的 T 或 F 适用于所有。
示例:我们想要包括所有的 waterways。但不包括 waterway=canal。但如果我们希望一个 waterway=canal 的话,它也必须有一个 lock=yes 标签。
-F"waterway=canal∧lock=yes→T; waterway=canal→F; waterway→T; F
如果 -F/--tag-filter-func 的参数以 @ 开头,则其余部分是包含标签过滤器函数代码的文件名。例如,-F @myrules.txt。
注释以 # 开头,并延续到行尾。
输出
文件格式
如果文件名以 .geojson 结尾,则将创建一个 GeoJSON 文件(RFC 7946)。对于 .geojsons,将创建一个 GeoJSON Text Sequences(RFC 8142),也称为 GeoJSONSeq 文件。
几何格式
默认情况下,每个要素都是一个 MultiLineString,代表每个路线组。
使用 --split-into-single-paths,每个路线组将被分割成1个或多个 LineString,由 --split-into-single-paths-by X 参数控制。默认使用“as-crow-flies”距离。使用 longest-path 使用图中的最长路径,这在大网络上可能需要几天时间来计算。
输入
输入必须是一个 OSM PBF 文件。使用 osmium 在OSM文件格式之间进行转换。
输入的 对象ID 必须是正数。OSM导入软件通常使用 负ID。使用 osmium sort 然后 osmium renumber 如此,创建一个可接受的文件。
osmium sort negative-id-file.osm.pbf -o sorted.osm.obf
osmium renumber sorted.osm.pbf -o new-input.osm.pbf
osm-lump-ways
用法
生成河流流域
osm-lump-ways -i path/to/region-latest.osm.pbf -o region-rivers.geojson -f waterway=river
根据河流名称分组
osm-lump-ways -i path/to/region-latest.osm.pbf -o region-rivers.geojson -f waterway=river -g name
查找长街道并将它们组装成连接的(多)LineString
osm-lump-ways -i path/to/region-latest.osm.pbf -o long-streets.geojson -f highway -g name
安装
cargo install osm-lump-ways
完整选项
运行 --help 查看所有选项。
框架
在这里,“框架”指的是分组中两点之间的最短路径。这有助于水道找到大组连接的地方。
--output-frames FILENAME.geojsons 将这些功能保存到文件中。仅支持GeoJSONSeq输出格式。
使用示例
osm-lump-ways-down
它读取并分组一个OSM PBF文件,就像 osm-lump-ways 一样,但它使用OSM道路的方向来产生许多不同的输出文件。
输出文件
循环
网络中的循环。每个都是一个 强连通分量,以及 MultiLineString。
功能属性
areas:字符串数组。循环使用country-borders进行地理编码。每个匹配区域的代码都包含在这个数组中,按最长字符串排序。例如:["GB-ENG","GB"],areas_s:字符串。与areas相同,但数组已被转换为字符串,并使用逗号分隔,带有前缀和后缀的逗号。例如:",GB-ENG,GB,"。前缀和后缀确保您始终可以在该属性中搜索,GB,并得到匹配项。area_N:字符串。对于areas中的每个元素,都有一个带数字后缀和项目本身的字符串。例如,如果"areas_s":",GB-ENG,GB,",那么会有"area_0":"GB-ENG","area_1":"GB"。这些属性是为了不支持JSON数组的软件。length_m:浮点数。这个循环的总长度,以米为单位。nodes:字符串。这个循环中所有节点的ID,排序、去重后保存,例如"n318688661,n5354970286,n1016277960。root_node_id:整数。这个循环中编号最低的节点的ID。num_nodes:整数。这个循环中的节点数。包括重复的。
上游
包含上游数据的每个方向段(一个2点的LineString)。
使用--upstream-tag-ends,每个段都会得到关于该段终点(端点)的信息。
上游点
上面所述,但仅限于第一个点。每个要素是一个点。
终点
水道结束的点。
标记方式的终点成员资格
使用--ends-membership TAGFILTER参数,每个终点都会有一个布尔属性称为is_in:TAGFILTER,只有当这个终点节点是带有此标记过滤器的方式的成员时才为真。此参数可以多次应用。一个额外的属性is_in_count是一个整数,表示有多少个这些属性为真。
例如,使用--ends-membership natural=coastline将导致每个终点都有一个JSON属性is_in:natural=coastline,如果这个节点也是带有natural=coastline标记的方式的成员,则为真,否则为假。
终点完全上游
仅与--ends-upstreams参数一起使用。包含每个终点上游位置的MultiLineStrings文件的文件。用于找到某个地方有大上游终点的原因。
--ends-upstreams-min-upstream-m 1e6 --ends-upstreams-max-nodes 1000在计算速度和文件大小之间是一个很好的折衷方案,它仍然显示了相关的上游。
循环移除
检测到循环后,将循环中的所有边(方式段)合并在一起,生成一个无循环的新图。
待办事项
此软件尚未完成。WaterwayMap.org有很多事情要做,这是一个关于OpenStreetMap中水道的拓扑分析。
外部提及
TBC
版权 & 许可
版权 2023,2024,MIT/Apache2.0。源代码在Github (osm-lump-ways)上。
输出数据文件是OpenStreetMap数据库的派生数据库,因此受ODbL 1.0许可协议的保护,与OpenStreetMap 版权相同,并包含© OpenStreetMap 贡献者的数据。
依赖项
~52MB
~831K SLoC