上周把Asia区域的OSM的地图数据Down下来了,数据是放到服务器硬盘上了,可是还得放到数据库里,然后进一步用她来制作地图等等。由于这是一份地理空间数据,所以需要支持空间存储的数据库来驱动。首选PostgreSQL数据库 + PostGIS的开源数据库方案,下面就重头开始搭建PostgreSQL数据环境,将OSM的数据导入数据库中。
PostgreSQL + PostGIS on CentOS 7
1.安装yum源
采用Yum源来安装,由于CentOS默认Yun安装对应的PostgreSQL和PostGIS版本较低(貌似是9.2),这里我采用9.5的版本来进行部署。
首先安装添加Yum源,RPM源的地址可以从https://yum.postgresql.org/repopackages.php获取。根据要部署的OS版本来选择不同的版本库,查看服务器操作系统类型和版本。
$ uname -a
Linux localhost.localdomain 3.10.0-514.21.1.el7.x86_64 #1 SMP Thu May 25 17:04:51 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
根据所使用的平台系统类型和版本选择正确的安装源。
PostgreSQL 9.5版本的CentOS 7 RPM源(https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-7-x86_64/pgdg-centos95-9.5-3.noarch.rpm)
当然现在最新版本为10.0,也可以部署9.6的版本,这里以9.5为例。
yum install https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-7-x86_64/pgdg-centos95-9.5-3.noarch.rpm
yum update
2.安装postgresql95-server
部署PostgreSQL 9.5客户端:(可选项)
sudo yum install postgresql95 postgresql95-odbc PyGreSQL
部署PostgreSQL服务端以及相关依赖包
sudo yum install postgresql95-server postgresql95-contrib postgresql95-devel
3.初始化数据
sudo /usr/pgsql-9.5/bin/postgresql95-setup initdb
4.启动数据库服务
sudo systemctl start postgresql-9.5
开机自动启动数据服务:
sudo systemctl enable postgresql-9.5.service
5.数据库配置
由于默认配置不支持密码认证,同时仅可供本地服务器访问,需要进行相关配置。编辑pg_hba.conf文件,设置数据库的远程可访问性。增加host all all 0.0.0.0/0 md5来信任远程连接。
sudo vi /var/lib/pgsql/9.5/data/pg_hba.conf
编辑配置postgresql.conf文件,开启远程访问:
sudo vi /var/lib/pgsql/9.5/data/postgresql.conf
生产环境可根据具体的网络策略来进行设置。
重启数据库服务
sudo systemctl restart postgresql-9.5
设置防火墙及访问端口
sudo firewall-cmd --zone=public --add-port=5432/tcp --permanent
sudo firewall-cmd --reload
可使用数据库客户端连接访问,测试是否安装及配置成功。
6.安装PostGIS
sudo yum install postgis2_95 postgis2_95-devel postgis2_95-client
其中postgis2_95-client包含PostGIS的命令行工具shp2gpsql, pgsql2shp, raster2pgsql,方便导入或导出空间数据。
OSM数据入库
PostgreSQL数据库准备就绪,将下载的asia-latest.osm.pbf数据导入。生态系统提供了一批免费工具和开源组件。
- osmosis:基于Java的处理OSM数据的命令行工具,可以从数据库创建地图Dump、加载Dump到数据库;基于数据库历史表生成变更集;把变更集应用到数据库;根据两个地图Dump生成变更集;重新排序Dump中的数据;根据多边形边界框抽取地图等等。
- osmum:基于C++、JavaScript的处理OSM数据的框架。
- osm2pgsql:基于C++的导入OSM到PostgreSQL的命令行工具。
直接使用osm2pgsql工具将数据导入数据库中;首先使用上述sql创建数据库,并且建立空间扩展。
createdb osm
psql -d osm -c 'CREATE EXTENSION postgis; CREATE EXTENSION hstore;'
其中osm就是我的数据库名称。然后使用下面的命令导入之前下载好的数据
osm2pgsql -c -d osm --slim -C 2048 --flat-nodes /tmp/flat.files --number-processes 4 -U postgres -W -H 192.168.120.30 -P 5432 china-latest.osm.pbf
这里有几个地方要注意,一个是-C选项最好指定你电脑的内存的75%,单位为 Mb,并且最大只能为30000,–flat-nodes 用来指定一个文件路径,存放这个文件的位置至少要有20G的空闲空间(如果导入全球数据的话)。
导入全国的数据大约花了40多分钟,完成后会有一个概览。
node cache: stored: 48136826(100.00%), storage efficiency: 50.52% (dense blocks: 427, sparse nodes: 45890166), hit rate: 100.00%
预览地图数据
使用QGIS工具,连接PostgreSQL数据库,加载OSM数据预览。
参考:
1.http://www.postgresonline.com/journal/archives/362-An-almost-idiots-guide-to-install-PostgreSQL-9.5,-PostGIS-2.2-and-pgRouting-2.1.0-with-Yum.html
2.http://wiki.openstreetmap.org/wiki/Osm2pgsql