轉(zhuǎn)載請(qǐng)注明表作者think8848及出處(http://think8848.cnblogs.com)
node-mapnik依賴項(xiàng)中要求g++ >= 5, toolchain (>= GLIBCXX_3.4.20 from libstdc++)(見官網(wǎng)說(shuō)明),但是CentOS7里面默認(rèn)的gcc和g++的版本是4.8.5,GLIBCXX只到3.4.19,因此部署過(guò)程中各種問(wèn)題,經(jīng)過(guò)常期、大量的折騰,最終終于找到一個(gè)可行的部署方法,在本文中將用到一些需要自行編譯安裝的包,只能保證文中的版本沒(méi)有問(wèn)題,不保證其他版本可用。
gcc5.4.0源碼包 鏈接:http://pan.baidu.com/s/1sljcdrR 密碼:u48m
boost1.62.0源碼包 鏈接:http://pan.baidu.com/s/1sl6cEeh 密碼:mz0h
mapnik3.0.12完整源碼包(不需要從github上再下載依賴包) 鏈接:http://pan.baidu.com/s/1o79qvjk 密碼:aw4g
1. 最小安裝的CentOS安裝必要的工具包
建議本文中的所有操作使用root帳號(hào),因?yàn)樵趍ake install使用sudo權(quán)限時(shí),如果root帳號(hào)下沒(méi)有及時(shí)更新環(huán)境變量,就會(huì)發(fā)生很多意外;本文介紹的部署過(guò)程是一個(gè)非常漫長(zhǎng)的過(guò)程,完整走一遍只少要半天(虛擬機(jī):4G內(nèi)存),為了避免不必要的麻煩,建議直接用root。
su
yum install wget vim net-tools unzip bzip2 gcc gcc-c++ epel-release libicu-devel -y
查看gcc和g++的版本,顯示為4.8.5

2. 升級(jí)gcc版本
CentOS下升級(jí)gcc版本有兩個(gè)途徑,一個(gè)是添加其他源進(jìn)行自動(dòng)升級(jí),一個(gè)是手動(dòng)編譯升級(jí),這里先順便講下自動(dòng)升級(jí)的兩個(gè)辦法:
a. 添加Fedora源
在 /etc/yum.repos.d 目錄中添加文件 FedoraRepo.repo ,并輸入以下內(nèi)容:
[warning:fedora] name=fedora mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=fedora-23&arch=$basearch enabled=1 gpgcheck=1 gpgkey=https://getfedora.org/static/34EC9CBA.txt
然后使用 yum install gcc gcc-c++ -y 進(jìn)行安裝,注意,如果你要用這種方法安裝gcc,那在第1步就干脆不要安裝gcc和gcc-c++包了。
b. 使用Devtoolset-4升級(jí),詳細(xì)方法見這里
yum install centos-release-scl yum install devtoolset-4-gcc* scl enable devtoolset-4 bash which gcc gcc --version
好了,以上方法我們都不選,因?yàn)槲易罱K部署成功用的是手動(dòng)升級(jí)的方法(至于為什么不選擇自動(dòng)更新,還有一個(gè)很重要的原因,那就是CentOS存在的邏輯,很多人選用CentOS而不是Ubuntu作為服務(wù)器操作系統(tǒng),主要原因是什么呢?)
好了,我們先下載gcc5.4.0,下載地址 http://ftp.gnu.org/gnu/gcc/gcc-5.4.0/gcc-5.4.0.tar.gz
cd /usr/local/src wget -O gcc-5.4.0.tar.gz http://101.96.10.61/ftp.gnu.org/gnu/gcc/gcc-5.4.0/gcc-5.4.0.tar.gz tar -xzvf gcc-5.4.0.tar.gz cd gcc-5.4.0
#下載依賴項(xiàng) ./contrib/download_prerequisites
#為了在長(zhǎng)期的編譯過(guò)程中Linux不黑屏,臨時(shí)關(guān)閉屏保
setterm -blank 0
mkdir build && cd build
../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
#4核cpu就是j4,在vmware12下有用
make -j4
#機(jī)器不好大概這里要花3小時(shí)
make install
先查看下GLIBCXX的版本信息,不出意外的話,應(yīng)該最高就到GLIBCXX_3.4.19,我們要用最新的版本替換原來(lái)的版本

搜索libstdc++.so.6*,看看都有什么結(jié)果,我們會(huì)發(fā)現(xiàn)在/usr/lib64里面有6.0.19,這是我們使用yum安裝的,/usr/local/lib64/libstdc++.so.6.0.21是我們剛才編譯安裝的,需要用最新的替換舊版本的。

首先將/usr/lib64下面的libstdc++.so.6*刪除掉
rm /usr/lib64/libstdc++.so.6* -f (實(shí)際刪除兩個(gè)文件),
然后我們?cè)?usr/lib64下為libstdc++.so.6.0.21建立鏈接
ln -s /usr/local/lib64/libstdc++.so.6.0.21 /usr/lib64/libstdc++.so.6 ,
順便再將/usr/local/lib64下面一個(gè)看著礙眼的文件刪除
rm /usr/local/lib64/libstdc++.so.6.0.21-gdb.py -f ,
(如果不刪除這個(gè)文件,則在ldconfig創(chuàng)建動(dòng)態(tài)鏈接庫(kù)文件緩存時(shí)會(huì)報(bào)一個(gè)莫名其妙的錯(cuò)誤)
最后在/etc/ld.so.conf中加入/usr/local/lib64,為動(dòng)態(tài)共享庫(kù)指定搜索路徑 vim /etc/ld.so.conf

然后創(chuàng)建緩存
ldconfig
再次檢查GLIBCXX版本 strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX | more ,這時(shí)就已經(jīng)包含GLIBCXX_3.4.21了

檢查下gcc和g++的版本,注意,如果檢查到的版本不是5.4.0,而是4.8.5(安裝前的版本),則仔細(xì)想想有沒(méi)有按照本文步驟來(lái),如果確認(rèn)是沒(méi)有出入,那么就重啟機(jī)器吧 reboot ,啟動(dòng)好后再次檢查,應(yīng)該就可以看到正確結(jié)果了。

3. 編譯安裝boost1.62.0
cd /usr/local/src wget -O boost_1_62_0.tar.gz http://pilotfiber.dl.sourceforge.net/project/boost/boost/1.62.0/boost_1_62_0.tar.gz tar -xzvf boost_1_62_0.tar.gz cd boost_1_62_0 ./bootstrap.sh --with-icu --with-libraries=all ./b2 threading=multi
#等吧,雖然沒(méi)有g(shù)cc編譯時(shí)間長(zhǎng),但是也不快 ./b2 install
經(jīng)過(guò)一番磨人的編譯,boost的編輯結(jié)果出來(lái)了,貌似有些錯(cuò)誤,但是不用理會(huì)

再次打開/etc/ld.so.conf添加共享庫(kù)路徑,在里面添加 /etc/local/lib
vim /etc/ld.so.conf

最后不要忘記更新緩存
ldconfig
5. 編譯安裝mapnik
先安裝依賴項(xiàng),依賴項(xiàng)比較多,要仔細(xì)輸入,避免后面不必要的麻煩
yum install freetype-devel libtool-ltdl-devel libpng-devel libtiff-devel libjpeg-devel python-devel harfbuzz-devel postgresql-devel proj-devel proj-epsg sqlite-devel libwebp-devel gdal-devel cairo-devel -y
第一步先下載源碼,(直接下載的zip包里面缺少依賴項(xiàng))
yum install git -y git clone git://github.com/mapnik/mapnik.git cd mapnik git submodule update --init
編譯安裝源碼,時(shí)間也有點(diǎn)小長(zhǎng),但是還能忍受,4核CPU用JOBS=4,具體視電腦情況而定
python scons/scons.py configure | more
python scons/scons.py JOBS=4
python scons/scons.py install
到這一步了就小心點(diǎn),確保每個(gè)依賴項(xiàng)都已經(jīng)存在


查看mapnik版本 mapnik-config -v

安裝完成后測(cè)試下mapnik是否能正常工作
ldconfig
cd /usr/local/src/mapnik/demo/c++
mkdir demo && cp ../data ./demo -r
vim rundemo.cpp
在rundemo.cpp中修改以下內(nèi)容
修改前:

修改后:

然后編譯運(yùn)行
make clean
make
./rundemo

有圖有真相,看看生成的地圖是啥樣的

6.安裝node.js
這一步是本文中最簡(jiǎn)單的了,沒(méi)有任何技巧,如果安裝出問(wèn)題 ,那一定是沒(méi)有按照我前面的步驟來(lái)
yum install nodejs -y

7. 安裝node-mapnik
cd /usr/local/src mkdir node-mapnik && cd node-mapnik vim package.json
在打開創(chuàng)建package.json文件后,輸入以下內(nèi)容
{ "name": "nmtest", "description": "node-mapnik test by think8848", "version": "0.0.1", "private": true, "dependencies": { "mapnik": "3.*" } }
開始安裝node-mapnik,通常而言,使用 npm install 即可安裝好所有依賴包,然后因?yàn)楸娝苤脑?..,如果你沒(méi)有沒(méi)有給力的FQ工具,還是使用下列命令吧
npm install --registry=https://registry.npm.taobao.org
如果看到下面這個(gè)畫面,就說(shuō)明成功了99%了

寫一段代碼測(cè)試下先將剛才我們?cè)诎惭bmapnik時(shí)生成的demo.jpg復(fù)制過(guò)來(lái)
cp /usr/local/src/mapnik/demo/c++/demo.jpg ./
創(chuàng)建node代碼, vim app.js ,輸入以下內(nèi)容
var mapnik = require('mapnik'); new mapnik.Image.open('demo.jpg').save('demo.png');

執(zhí)行結(jié)果:

---------------------2016年12月18日更新----------------------------
將node-mapnik添加到公共模塊中
先將node-mapnik安裝到公共模塊的目錄,默認(rèn)情況下安裝到 /usr/lib/node_modules
sudo npm install -g mapnik
添加 NODE_PATH 環(huán)境變量,使用 sudo vim /etc/profile 命令,然后在文件最下面添加
export NODE_PATH=/usr/lib/node_modules:$PATH

最后再更新環(huán)境變量
source /etc/profile
這樣以后就不用每次使用時(shí)都要安裝一次node-mapnik了,安裝的過(guò)程實(shí)在是太痛苦了,沒(méi)有梯子基本上不會(huì)成功。
---------------------2016年12月18日更新結(jié)束----------------------------
接下來(lái)將學(xué)習(xí)如何使用node-mapnik生成openstreetmap瓦片圖
浙公網(wǎng)安備 33010602011771號(hào)