linux环境下搭建osm_web服务器二(Mapnik及apache2mod_tile配置):

Mapnikapache2mod_tile配置

上一篇,我们配置好了PostgreSQL服务器,导入了测试数据。今天,我们来配置 mapnik2 + apache2 + mod_tile 的WMS服务器,以便在今后被 OpenLays访问。

<1> 下载mapnik2代码到本地  

(通过系统包python-mapnik2安装即可,同时通过连接打包下载mapnik-master,解压至~/src目录mapnik)  

[plain] view plain copy

  1. cd ~/src  
  2. git clone https://github.com/mapnik/mapnik.git  
  3. cd mapnik  

<2>安装编译所需的库。

由于前面一篇安装过Boost,就简单了。

[plain] view plain copy

  1. sudo apt-get install libltdl-dev libltdl7 libpng12-dev libtiff4-dev   
  2. sudo apt-get install libicu-dev python-cairo-dev python-nose libfreetype6-dev libfreetype6  
  3. sudo apt-get install libcairo2-dev  libcairomm-1.0-dev libgeotiff-dev libtiff4 libtiff4-dev  (通过下载libtiff安装)
  4. sudo apt-get install libtiffxx0c2 libsigc++-dev libsigc++0c2 libsigx-2.0-2 libsigx-2.0-dev 
  5. sudo apt-get install libgdal1-dev  python-gdal imagemagick  ttf-dejavu ttf-unifont  


<3>进行配置、编译

[plain] view plain copy

  1. python scons/scons.py configure INPUT_PLUGINS=all OPTIMIZATION=3 SYSTEM_FONTS=/usr/share/fonts/truetype/  
  2. python scons/scons.py  
  3. sudo python scons/scons.py install  

(通过上步骤中mapnik目录下找到scons.py)

最后,别忘了 

     sudo ldconfig

 

<4> 测试mapnik的运行正常

Python

>>>import mapnik

如果没有什么异样,就说明mapnik已经安装到系统中拉

 

<5>下载mapnik-style

mapnik 针对 OpenStreeMap的环境配置、图层定义有专门的一个包,svn下载:

(通过svn打包下载)

[plain] view plain copy

  1. cd ~/bin  
  2. svn co http://svn.openstreetmap.org/applications/rendering/mapnik mapnik-style  


mapnik 为了加快渲染速度,世界地图的底图以及level 9 之前的很多元素是存储在磁盘文件上的,而不是数据库。我们需要下载这四五百兆的东西。如果网速好,直接调用

[plain] view plain copy

  1. cd ~/bin/mapnik-style  
  2. sudo ./get-coastlines.sh /usr/local/share  


下载安装到  /usr/local/share/world_boundaries 下。但是,苦逼的网速实在不给力,wget下来的东西经常要等待很久,最后还是badCheck。我们要利用迅雷或者其他的下载工具,打开get-coastlines.sh,发现下面几行,

[plain] view plain copy

  1. $WGET http://tile.openstreetmap.org/world_boundaries-spherical.tgz -O $OUTDIR/world_boundaries-spherical.tgz  
  2. $WGET http://tile.openstreetmap.org/processed_p.tar.bz2 -O $OUTDIR/processed_p.tar.bz2  
  3. $WGET http://tile.openstreetmap.org/shoreline_300.tar.bz2 -O $OUTDIR/shoreline_300.tar.bz2  
  4. $WGET http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/10m-populated-places.zip -O $OUTDIR/10m-populated-places.zip  
  5. $WGET http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/110m-admin-0-boundary-lines.zip -O $OUTDIR/110m-admin-0-boundary-lines.zip  

用下载工具下完后,手工释放到/usr/local/share/world_boundaries 下,注意文件夹里没有套文件夹,不要变成 /usr/local/share/world_boundaries/world_boundaries

下载就完成了。

<6> 配置XML Include 参数

进入mapnik-style文件夹

[plain] view plain copy

  1. cd ~/bin/mapnik-style  
  2. ./generate_xml.py --world_boundaries=/usr/local/share/world_boundaries --host=127.0.0.1 --port=5432 --user=www-data --password=您为www-data设置的密码 --dbname=osmgis  

(eg:~/bin/mapnik-style# ./generate_xml.py --world_boundaries=/usr/local/share/world_boundaries --host=192.168.105.180 --port=5432 --user=www-data --password=huawei.123 --db

name=osmgis)

提示osm.xml已经配置好了:Include files written successfully! Pass the osm.xml file as an argument if you want to serialize a new version or test reading the XML

在 inc 文件夹下,产生了数据库、字体等配置文件。打开字体配置文件,可以看见

[html] view plain copy

  1. <!--Settings for Mapnik Fonts  
  2. To see the fonts you have installed with Mapnik do:  
  3. ls `python -c "import mapnik;print mapnik.fontscollectionpath"`-->  
  4.   
  5. <FontSet name="book-fonts">  
  6.   <Font face-name="DejaVu Sans Book" />  
  7.   <Font face-name="unifont Medium" />  
  8. </FontSet>  
  9. <FontSet name="bold-fonts">  
  10. 10.   <Font face-name="DejaVu Sans Bold" />  
  11. 11.   <Font face-name="unifont Medium" />  

12. </FontSet>  

13. <FontSet name="oblique-fonts">  

  1. 14.   <Font face-name="DejaVu Sans Oblique" />  
  2. 15.   <Font face-name="unifont Medium" />  

16. </FontSet>  


不用改变设置,如果想只用unifont, 把每个FontSet的上面一行Font注释了即可。

<7> 转换 mapnik 0.7 osm.xml mapnik 2.x 格式

由于当前mapnik-style是为0.7调配的,需要转换到2.x格式。转换比较简单,首先,安装库

sudo apt-get install libxml2 libxml2-dev python-lxml

而后,直接升级

upgrade_map_xml.py     osm.xml      osm-mapnik2.xml

https://github.com/makinacorpus/mapnik2/blob/master/utils/upgrade_map_xml/upgrade_map_xml.py#L92找到upgrade_map_xml.py, 未实现)

如果没有产生文件,可能是前一步没有把数据库连接配置好。

 

<8> 测试渲染

转换好后,打开mapnik-style文件夹下的generate_image.py, 修改几行,以便避免因为使用 import mapnik2 造成的deprecated警告,并把图像挪到china

(将generate_image.py备份到根目录,修改mapnik2为mapnik)

[python] view plain copy

  1. #!/usr/bin/env python  
  2.   
  3. import mapnik  
  4. #...  
  5.   
  6. if __name__ == "__main__":  
  7.     try:  
  8.         mapfile = os.environ['MAPNIK_MAP_FILE']  
  9. 9.      except KeyError:  
  10. 10.         mapfile = "osm-mapnik2.xml"  
  11. 11.       
  12. 12.     map_uri = "image.png"  
  13. 13.   
  14. 14.     #---------------------------------------------------  
  15. 15.     #  Change this to the bounding box you want  
  16. 16.     #  
  17. 17.     bounds = (119, 29, 121, 31)  
  18. 18.     #---------------------------------------------------  


保存后,直接执行,如果没错,就出现了 image.png

 

下一步,开始apache2+mod_tile+renderd的配置

--------------------------------------------------

<9> 安装apache2fcgi

由于后面几篇博文将涉及利用 C fcgi 创建简单的按地名搜索位置、按位置搜索附近要素的功能,我们需要fcgi库。

sudo apt-get install apache2 libfcgi-dev apache2-threaded-dev libagg-dev apache2-utils

访问 http://127.0.0.1

看到"It Works“ 就可以拉

<10> 编译安装瓦片服务

瓦片服务是关键部件,该部件将向用户提供 http://address/mod_tile2/n/x/y.png 的访问接口,在图片不存在的情况下,驱动 renderd 守护进程进行渲染。为了防止过多小文件碎片化影响磁盘的性能,renderd 和 mod_tile 将会使用瓦片簇来存储瓦片(如 每 8 *8 瓦片为一个文件),因此,渲染也是针对瓦片簇的。

首先,下载最新的代码

cd ~/src

svn co http://svn.openstreetmap.org/applications/utils/mod_tile

(在git库https://github.com/openstreetmap/mod_tile下找到)

编译安装

[plain] view plain copy

  1. cd mod_tile  
  2. ./autogen.sh  
  3. ./configure  
  4. make  
  5. sudo make install  
  6. sudo make install-mod_tile  
  7. sudo ldconfig  

 

如果不出错,就安装好啦

<11> 配置瓦片渲染后台服务renderd

首先,我们来建立文件夹,用来存储socket和状态.

[plain] view plain copy

  1. sudo mkdir /var/run/renderd  
  2. sudo chown www-data /var/run/renderd  

而后,打开/usr/local/etc/renderd.conf

sudo nano /usr/local/etc/renderd.conf

修改几项,注意注释里的内容哦! 如果现在还木有这个文件,说明mod_tile 的install 没有搞定。(备份至根目录修改)注:修改URI似乎不影响访问。

[plain] view plain copy

  1. [renderd]  
  2. ;把socketname设置到刚才创建的文件夹里  
  3. socketname=/var/run/renderd/renderd.sock  
  4. ;设置CPU核心  
  5. num_threads=4  
  6. ;这个瓦片路径现在只能是这个,不过我们通过创建链接,定向到2TB分区去  
  7. tile_dir=/var/lib/mod_tile ; DOES NOT WORK YET  
  8. ;同样设置到刚才创建的路径里  
  9. stats_file=/var/run/renderd/renderd.stats  
  10. 10.   

11. ;mapnik设置  

12. [mapnik]  

13. plugins_dir=/usr/local/lib/mapnik/input  

14. font_dir=/usr/share/fonts/truetype/unifont  

15. font_dir_recurse=1  

  1. 16.   

17. [default]  

18. URI=/osm_tiles2/  

19. ;这个是我们前面调试好的渲染器的style  

20. XML=/home/goldenhawking/bin/mapnik-style/osm-mapnik2.xml  

21. HOST=localhost

22. ;HTCPHOST=proxy.openstreetmap.org  

 

<12> 配置apache2 mod_tile

如果打算直接把瓦片放在/var/lib/mod_tile,就执行

(执行~/bin/mapnik-style/generate_tiles_multiprocess.py ,生成瓦片数据)

[plain] view plain copy

  1. sudo mkdir /var/lib/mod_tile  
  2. sudo chown  www-data /var/lib/mod_tile  

本次,由于分区时已经指定了这个文件夹到200GB的分区上,就没有执行mkdir,直接改变所有者给www-data

首先,让apache2 在启动时装载 mod_tile

建立 /etc/apache2/conf.d/mod_tile,里面包含一行

(In Apache 2.4, "conf-available" and "conf-enabled" have replaced "conf.d")在conf-available下建立。

[plain] view plain copy

  1. LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so  


而后,设置用户访问网页的入口点  

(应为000-default.conf,多default-ssl.conf备份至/下修改)

[plain] view plain copy

  1. sudo nano  /etc/apache2/sites-available/default

 

[html] view plain copy

  1. <VirtualHost *:80>  
  2.     ServerAdmin webmaster@localhost  
  3.        #这是加入的  
  4.     LoadTileConfigFile /usr/local/etc/renderd.conf  
  5.     ModTileRenderdSocketName /var/run/renderd/renderd.sock  
  6.     ModTileRequestTimeout 0  
  7.     ModTileMissingRequestTimeout 30  
  8.         #加入结束  
  9.     DocumentRoot /var/www  
  10. 10.     <Directory />  

这就配置好啦,重启计算机

<13> 测试 renderd 

完成了这么多步骤,我们来测试一下子。

[plain] view plain copy

  1. cd ~/src/mod_tile  
  2. sudo su www-data  
  3. renderd -f -c /usr/local/etc/renderd.conf  

如果看到了千呼万唤的 starting status thread, 就好了!显示类似

[plain] view plain copy

  1. renderd[3091]: Created server socket 5  
  2. renderd[3091]: Renderd is using mapnik version 200200.200.200200  
  3. "Mapnik LOG> 2012-09-07 13:20:07:" Problem loading plugin library: /usr/local/lib/mapnik/input/python.input (dlopen failed - plugin likely has an unsatisfied dependency or incompatible ABI)  
  4. renderd[3091]: DEBUG: Loading font: /usr/share/fonts/truetype/unifont/unifont.ttf  
  5. Running in foreground mode...  
  6. renderd[3091]: Starting stats thread  

访问

http://localhost/osm_tiles2/0/0/0.png

就知道行不行

 

<14>设置开机运行
为了让开机运行,需要发到 /etc/init.d里

[plain] view plain copy

  1. sudo cp  ~/src/mod_tile/debian/renderd.init /etc/init.d/renderd  
  2. sudo chmod u+x /etc/init.d/renderd  

而后编辑/etc/init.d/renderd,
DAEMON=/usr/local/bin/$NAME
DAEMON_ARGS="-c /usr/local/etc/renderd.conf"

保存,使用

sudo /etc/init.d/renderd start

sudo /etc/init.d/renderd stop

测试

最后,设置随机启动

sudo ln -s /etc/init.d/renderd /etc/rc2.d/S20renderd

重启,访问

http://localhost/osm_tiles2/0/1/0.png

就知道wms行不行

<15> 设置时间戳

导入数据后,设置时间戳

[plain] view plain copy

  1. touch /var/lib/mod_tile/planet-import-complete  
  2. sudo chown www-data /var/lib/mod_tile/planet-import-complete  


这样,避免反复渲染瓦片(如果没有这个文件,则旧于3天的瓦片都会被重新渲染)

-----------------------

下一篇,将使用openlayers 产生slippymap

转载:http://blog.csdn.net/goldenhawking/article/details/7952303

posted @ 2017-02-08 21:07  知行Lee  阅读(729)  评论(0编辑  收藏  举报