导入OpenStreetMap。 从二进制源到数据库表的几个步骤

通常,当有人谈论OSM时,会基于OSM 数据弹出一个Web服务或诸如Maps.me之类的应用程序。 实际上,OSM项目主要是数据,其他所有本质上都是其使用的特殊情况。 服务通常仅提供根据其规则绘制的部分信息。

最初,OSM是点,点之间的链接以及它们的标签的集合。 社区资源有两种格式。 最初, XML被用作分发数据的优先方式,但是未压缩形式的Planet.osm文件已经超过了TB,并且我认为没有理由将其用于相对大量的信息。 PBF具有很大的优势-它是二进制文件,整个Earth文件的大小约为50 GB(XML压缩为80 GB)。

这将涉及使用Osmosis工具从“本机”格式导入OSM数据。

我们还需要带有Postgis扩展名的PostgreSql,它将OSM数据导入其中。

结果,可以在其数据库中使用此处列出的标签获取有关对象的信息



数据库准备。


首先,在Postgresql中创建一个数据库,名称并不重要。

psql -c "CREATE DATABASE map;" 

接下来,添加进一步工作所需的扩展。

 psql -d map -c "CREATE EXTENSION postgis; CREATE EXTENSION hstore; " 

Postgis扩展将用于处理地理数据的实际模块“连接”到数据库(我提醒您必须安装Postgis本身)。 hstore扩展旨在与键/值集一起使用,例如 OSM标签中将包含很多信息。

下载渗透 。 简而言之,它是用于使用OSM数据进行多种操作的软件。 在使用命令行方面有一些很好的文档。 Java来源。 下面我们将使用命令行。 我还将Osmosis用作Java库,源代码(在GitHub上可用)对我来说似乎很清楚,并且该API易于使用。

现在,我们正在准备导入数据库。 可以使用osmosis / script文件夹中的脚本来创建必要的表和函数。 除了主脚本之外,我们还将执行SQL代码,该代码将创建一个用于存储线条几何形状的字段。 这是由于以下事实:OSM数据更有可能表示为点连接,而不是一组几何形状。

 psql -d map -fc:\osmosis\script\pgsnapshot_schema_0.6.sql psql -d map -fc:\osmosis\script\pgsnapshot_schema_0.6_linestring.sql 

将OSM数据导入数据库


好了,现在几乎一切都准备就绪。 您甚至可以运行导入。 有必要决定我们将采用什么作为来源。 即,您需要选择格式和来源。 最初,OSM社区使用(并使用)XML格式。 但是,数据量越来越大,因此文本格式逐渐被挤出。 使用PBF更为方便。 中心源planet.openstreetmap.org包含整个地球的数据。 通过一个文件,您可以下载项目的整个知识库,二进制形式的知识库已超过40 GB。 在那种情况下,当我想从那里剪掉一块数据时,我通常会整夜不工作,为笔记本电脑在SSD上提供超过100GB的可用空间来存放临时文件。

就我们而言,我们可以从社区成员的上传开始。 有一些资源可以仅下载特定区域的数据。 例如, download.geofabrik.de 。 以沃罗涅日地区为例。 该文件包含在包含整个中央联邦区数据的文件中。 您可以下载central-fed-district-latest.osm.pbf,然后将所需的“片段”切成单独的文件,或者在导入数据库时​​按坐标过滤。 我建议第一种选择:

 c:\osmosis\bin\osmosis.bat --read-pbf file="c:\downloads\central-fed-district-latest.osm.pbf" --bounding-box top=52.059564 left=37.92290 bottom=49.612297 right=43.225858 --write-pbf file="c:\map\voronezh.osm.pbf" 

这里的一切都很简单。 我们读取PBF文件,通过坐标矩形过滤读取结果,并将过滤后的结果写入输出文件。 您可以使用坐标而不是矩形,而是使用坐标位于单独文件中的多边形来更精确地按坐标进行过滤。

然后将生成的文件voronezh.osm.pbf导入数据库。 要进行连接,请创建具有数据库访问参数的属性文件:

 host=localhost database=map user=pguser password=pgpassword dbType=postgresql 

好吧,导入本身:

 c:\osmosis\bin\osmosis.bat --read-pbf c:\map\voronezh.osm.pbf --write-pgsql authFile=c:\map\databaseinfo.properties 

汇入资料


现在您已经可以开始研究数据库中的内容。 首先想到的是有一组数字,但这并非完全正确。 正如我所说,主要内容是重点。 通过在点之间创建链接(关系)来创建其他所有内容。 我们还不会深入,特别是因为双手已经在努力创建带有一些数据的自己的“扁平”表。 好了,对于线和点,一切都准备就绪,您只需要创建一个带有必要字段的表,然后在其中插入必要的条目即可。 我们有哪些领域? 在这里帮助维基。 例如, 采用键/值对power = line 。 选择我们将使用的字段列表,例如:名称,电压,操作员,电缆。 事实证明,我们要选择必须具有power = line属性的线,以及字段名称,电压,操作员,电缆。 创建一个表:

 CREATE TABLE power_lines ( name varchar, voltage varchar, operator varchar, cables varchar, geom geometry ) 

并要求自己填写我们的新表:

 INSERT INTO power_lines SELECT ways.tags -> 'name' as name, ways.tags -> 'voltage' as voltage, ways.tags -> 'operator' as operator, ways.tags -> 'cables' as cables, ways.linestring as geom FROM ways WHERE ways.tags -> 'power' IN ( 'line' ) 

完成后,我们有了一张带有电源线的表格,其中有些线甚至填满了一些字段! 嗯,表格当然很有趣,但是可视化数据以查看几何图形也很好。 最快的方法是使用QGIS,只是必须先安装此功能强大的GIS。 在这里我们已经添加了一个Postgis图层,可以使用任何地图作为底物(可以使用OpenLayers插件)。 配置好后,看:



万岁! 我想,即使与事实非常相似,看着窗外的电线。

和多边形?

带点的情况几乎相同,除了需要使用节点表。 KDPV仅包含有关变电站的数据 。 那多边形呢? 多边形也由线(闭合)组成。 看来您可以关闭行列并享受结果,但这种方法无法解决问题。 有很多陷阱。 多边形可以由几条闭合线组成。

例如,一个岛屿可能在湖上。 因此,我们在垃圾填埋场中遇到了一个“洞”。 我还必须了解“飞地”一词的含义(令我感到羞耻的是,我只知道“飞地”)。 多边形也被分组。 例如,一片森林可能由几个“碎片”组成。 我们应该将其表示为一个对象。 最重要的是,如果某些数据不在地图内,我们必须切开多边形。 我解决了SQL脚本中的这些以及其他一些问题,这些脚本在工作后安全地摆在了架子上。 在GitHub上找到了osmosis-multypolygon项目。 勉强地,我决定使用这种解决方案比几天之内写在膝盖上的一组脚本更好。 按照自述文件中的说明进行操作,即,执行脚本列表,并具有multipolygons表,该表中填充了assemble.sql中的指令。 在我们用多边形填充表格后,您可以提出我们想要得到的东西。 让我们选择公园领土吗?

我们看一下Wiki并编写一个脚本:

 CREATE TABLE parks ( name varchar, geom geometry ); INSERT INTO parks SELECT m.tags -> 'name' as name, m.geom FROM multipolygons m WHERE m.tags -> 'leisure' IN ( 'park' ) 

现在我们可视化:



好吧,说实话,在这里您可以争论数据的相关性。 但这是另一个讨论的话题。

Source: https://habr.com/ru/post/zh-CN467043/


All Articles