osmconvert转换OpenStreetMap pbf文件至osm等格式矢量

osmconvert可用于转换和处理OpenStreetMap文件。它掌握的功能少于常用的Osmosis:例如,无法使用osmconvert访问数据库。但是,程序运行速度更快,并提供一些特殊功能(- all- to-nodes, - complete-multipolygons和--out-statistics)。

目录

 [隐藏] 

  • 1下载
    • 1.1二进制文件
      • 1.1.1Linux
      • 1.1.2Windows
    • 1.2来源
  • 2启动程序
  • 3程序说明
    • 3.1转换文件
      • 3.1.1具有非标准lon / lat粒度的PBF输入文件
    • 3.2应用地理边界
      • 3.2.1基于经度和纬度的剪辑
      • 3.2.2基于多边形的剪切
      • 3.2.3剪切OSM更改文件?
      • 3.2.4保持跨境方式的完整性
      • 3.2.5保持跨境多边形完整
      • 3.2.6保持跨境界限完整
      • 3.2.7排除对边界外对象的引用
      • 3.2.8合并两个或多个地理区域
      • 3.2.9特殊情况:剪切轮廓数据
    • 3.3从输出文件中排除信息或内容
      • 3.3.1处理作者信息
      • 3.3.2排除某些OSM对象类型
      • 3.3.3处理方式和关系并将其转换为节点
    • 3.4修改标签
      • 3.4.1修改值
      • 3.4.2修改密钥
      • 3.4.3添加新标签
    • 3.5更新OSM文件
    • 3.6检索两个OSM文件之间的差异
    • 3.7设置文件时间戳
    • 3.8检索统计数据
    • 3.9编写CSV文件
    • 3.10组合功能
    • 3.11并行处理
    • 3.12参数文件
    • 3.13技术细节
      • 3.13.1临时文件
      • 3.13.2内存管理
      • 3.13.3测试输出
  • 4基准
    • 4.1Planet .pbf - > .o5m
    • 4.2行星.osm - > .o5m
    • 4.3Planet .osm - > clipped .osm
    • 4.4行星.o5m - >德国.o5m

下载

像往常一样:在法律允许的范围内,没有保修。

二进制

Linux的

  • Linux 32位二进制文​​件
  • Linux 64位二进制文​​件
  • osmctools Debian包,安装运行:apt install osmctools

视窗

  • 用于Windows 32位的二进制文件(也与Win 64一起运行)
  • 用于Windows 64位的二进制文件(请参阅限制)
  • 用于Windows 64位的二进制文件(具有大文件支持)

限制:Windows版本(下载的二进制文件)并没有大文件,如planet.osm(大于2GB)使用--complete-方式,--complete-multipolygons或--complete-边界选项时工作例如,Windows 64位版本失败,命令为“osmconvert planet.osm.pbf -b = 17.7,59.15,18.4,59.5 -o = stockholm.osm --complete-ways --drop-version --verbose” 。使用Linux 64位版本完全相同的命令。这似乎是由于在签名的32位范围之外寻找文件位置的问题引起的,这是当前链接到Windows二进制文件的zlib库的限制。

DIY:如果你想构建自己的64位二进制文​​件没有限制,你必须使用标志_LARGEFILE64_SOURCE = 1_LFS64_LARGEFILE = 1构建最新的zlib 。并确保,这种类型的z_off64_t被定义为__int64在zconf.h

资源

  • 源代码(常规版)(需要链接zlib(即cc osmconvert.c -lz -o osmconvert
    • (上一个源代码)
    • (下一个源代码(如果有))
    • 下载并构建一次运行:   wget -O - http://m.m.i24.cc/osmconvert.c | cc -x c - -lz -O3 -o osmconvert
  • osmctools git存储库

如果找不到“zlib.h”错误:安装zlib1g-dev

启动程序

Windows用户可以通过双击可执行文件启动osmconvert。

所有平台的用户都可以从命令行启动osmconvert。只需执行osmconvert就可以启动一个友好的,交互式的基于文本的界面,引导用户完成使用该程序的过程。osmconvert的全部功能在交互模式下不可用。高级用户可以通过传递标志来绕过交互式界面,如下所示:

osmconvert --help

程序说明

要获得详细说明,请使用该程序的内置帮助功能:

osmconvert --help

此调用将显示简要参数概述:

osmconvert -h

以下章节演示了最重要的程序功能。

转换文件

可以在这些数据格式之间进行转换:

  • .osm
  • 的.osc
  • .osc.gz
  • .osh
  • .o5m
  • .o5c
  • .pbf

如果要将程序的输出路由到标准输出,则必须告诉程序应使用哪种数据格式:

--out-osm(默认值), - out-osc, - out-osh, - out-o5m, - out-o5c或--out-pbf。

如果通过应用-o =选项提供输出文件的名称,osmconvert将通过评估文件扩展名来确定数据格式。两种方式的示例:

osmconvert norway.pbf> norway.osm
osmconvert region.pbf -o = region.o5m
osmconvert region.o5m -o = region.pbf
osmconvert 20110510_20110511.osc --out-o5c> 20110510_20110511.o5c

如果通过标准输入提供数据,也可以使用压缩输入文件。例子:

bzcat europe.osm.bz2 | osmconvert  -  -o = europe.o5m
osmconvert norway.pbf | gzip -1> norway.osm.gz

选项“ - ”通知程序通过标准输入预期输入数据。

osmconvert提供有限的解压缩功能:您可以解压缩.gz文件。该程序将自己识别gzip压缩,因此您不需要关心哪个输入文件是gzip压缩的,哪个不是。内置的解压缩算法没有专门的解压缩程序那么强大,但是如果你想通过使用一些新下载的压缩.osc文件更新OSM文件,这个功能非常有用。例子:

osmconvert old.o5m daily_updates / 2011 * .osc.gz -o = new.o5m
osmconvert daily_updates / 2011 * .osc.gz --merge-versions --out-osc | gzip> cumulative.osc.gz

PBF输入具有非标准lon / lat粒度的文件

osmconvert期望PBF文件使用标准的OpenStreetMap粒度,即100纳米级。使用渗透可以生成具有不同粒度的PBF文件。如果要求转换具有不同粒度的文件,则osmconvert将给出错误:“节点nanodegrees必须为100:10000”。使用非标准粒度读取文件的解决方案是使用--pbf-granularity = 选项。

应用地理边界

基于经度和纬度的剪辑

提供地理坐标是定义应提取的地理区域的最简单方法。一些在线地图连续显示鼠标光标的地理坐标。例如:Osmarenderer地图,公共交通地图。

要定义此限制准矩形,您需要提供其西南角和东北角(WSEN)的坐标。例如:

osmconvert germany.pbf -b = 10.5,49,11.5,50 -o = nuernberg.o5m
osmconvert ontario.osm -b = -75.8,45.19,-75.7,45.23 -o = ott.osm

基于多边形的剪切

您可以使用边框多边形文件代替简单的边界矩形。这将允许更准确地限制政治边界,例如:

osmconvert germany.pbf -B = hamburg.poly -o = hamburg.pbf

边界多边形文件的格式可以在OSM Wiki中找到: 这里。您不需要严格遵守格式描述,但需要确保每行坐标都以空格开头。

osmconvert能够在一个文件中处理单独的多边形,如果已经正确定义,它甚至会考虑多边形中的“孤岛”。

剪辑OSM更改文件?

建议不要应用地理边框来更改文件。由于只有节点携带地理位置,因此程序不知道如何处理相关节点不在同一文件中的方式和关系。因此,这些方式和关系将从文件中排除。这通常不是你想要完成的。

保持跨境方式完整

一些应用程序要求线(所谓的方式)保持完整,即使它们部分位于定义的地理区域之外。这可以通过应用选项--complete-ways来完成。例子:

osmconvert germany.o5m -b = 10.5,49,11.5,50 --complete-ways -o = nuernberg.o5m
osmconvert germany.o5m -B = hamburg.poly --complete-ways -o = hamburg.pbf

如果您的操作系统是32位Windows,则此选项以及接下来两节中描述的选项将输入文件的大小限制为2 GiB。由于输入文件需要读取两次或三次,程序必须在此文件中“跳转”。不幸的是,目前使用的链接库不支持32位Windows的长跳转。Linux没有这样的限制(32位和64位版本都没有)。

同样,对于本节和以下两节,建议使用.o5m作为输入文件的数据格式。原因是.pbf文件通常在内部压缩,因此读取速度比.o5m文件慢得多。

通过Osmupdate命令没有--complete -...选项可用。

保持跨境多边形完整

越来越多的河流,森林和湖泊区域不仅被一条封闭线包围,而且还被几条连线所包围。所谓的多重多边形用于逻辑连接这些物理连接的线路。每条线都有一个角色,取决于位置:周围边界的“外部”或排除区域的“内部”(例如湖中的岛屿)。

当应用地理边界时,osmconvert可以考虑这些多边形并保持它们完整,即使边界内只有一小部分多边形区域。要指示程序执行此操作,请选择选项--complete-multipolygons。例子:

osmconvert germany.o5m -b = 10.5,49,11.5,50 --complete-multipolygons -o = nuernberg.o5m
osmconvert germany.o5m -B = hamburg.poly --complete-multipolygons -o = hamburg.pbf

请注意上一节末尾的三个评论。

直到2016年,这个选项被命名为--complex-ways。

保持跨境界限完整

为确保边界保持不变,即使某些路径对象位于应用的地理边界之外,也请使用--complete-boundaries选项。例子:

osmconvert germany.o5m -b = 10.5,49,11.5,50 --complete-boundaries -o = nuernberg.o5m
osmconvert germany.o5m -B = hamburg.poly --complete-boundaries -o = hamburg.pbf

请注意以上两节的三个评论。

排除对边界外对象的引用

如果您需要删除由于位于地理边界之外而被排除的节点的引用,请使用选项--drop-broken-refs (可能有助于将数据导入OSM Map Composer或JOSM)。

合并两个或多个地理区域

在某些情况下,可以合并OSM数据文件。如果它们拥有具有相同id的对象(节点,方式,关系),则它们必须具有相同的内容。例如:如果某种方式跨越两个区域文件之间的地理边界,则数据集的方式必须包含每个节点引用,甚至是对不在相关文件边框内的节点的引用。即,不能使用选项--drop-brokenrefs删除这样的区域 。地理合并的示例:

osmconvert austria.o5m germany.o5m switzerland.o5m -o = dach.o5m
osmconvert north_america.osm south_america.osm -o = americas.osm

特殊情况:剪切轮廓数据

请参阅此处:如何渲染没有人工制品的Garmin countour图层

从输出文件中排除信息或内容

处理作者信息

对于大多数应用程序,不需要作者标签。如果您决定排除用户名,用户ID,变更集和对象时间戳信息,请添加命令行选项--drop-author。例如:

osmconvert --drop-author a.pbf -o = a.osm

通常,从.osm或.o5m文件中删除作者信息时不会遇到任何问题,但是不建议使用.pbf文件执行此操作,因为大多数程序无法处理此格式更改。

如果您需要稍后重新获取作者信息,那么让我们说因为后续程序依赖于这种格式,您可以使用选项--fake-author重新生成它们。当然,新的作者信息将只是符合格式描述的替换值,仅此而已。

排除某些OSM对象类型

如有必要,您可以删除文件的整个部分:

--drop节点
--drop-方式
--drop-关系

程序osmfilter提供更精细的过滤功能。

处理方式和关系并将它们转换为节点

如果文件仅包含最原始对象类型的对象:节点,则有时后续处理会更容易。osmconvert提供了一个删除每个方式和每个关系的函数,并创建一个节点作为每个节点的替代。每个节点的经度和纬度都设置为已删除对象的地理中心。如果删除的对象是非封闭方式,则将取其节点的一个位置而不是中心。已删除对象的每个标记都将复制到该节点。作为新节点的id,采用的方式(resp。关系)id增加10 15(分别为2 * 10 15)。例如:

osmconvert hamburg.pbf --all-to-nodes -o = hamburg_nodes.osm

所述--object型偏移=选项允许用户改变ID偏移,从10 15到一个不同的值。

选项--add-bbox-tags将为已转换为节点的每种方式和关系提供边界框。这些边界框将显示为标记。例如(伦敦地区):


修改标签

有时更改某些标记以使进一步的数据处理更容易。

修改值

您可以指定要修改的值。例如:

./osmconvert a.o5m --modify-tags =“highway = primary to = tertiary highway = secondary to = tertiary”-o = all_streets_are_small.o5m

这将使所有主要和次要道路成为第三道路。

修改密钥

密钥也可以修改:

./osmconvert a.o5m --modify-node-tags =“amenity = fire_hydrant to emergency = fire_hydrant”-o = new_hydrant_syntax.o5m

添加新标签

与osmfilter的过滤类似,osmconvert的标签修改允许进行比较。因此,如果这有助于简化数据的后续处理,则可以添加冗余标记:

./osmconvert a.o5m --modify-tags =“maxspeed <= 20 add speed_category = slow”-o = speed_categories.o5m

没有检查是否已有具有相同键名的标签。如有必要,使用osmfilter的标签过滤功能来防止可能的碰撞。

更新OSM文件

如果您有OSM数据文件(.osm,.o5m或.pbf),则可以将其与一个或多个OSM更改文件(.osc或.o5c)合并以进行更新。例如,你有一个planet.osm文件或昨天的区域germany.o5m文件,你可以从今天早上开始应用每日更改文件,以获得最新的planet.osm,resp。germany.o5m文件。语法是这样的:

osmconvert planet_old.osm changefile.osc -o = planet_new.osm
osmconvert planet_old.o5m changefile.osc.gz -o = planet_new.o5m
osmconvert germany_old.o5m changefile.osc -B = germany.poly -o = germany_new.o5m

如果您的数据文件较旧,您可以同时应用两个或多个更改文件:

osmconvert veryold.osm c1.osc c2.osc c3.osc -o = new.osm
osmconvert day24.o5m c24_25.osc c25_26.osc -o = day26.o5m
osmconvert day01.o5m 11月/ * .osc -o = day30.o5m

更改文件中的OSM对象必须是唯一的。这意味着,每个节点,方式或关系只需要出现一次。每分钟和每小时更改文件可能包含多个版本的OSM对象,因此您将收到警告消息。如果指定选项--merge-versions,则可以组合每个对象的所有版本。然后,只有每个对象的最新版本将保留在文件中。

要自动更新OSM文件或创建累积.osc文件,请参阅osmupdate。

检索两个OSM文件之间的差异

您可以通过比较两个.osm或.o5m文件来创建.osc或.o5c更改文件。例如:

osmconvert old.osm new.osm --diff -o = changefile.osc
osmconvert old.o5m new.o5m --diff -o = changefile.o5c

其他操作(如应用区域边框)不允许在同一次运行中。两个文件必须按对象类型和id排序。除非版本号为1,否则创建的对象将在输出文件中显示为“已修改”。

在计算文件差异时,osmconvert依赖于要比较的对象的版本号。如果版本号不可用或者对象应按内容进行比较,您可以通过应用选项--diff-contents(仅适用于.o5m文件)来命令程序执行此操作。

如果要删除对象,则仅存储其id(和作者数据)。事实证明,不存储对象的内容是有用的,因为它无论如何都会被删除。但是,有些程序会出于正式原因预期节点的经度和纬度值,即使它们所做的唯一操作是删除这些值。选项--fake-lonlat可帮助您创建此类正式所需的替换值。

设置文件时间戳

通常,OSM文件具有文件时间戳,允许您确定文件的实际情况。在文件转换期间,osmconvert将保留此时间戳。不过,它可以由你调整。例如:

osmconvert hamburg.o5m --timestamp = 2011-08-01T23:50:00Z -o = hamburg2.o5m

检索统计数据

有不同的方法来获取OSM文件的元数据或统计数据。首先,您可以使用--out-timestamp选项读取文件的时间戳(最后的Z代表Zulu):

osmconvert file_with_timestamp.o5m --out-timestamp
2011-08-01T23:50:00Z
osmconvert file_without_timestamp.o5m --out-timestamp
(时间戳无效)

其次,您可以分析整个文件并创建一组统计数据:

$ osmconvert germany.osm.pbf --out-statistics
时间戳最小值:2005-07-05T02:14:17Z
时间戳最大值:2011-07-31T19:59:46Z
Lon min:-20.0712330
lon max:21.1441799
年分:47.0830289
年最高:59.9982830
节点:78138447
方式:11342322
关系:176024
node id min:1
node id max:1380816490
方式id min:92
方式id max:123952798
关系id min:159
relation id max:1693098

编写CSV文件

要获取以字符分隔的列表,您可以将“.csv”定义为输出格式。这可以通过使用-o =选项来完成,例如-o = my_table.csv或通过定义其中一个csv相关选项: - out-csv, - cvv =, - cvv-headline, - cvv- separator =。

该表将有三个以制表符分隔的列:对象类型名称,ID,名称。要更改列分隔符或选择不同的列集,请使用--csv-separator = resp。所述--csv =选项。使用--help选项可显示有关此主题的更多信息。例如(结合选项--all-to-nodes):

osmconvert shops.osm --all-to-nodes --csv =“@ id @lon @lat amenity shop name”--csv-headline
@id @lon @lat amenity商店名称
21548298 11.6122123 48.6884848店面包店米勒
21552613 9.0651970 49.9979332商店屠夫耶格
1000000168276611 6.6058085 51.4556093商店药店AllForYou

列将由系统默认大小的制表符分隔。如果要将数据写入文件,建议使用-o = somefilename.csv。

结合功能

可以组合大多数先前引入的功能。因此,例如,您可以更新.osm文件并在一次传递中限制其区域:

osmconvert day24.osm -B = p.poly c24_25.osc -o = day25.osm

并行处理

osmconvert本身不支持并行处理。但是,您可以使用操作系统的功能并在命令行中输入此类说明。在您想要处理多个.pbf文件的情况下,这可能也很有用,因为osmconvert目前无法同时读取多个.pbf文件。例如:

osmconvert region1.pbf --out-o5m | osmconvert  -  region2.pbf -o = all.pbf

在此示例中,第一个进程将读取.pbf文件“region1.pbf”并将其输出为o5m格式化为标准输出。第二个进程将从标准输入读取此数据,将其与其他区域文件“region2.pbf”合并,并将其写入文件“all.pbf”。您将在第二个osmconvert命令中识别减号:它建议程序从标准输入读取数据。该管道操作符 “|” 将第一个命令的标准输出连接到第二个命令的标准输入

您还可以通过创建所谓的命名管道来使用多个管道。不幸的是,这可能不适用于Windows。在Linux上,有mkfifo命令来创建管道。这些管道的处理方式与文件相同。在此示例中,将创建三个进程以合并三个.pbf文件:

mkfifo p1 p2
osmconvert a.pbf --out-o5m -o = p1&osmconvert osmconvert b.pbf --out-o5m -o = p2&osmconvert p1 p2 c.pbf -o = all.pbf

&符运算符将分别为该命令创建一个后台进程。该行中的最后一个命令仍保留在前台,并将收集两个后台进程生成的数据。

或者,许多Unix shell提供了一种称为Process Substitution的技术,它基本上为您自动创建命名管道,而不需要使用mkfifo。与上述命令等价的是:

osmconvert <(osmconvert a.pbf --out-o5m)<(osmconvert b.pbf --out-o5m)c.pbf -o = all.pbf

参数文件

如果指定复杂操作,命令行参数可能会变长。请改用参数文件,并使用--parameter-file =引用此文件。例如:

osmconvert --parameter-file = my_parameters

文件“my_parameters”:

//详细
-v
// 输入文件
planet.o5m
//边界框
-b = 8.123,10.123,9.456,11.456
--complete-方式
// 输出文件
-o = region.o5m

空行用于分隔参数。参数中的换行符将转换为空格。以“ //  ” 开头的行被视为注释,因此被程序忽略。

技术细节

临时文件

要执行某些操作,osmconvert需要创建临时文件。这些文件很小 - 与要处理的OSM文件相比。他们的名字都以“osmconvert_tempfile”开头,以数字结尾。您可以更改文件名的左侧部分,包括路径。例如:

osmconvert germany.pbf -B = n.poly -t = / media / hd70 / temp -o = nuernberg.o5m

内存管理

有三个选项可以影响程序的内存管理: - hash-memory =, - max-refs =和--max-objects =。请参阅帮助选项显示的详细说明:

osmconvert --help

测试输出

有时候获得一些关于程序目前正在做什么的信息是很好的。您可以通过应用此选项激活详细模式:-v。使用-v = 2,您将获得更详细的输出,但可能会有点令人困惑。

基准

Planet .pbf - > .o5m

一个快速的,因为Osmconvert并不是唯一一个访问磁盘,我没想到运行'时间':

16GB内存,7200rpmdisk。

./osmconvert planet-latest.osm.pbf -o = planet-latest.o5m

约。12分钟。

Planet .osm - > .o5m

$ date
太平洋标准时间12月29日星期六14:36:19
$ ./osmconvert planet.osm -o = planet-121207.o5m
$ date
太平洋标准时间12月29日星期六18:34:16

$ ls -lah
...
-rw ------- 1名工作人员32G 12月29日18:34 planet-121207.o5m
-rw-r  -  r-- 1位用户工作人员319G 12月7日02:41 planet.osm
...

所以....在一个16GB i7上使用planet.osm在USB 3外置高清上大约4小时。原来这是一个有缺陷的USB3驱动器......

Planet .osm - > clipped .osm

$ time ./osmconvert planet-130123.osm -b = -144.20,-50.90 -o = to_subset.osm

真正的54m59.172s
用户39m18.091s
sys 5m3.111s

在16核服务器上配备48GB内存,12x2TB raid5。使用单个cpu线程限制性能。输入planet.osm为~360GB,输出子集为~112GB。

Planet .o5m - >德国.o5m

使用Geofabrik的德国多边形从Planet文件中提取德国:

./osmconvert planet.o5m -B = germany.poly -o = germany.o5m

约。在i7 cpu的计算机上使用5个核心,仅使用1个核心。

你可能感兴趣的:(osmconvert转换OpenStreetMap pbf文件至osm等格式矢量)