1. 程式人生 > >fedora27下的OpenStreetMap離線地理編碼伺服器的搭建(Nominatim)

fedora27下的OpenStreetMap離線地理編碼伺服器的搭建(Nominatim)

前言

CSDN上有關於ubuntu如何安裝Nominatim的博文ubuntu16.04下的OpenStreetMap離線地理編碼伺服器的搭建(Nominatim),但是作者尚未查詢到中文的、關於fedora如何安裝Nominatim的博文,甚至也未見英文的博文,這是本文寫作的目的。

可以參考的網站:

  • Nominatim官方文件Installation on CentOS 7,CentOS和Fedora還比較像,但是也有不同,最重要的就是fedora裝的時候注意指定版本,版本,版本!! (fedora與ubuntu的軟體目錄,配置、啟動方式有很大不同,參考ubuntu下的安裝反而更容易混淆) 本文是對於fedora27安裝Nominatim的心得步驟,不同的系統、不同的系統版本是有差別的。我的建議是:注意軟體版本,注意相互之間的依賴關係。先通讀本文,掌握整個安裝思路和重點,切記不顧實際光粘命令列。

一、新建Fedora使用者

Nominatim很亂,先新建個使用者,不然各種許可權問題

  • 圖形化操作:設定–>詳情–>使用者–>解鎖–>新建(賬戶型別選管理員,這樣nominatim就跟你原來的賬戶許可權一樣);
  • 然後登出當前使用者,切換到nominatim使用者;
  • 以下所有操作都在nominatim這個賬戶下做的。 圖形化操作:設定-->詳情-->使用者-->解鎖-->新建-->管理員

二、裝依賴(軟體)

這部分最重要!!!是後邊成功配置的前提,不要光粘到命令列,先看一眼我說的是什麼!!!! 官方CentOS的安裝教程沒指定軟體的版本,貼上到fedora27中後,postgresql被不同的依賴項分別安裝了兩個版本(一個9.x,一個10),後邊各種問題,崩潰。。所以重要的是版本,版本,版本!!!

1)主要分三大類:

  1. postgresql類(分9.x版本的和10版本的,不同版本配置檔案的位置不同,本文裝的是10版本)
  2. postgis類 (它的版本應該與postgresql的對應,如postgis25_10的意思就是postgis是2.5版本,支援postgresql 10,,,但實際證明postgis2.5版本不被Nominatim支援,本文最後選的postgis23_10)
  3. php (沒什麼問題,不用指定版本,好像是7.1版本)

2)安裝命令:

  1. postgresql10相關:
sudo dnf install postgresql10 postgresql10-libs postgresql10-server postgresql10-contrib postgresql10-devel
  1. postgis相關
sudo dnf install postgis23_10 postgis23_10-utils
  1. php相關
sudo dnf install php php-pgsql php-pear php-pear-DB php-intl
  1. 其他
sudo dnf install libpqxx-devel proj-epsg bzip2-devel proj-devel libxml2-devel boost-devel \
                 wget git cmake make gcc gcc-c++ libtool policycoreutils-python \
                 expat-devel zlib-devel

切記:不要好幾個教程對著看,然後重複貼上命令,軟體都裝重了!!然後各種問題,,,上邊列出來的軟體如果都裝好了,應該就夠了,(我之前一直處理openstreetmap的.pbf資料,所以與.pbf資料相關的庫早就裝好了,讀者要是知道openstreetmap但還不知道.pbf資料,那你得下點功夫了,本文就不扯怎麼裝.pbf相關的庫了)

三、配置(和啟動)postgresql 10 (Fedora系統下)

千萬不要參考:1. ubuntu中postgresql的配置和啟動方式; 2. postgresql 9的配置和啟動方式。!!!!不然各種亂(因為不同系統下檔案路徑不一樣,而且9和10版本的檔案路徑也不一樣)

1) 初始化及啟動

sudo /usr/pgsql-10/bin/postgresql-10-setup initdb
sudo systemctl enable postgresql-10.service
sudo systemctl start postgresql-10.service

2) 配置postgresql.conf檔案

啟動管理員許可權下的文字編輯器,編輯postgresql.conf檔案

sudo gedit /var/lib/pgsql/10/data/postgresql.conf

修改如下內容,括號中的值代表要修改成的值

shared_buffers (2GB)
maintenance_work_mem (10GB)
work_mem (50MB)
effective_cache_size (24GB)
synchronous_commit = off
checkpoint_timeout = 10min
checkpoint_completion_target = 0.9

改完之後,重啟服務:

sudo systemctl restart postgresql-10.service

3) 新增兩個postgres使用者

老實說我也不明白為什麼要新增這兩個使用者,但是注意: 這是postgres的使用者,不是fedora作業系統的使用者!!!! 意思好像是資料庫中的使用者??? (我剛開始卡了很長很長時間,到後來反正也還沒明白,苦笑)

  • 先用命令進入postgres使用者 (很繞,我也講不太清楚這塊,好像是因為安裝postgresql後自動出來的一個postgres使用者,但它只能做特定的資料庫相關的事)
su - postgres

(這塊新讀者可能容易出問題,密碼輸入的是nominatim使用者的密碼)

  • 執行如下命令,新建兩個postgres使用者:
createuser -s nominatim
createuser apache
  • 然後退回nominatim賬戶
exit

如圖(我的都建立過了,所以提示失敗) 在這裡插入圖片描述

四、裝Nominatim

本文將nominatim安裝在/opt/nominatim資料夾下(注意官方CentOS的安裝教程是在/srv/nominatim,並將它定義成了$USERHOME,本文少定義,省的混。。讀者就跟我裝一個路徑吧,過程理清了之後想換也方便,,不然後邊的配置講不清楚)

1)建資料夾並改許可權

sudo mkdir /opt/nominatim
sudo chmod 777 -R /opt/nominatim

2) 下載、編譯、安裝Nominatim

  • 官網github上下載(截止到我下載的時候是3.20版本),並移動到/opt/nominatim目錄下,解壓縮…之後應該是我這樣的(還沒有build資料夾) 在這裡插入圖片描述
  • 先進入Nominatim資料夾裡,執行命令wget -O data/country_osm_grid.sql.gz https://www.nominatim.org/data/country_grid.sql.gz下載國家網格(country grid)資料 在這裡插入圖片描述
  • 退回來,新建build資料夾,進入build資料夾,cmake,然後make
cd /opt/nominatim
mkdir build
cd build
cmake /opt/nominatim/Nominatim
make

(在這個目錄下進行cmake和make) 在這裡插入圖片描述

  • 還在build資料夾內,配置settings/local.php檔案(即/opt/nominatim/build/settings/local.php),內容如下(沒有就新建):
<?php
 // Paths
 @define('CONST_Postgresql_Version', '10.5');  //這個是參照ubuntu安裝的那篇的配置檔案新增的,好像沒有也行
 @define('CONST_Postgis_Version', '2.3');  // 好像沒有也行
 //web set
 @define('CONST_Database_Web_User', 'apache');
 @define('CONST_Website_BaseURL', '/nominatim/');
 @define('CONST_Osm2pgsql_Flatnode_File', '/opt/nominatim/build/flatnode.file'); // 這是官方推薦新增的(非必須)

如果cmake或make不成功,多半是因為前邊的postgresql和postgis沒裝好(只是沒裝好,還不涉及配置的問題)。。。沒更好的辦法,按提示去網上查根本特麼沒有什麼答案。。把裝了的軟體重新卸了,重灌,重配置,等你到了不用看教程也大致明白哪裡重要的時候,就能裝好了

五、配置Apache Webserver

  • 配置檔案為 /etc/httpd/conf.d/nominatim.conf(沒有就新建),同樣gedit開啟,編輯內容如下:
<Directory "/opt/nominatim/build/website">
  Options FollowSymLinks MultiViews
  AddType text/html   .php
  DirectoryIndex search.php
  Require all granted
</Directory>
Alias /nominatim /opt/nominatim/build/website

這裡/opt/nominatim就對應上一節Nominatim的位置。

  • 重新載入apache:
sudo systemctl enable httpd
sudo systemctl restart httpd

這時候你開啟網址http://localhost/nominatim應該就可以看到一些內容了(文字內容,提示嚴重錯誤,沒有nominatim資料庫之類的,因為還沒有匯入資料嘛)

六、匯入資料

  • (可選)下載額外的wiki資料,進入到/opt/nominatim/Nominatim/data目錄下,執行命令:
wget https://www.nominatim.org/data/wikipedia_article.sql.bin
wget https://www.nominatim.org/data/wikipedia_redirect.sql.bin
  • 匯入資料: openstreetmap資料可以在網站https://download.geofabrik.de/下載(讀者應該知道吧)。匯入命令(還在/opt/nominatim/build目錄下呢):
./utils/setup.php --osm-file <data file> --all [--osm2pgsql-cache 28000] 2>&1 | tee setup.log

裡邊<data file>替換為你的.pbf檔案,--osm2pgsql-cache 28000是可選引數,一個實際的命令如圖: 在這裡插入圖片描述 要試一試有沒有問題的話先選一個小點兒的資料,如北京的。同樣地,如果匯入不成功多半是因為前邊的postgresql和postgis沒裝好,例如,我剛開始裝的postgis25_10(2.5版本),不被支援,提示: found postgis version 0(應該就是沒找到的意思),後來換了低版本的postgis23_10,匯入成功了。 如果失敗,再次匯入之前要先刪除資料庫,命令:

sudo -u postgresdropdb nominatim

總結

本文給出的是Fedora27下安裝Nominatim的基本方法,postgresql的版本為10,postgis的版本為2.3,php版本為7.1,Nominatim的版本為3.2。並給出了配置postgresql、apache、nominatim的方法。需要特別注意的是:安裝軟體過程中要指定軟體版本,注意區分不同作業系統、不同軟體版本的安裝、配置上的差異。限於作者水平和應用場景,關於區域網的配置、更多額外輔助資料的新增、保持資料實時更新的方法未做討論,這部分內容可以參考Nominatim官方文件以及ubuntu16.04下的OpenStreetMap離線地理編碼伺服器的搭建(Nominatim)

附、最後的效果

在這裡插入圖片描述 不聯網也會有結果,但是可能網格圖片顯示有問題。。 本人的是為了用python中的geocoder庫離線使用地理編碼功能,python程式碼如下:

import geocoder 
url = 'http://localhost/nominatim'
g = geocoder.google('北京市北京站', url=url)
g.json