osmconvert可用于转换和处理OpenStreetMap文件。它掌握的功能少于常用的Osmosis:例如,无法使用osmconvert访问数据库。但是,程序运行速度更快,并提供一些特殊功能(- all- to-nodes, - complete-multipolygons和--out-statistics)。
[隐藏]
像往常一样:在法律允许的范围内,没有保修。
Linux的
apt install osmctools
视窗
限制: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
cc osmconvert.c -lz -o osmconvert
)
wget -O - http://m.m.i24.cc/osmconvert.c | cc -x c - -lz -O3 -o osmconvert
如果找不到“zlib.h”错误:安装zlib1g-dev
Windows用户可以通过双击可执行文件启动osmconvert。
所有平台的用户都可以从命令行启动osmconvert。只需执行osmconvert就可以启动一个友好的,交互式的基于文本的界面,引导用户完成使用该程序的过程。osmconvert的全部功能在交互模式下不可用。高级用户可以通过传递标志来绕过交互式界面,如下所示:
osmconvert --help
要获得详细说明,请使用该程序的内置帮助功能:
osmconvert --help
此调用将显示简要参数概述:
osmconvert -h
以下章节演示了最重要的程序功能。
可以在这些数据格式之间进行转换:
如果要将程序的输出路由到标准输出,则必须告诉程序应使用哪种数据格式:
--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,.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或.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”定义为输出格式。这可以通过使用-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,您将获得更详细的输出,但可能会有点令人困惑。
一个快速的,因为Osmconvert并不是唯一一个访问磁盘,我没想到运行'时间':
16GB内存,7200rpmdisk。
./osmconvert planet-latest.osm.pbf -o = planet-latest.o5m
约。12分钟。
$ 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驱动器......
$ 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。
使用Geofabrik的德国多边形从Planet文件中提取德国:
./osmconvert planet.o5m -B = germany.poly -o = germany.o5m
约。在i7 cpu的计算机上使用5个核心,仅使用1个核心。