#openstreetmap #osm #osm-pbf #topology #file-format #multi-line

bin+lib osm-lump-ways

根据图形拓扑和OSM标签对OpenStreetMap线进行分组

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

Download history 156/week @ 2024-04-29 157/week @ 2024-05-13 156/week @ 2024-05-20 139/week @ 2024-05-27 9/week @ 2024-06-03 163/week @ 2024-07-01 4/week @ 2024-07-08 70/week @ 2024-07-29 120/week @ 2024-08-05 138/week @ 2024-08-12

每月下载量 328

许可协议:MIT/ApacheAGPL-3.0

280KB
5.5K SLoC

osm-lump-ways 根据拓扑和共享标签对OSM线进行分组

Crates.io Number of Downloads Crates.io Latest Version

回答关于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 方式具有此键,并且值与该正则表达式匹配。
  • F1F2F3 其他标签过滤器的逻辑或,即 F1、F2、…
  • F1F2F3 其他标签过滤器的逻辑与,即 F1、F2、…

流行的 regex 用于匹配。正则表达式和字符串比较都是区分大小写的。在正则表达式的开头添加 (?i) 以切换到不区分大小写(例如,name~(?i).* street)正则表达式匹配整个值,name~[Ss]treet 将匹配 Streetstreet,但不会匹配 Main Street NorthMain Street。使用 name~.*[Ss]treet.* 匹配所有。

简单标签过滤

-f/--tag-filter 可以指定一次或多次,并且仅当 OSM 对象匹配 所有 定义过的过滤器时才包括,即所有过滤器的逻辑与。

  • -f highway:仅包括具有 highway 标签的路线
  • -f highway -f name:仅包括具有 highwayname 标签的路线。
  • -f highway -f ∄name:仅包括具有 highway 且没有 name 标签的路线。

更复杂的标签过滤函数

-F/--tag-filter-func 接受一个有序的标签过滤器列表(由 ; 分隔),并根据第一个匹配的过滤器函数(使用 →T 包括或使用 →F 排除)包括(或排除)OSM 对象。一个裸露的 TF 适用于所有。

示例:我们想要包括所有的 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