搭建开源地图服务(一) - OSMGIS数据导入

最近在研究开源地图服务的组建,故将一些点滴记录下来。本次构建所涉及到的方案可能具有个人喜好色彩(例如本人有一点点抵触Java,呵呵),因某些环节还需进一步认证,所以且行且记录。

本次服务搭建,初步方案为(根据实际组建过程,可能会调整):

  • 服务器操作系统:CentOS7 (请注意此处的版本,否则之后会遇到问题)
  • GIS数据库支持:PostgreSQL9.x + PostGIS
  • 地图数据:OSM
  • 地图瓦片渲染:Mapnik + CartoCSS
  • WMS服务:MapProxy TileStache
  • WEB前端:OpenLayers
  • 地图底图样式编辑:TilleMill

下面我们就从OSMGIS地图数据的导入开始。

1. PostGIS的创建和初始化

我们选PostgreSQL作为我们的GIS数据库,关于PostgreSQL的安装,之前已经有文章介绍过(centOS7下同样适用)。PostGIS需要额外的安装和配置。PostGIS的安装我们同样使用Yum的方式。

1.1 安装PostGIS

PostGIS 安装过程需要依赖一些相关库文件,为了方便安装,首先我们需要添加EPEL源,然后再安装PostGIS

rpm -Uvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-2.noarch.rpm
yum install postgis2_93

1.2 创建地理空间数据库

目前如果导入OSM的全球数据的话,导入后至少需要480G的存储空间。所以根据需求请选择合适的存储路径来创建数据库。

mkdir /DATA/pgtbs_osmgis #目录请自行决定
chown postgres /DATA/pgtbs_osmgis

然后在psql下创建表空间, 为了方便管理,我们再创建一个PG用户osmgis

psql -Upostgres CREATE USER osmgis WITH PASSWORD 'password'; CREATE TABLESPACE pgtbs_osmgis OWNER "osmgis" LOCATION '/DATA/pgtbs_osmgis';

创建数据库和一个对应的管理用户,管理用户建议使用password认证(pg_hba.conf),具体配置可参见之前的文章

CREATE DATABASE osmgis WITH OWNER = "osmgis" ENCODING = 'UTF8' TABLESPACE = pgtbs_osmgis; GRANT ALL PRIVILEGES ON DATABASE osmgis TO osmgis;

1.3 添加postgis功能以及hstore

以下方法,因权限问题,需要使用postgres用户来操作

psql -Upostgres -dosmgis </usr/pgsql-9.3/share/contrib/postgis-2.1/postgis.sql
psql -Upostgres -dosmgis </usr/pgsql-9.3/share/contrib/postgis-2.1/spatial_ref_sys.sql
psql -Upostgres -dosmgis </usr/pgsql-9.3/share/contrib/postgis-2.1/postgis_comments.sql

用postgres用户登录psql,然后创建hstore

psql -Upostgres -dosmgis create extension hstore; #如报错,请检查是否安装了postgresql93-contrib

1.4 PostgreSQL配置的优化

为了使地图数据导入更加顺滑,我们需要调整一下PG的配置文件

配置文件:/var/lib/pgsql/9.3/data/postgresql.conf

  • shared_buffers = 128MB
  • maintenance_work_mem = 256MB
  • checkpoint_segments = 20
  • autovacuum = off

以上的配置一般适用于你有8G的内存,具体配置可根据自己的情况自行调整,可以参考http://wiki.openstreetmap.org/wiki/Osm2pgsql/benchmarks以及http://wiki.openstreetmap.org/wiki/PostgreSQL 上的建议。

修改完配置后别忘了 sudo service postgresql-9.3 reload

2.OSMGIS地图数据下载

根据需要,可以去 http://planet.openstreetmap.org/ 下载地图数据,建议下载 .pbf 二进制格式的数据,这样下载和数据导入速度都会快一些。目前全球数据大小在25G左右(导入后大概占用空间500G左右)。也可以根据需要下载州、国家、地区的数据http://download.geofabrik.de/,或者下载某个城市甚至可以指定一个区域下载http://download.bbbike.org/osm/。更多的OSMGIS数据下载可以参见:http://wiki.openstreetmap.org/wiki/Planet.osm#Downloading

我们可以先下载一个比较小的地图用于先期的测试工作,我们先拿北京的地图作个试验吧!

wget http://download.bbbike.org/osm/bbbike/Beijing/Beijing.osm.pbf

如果打算导入全球数据的话,根据服务器的配置不同,耗时也是不同的。快则一天,多则可能需要一周。具体可参考官方的评测报告:http://wiki.openstreetmap.org/wiki/Osm2pgsql/benchmarks, 里面例举了不同硬件/软件配置的数据导入耗时。

3. 数据导入

因为本次地图底图要支持CartoCSS, 我们选用了osm-bright的方案,当然还有其他一些开源的方案支持CartoCSS+Mapnik的底图瓦片渲染,这个可以根据个人喜好来决定。但无论选择哪种方案,最终是希望能通过一个友好的编辑器(例如TileMill),来方便的设计/修改地图的底图样式。

3.1 下载osm-bright

git clone https://github.com/mapbox/osm-bright.git

3.2 imposm 安装

地图数据文件的导入工具,本次选择了imposm, 也可以用osm2pgsql,一个是python的实现一个是C的实现,据说imposm比osm2pgsql要快一些。

yum install python-psycopg2 python-devel protobuf-compiler gcc gcc-c++ protobuf-devel tokyocabinet-devel geos-devel
yum install python-pip pip install imposm

3.3 数据导入

导入需要指定一个mapping.py的配置文件,此文件在osm-bright的项目目录下

sudo -s cd /home/postgres/
su postgres
imposm --connection=postgis://osmgis:password@localhost/osmgis -m ./osm-bright/imposm-mapping.py --read --write --optimize --deploy-production-tables taiwan-latest.osm.pbf

台湾的数据比较小,我在VPS环境上大概也就不到3分钟就完成了,呵呵。

另外一个需要注意的是,imposm默认链接PG用的是IPv6 ??? 所以可能需要修改pg_hba.conf,否则以上导入过程可能会报错(FATAL: Ident authentication failed for user “xxxxxx”),我们需要在pg_hba.conf中加入以下一条规则:

# IPv6 local connections:  
host   all    osmgis    ::1/128      md5

地图数据导入后,接下来我们就可以用TileMill来浏览和编辑地图样式了。

参考文档:http://blog.csdn.net/goldenhawking/article/details/7952303