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