导入OSM数据至PostgreSQL数据库

时间:2021-03-16 12:34:47

OSM是一款由网络大众共同打造的免费开源、可编辑的地图服务。OpenStreetMap它是利用公众集体的力量和无偿的贡献来改善地图相关的地理数据。OSM是非营利性的,它将数据回馈给社区重新用于其它的产品与服务。而其他地图则是将大多数的地图数据出售给第三方。
OSM的地图由用户根据手提GPS装置、航空摄影照片、其他*内容甚至单靠地方智慧绘制。网站里的地图图像及向量数据皆以共享创意姓名标示-相同方式分享2.0授权。
OpenStreetMap的优缺点:优点:数据开放,可自己搭建服务器,自己修改数据,有前景(最近发展很快);缺点:数据尚不完善,资源不是十分丰富。
官方(维基)给出的原因:
免费维基世界地图(OpenStreetMap),为任何需要的人,创建并提供象道路图之类*的地理数据。启动这个项目的原因是,很多人们以为免费的地图,其实有很多法律和技术上的限制,阻碍了人们对地理数据富有创意的、以不可预知的方式进行再利用。
http://wiki.openstreetmap.org/wiki/Zh-hans:Main_Page

(一)获取地图数据

我们可以在openstreetmap.org网站获取我们需要的数据,可以指定区域,也可以选择一个城市或者国家,获取其地理数据,获取的数据有多种形式,大家可根据自己的开发需求确定自己需要的类型。
我下载了后缀名为为.osm 的数据文件。
(二)OSM数据的数据结构
首先,看一下OpenStreetMap的数据结构:
OpenStreetMap的元素(数据基元)主要包括三种:点(Nodes)、路(Ways)和关系(Relations),这三种原始构成了整个地图画面。其中,Nodes定义了空间中点的位置;Ways定义了线或区域;Relations(可选的)定义了元素间的关系。

Node
node通过经纬度定义了一个地理坐标点。同时,还可以height=标示物体所海拔;通过layer= 和 level=,可以标示物体所在的地图层面与所在建筑物内的层数;通过place= and name=*来表示对象的名称。同时,way也是通过多个点(node)连接成线(面)来构成的。
实例:

<osm version="0.6" generator="OpenStreetMap server"> 
    <node id="483034256" lat="55.9458449" lon="-3.2035477" version="1" changeset="2369219" user="spytfyre" uid="166957" visible="true" timestamp="2009-09-04T13:35:42Z"> 
        <tag k="name" v="The Blue Blazer" /> 
        <tag k="amenity" v="pub" /> 
    </node> 
</osm>

Way (way ,closed way ,area)
通过2-2000个点(nodes)构成了way。way可表示如下3种图形事物(非闭合线、闭合线、区域)。对于超过2000 nodes的way,可以通过分割来处理。
Open polyline ( way)
非闭合线:收尾不闭合的线段。通常可用于表示现实中的道路、河流、铁路等。
Closed polyline (closed way)
闭合线:收尾相连的线。例如可以表示现实中的环线地铁。
Area (area)
区域:闭合区域。通常使用landuse=* 来标示区域等。
实例:

<osm version="0.6" generator="OpenStreetMap server"> 
    <way id="43157302" visible="true" timestamp="2009-10-26T10:45:09Z" version="1" changeset="2954960" user="Ed Avis" uid="31257"> 
        <nd ref="540653724" /> 
        <nd ref="25507043" /> 
        <nd ref="107762" /> 
        <nd ref="25507038" /> 
        <nd ref="107759" /> 
        <tag k="highway" v="primary" /> 
        <tag k="lcn_ref" v="6a" /> 
        <tag k="name" v="Parliament Street" /> 
    </way> 
</osm>

ref =* 代表了连接成线的点。
Relation relation
一个Relation可由一系列nodes, ways 或者其他的relations来组成,相互的关系通过role来定义。一个元素可以在relation中被多次使用,而一个relation可以包含其他的relation。

<osm version="0.6" generator="OpenStreetMap server"> 
    <relation id="113421" visible="true" timestamp="2009-11-03T10:08:27Z" version="2" changeset="3023369" user="Jonathan Bennett" uid="5352"> 
        <member type="node" ref="270186" role="via" /> 
        <member type="way" ref="4418767" role="from" /> 
        <member type="way" ref="4641665" role="to" /> 
        <tag k="restriction" v="no_right_turn" /> 
        <tag k="type" v="restriction" /> 
    </relation> 
</osm>

表示:从id为”4418767”的way,经270186的node,至id为”4641665”的way

Tag
标签不是地图基本元素,但是各元素都通过tag来记录数据信息。通过’key’ and a ‘value’来对数据进行记录(了解xml或者数据库的应该都比较清楚了吧?)。例如,可以通过highway=residential来定义居住区道路;同时,可以使用附加的命名空间来添加附加信息,例如:maxspeed:winter=*就表示冬天的最高限速。
具体的tag分类可参看:http://wiki.openstreetmap.org/wiki/Map_Features

<osm version="0.6" generator="OpenStreetMap server"> 
    <node id="107775" lat="51.5072647" lon="-0.1278328" version="29" changeset="2628959" user="EdinburghGael" uid="170586" visible="true" timestamp="2009-09-25T23:04:28Z"> 
        <tag k="place" v="city" /> 
        <tag k="name:zh" v="伦敦" /> 
        <tag k="name:sv" v="London" /> 
        <tag k="name:sk" v="Londyn" /> 
        <tag k="name:ru" v="Лондон" /> 
        <tag k="name:fi" v="Lontoo" /> 
        <tag k="name:es" v="Londres" /> 
        <tag k="name:gv" v="Lunnin" /> 
        <tag k="name:zh_pyt" v="Lúndūn" /> 
        ... 
        <tag k="is_in" v="England, United Kingdom, UK, Great Britain,Europe" /> 
        <tag k="capital" v="yes" /> 
        <tag k="name:fr" v="Londres" /> 
        <tag k="name:cy" v="Llundain" /> 
    </node> 
</osm>

简单的说:
OSM数据由以下元素组成:
节点(Nodes): 最基本的要素,是其它要素的组成部分.
路线(Ways): 有方向性的节点序列, 在编辑器里显示成连接起来的线段.
闭合路线(Closed Ways): 闭合路线是完全闭合的路线. 一般用来表示区域如公园,湖泊,岛屿等.

(三)导入OSM数据至PostgreSQL数据库
(1)创建数据库,使用pgAdmin 4,create database ,命名seattle,记得选上模板为postgis_23_sample
导入OSM数据至PostgreSQL数据库
注意:勾选模板,要确定模板数据库不能处于连接状态
(2)为数据库创建Schema(模式)
在这之前先把PostgreSQL安装目录的bin文件夹路径以及Osmosis的bin文件夹路径添加到Path环境变量里面去,这样子就免得指令操作时要不停切换目录。
Osmosis的安装很简单,下载最新版解压即可,可查看http://wiki.openstreetmap.org/wiki/Osmosis/PostGIS_Setup
为数据库创建Schema(模式)使用命令
psql -d seattle -U postgres -W -f F:\postgres\osmosis\script\pgsimple_schema_0.6.sql
如下,则创建成功
导入OSM数据至PostgreSQL数据库
可在pgAdmin 中看到生成了很多我们需要的表table
导入OSM数据至PostgreSQL数据库

(四)导入OSM数据至PostgreSQL数据库
准备工作算是都做好了,现在开始导入数据了,前面已经说到下载好了OSM数据。
输入命令:
osmosis –read-xml file=F:\OSMData\SeattleWAUSA\SeattleWAUSAosm\SeattleWAUSA.osm –write-pgsimp database=”seattle” user=”postgres” password=”……” host=”localhost”
导入OSM数据至PostgreSQL数据库
等待执行完毕
导入OSM数据至PostgreSQL数据库
现在我们就可以在pgAdmin中查看到导入进去的数据了
导入OSM数据至PostgreSQL数据库

至此,全部操作完成。