# 概述
Nominatim (from the Latin, 'by name') is a tool to search OSM data by name and address and to generate synthetic addresses of OSM points (reverse geocoding).
Nominatim Introduction
# 相关准备
先更新 Centos 的所有软件包,确保是最新的:
[root@VM-0-5-centos /root]#sudo dnf update -y |
These instructions expect that you have a freshly installed CentOS version 8. Make sure all packages are up-to-date by running:
sudo dnf update -y
由于标准的 CentOS 储存库并不包含所有必需的软件包,还需要启用 EPEL 储存库。例如,与 SELinux 相关的 redhat-hardened-cc1 软件包,执行以下命令:
[root@VM-0-5-centos /root]#sudo dnf install -y epel-release redhat-rpm-config |
The standard CentOS repositories don't contain all the required packages, you need to enable the EPEL repository as well. For example for SELinux related redhat-hardened-cc1 package:
sudo dnf install -y epel-release redhat-rpm-config
EPEL 包含 Postgres 9.6 和 10,但不包含 PostGIS。可从 postgresql.org 获得 Postgres 9.4 + / 10/11/12 和 PostGIS 2.4 / 2.5 / 3.0:
[root@VM-0-5-centos /root]#sudo dnf -qy module disable postgresql | |
[root@VM-0-5-centos /root]#sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm |
EPEL contains Postgres 9.6 and 10, but not PostGIS. Postgres 9.4+/10/11/12 and PostGIS 2.4/2.5/3.0 are availble from postgresql.org:
sudo dnf -qy module disable postgresql
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# 所需框架安装
安装 Nominatim 所需的所有软件包,在安装 Nominatim 所需的软件包之前,先确保 Centos 里已经配置好了 PHP,Python3,Apache (or Nginx)
此处贴出其他博客的安装过程来做参考:
-
PHP 安装:(在下面安装 Nominatim 的所需软件包中已经包含了 PHP,但建议按照下面博客来安装 php74,安装版本为 7.4.19)
-
Apache 安装(默认是安装了的):
怎么在 CentOS 8 上安装启用 Apache 服务器Apache 安装
CentOS8 安装 ApacheApache 安装
-
Python3 安装
在 CentOS8 中,默认情况是安装的 Python2(yum 是基于 python2 的),可以通过 yum 来安装 Python3,也可以通过编译来安装(cmake),以下为编译安装:
CentOS 安装 Python3.7Python3.7 安装
centos 安装 python3 详细教程python3 安装
此处为用 yum 安装 python3.6:
CentOS 下 yum 安装 Python3Python3 安装
此处为编译安装 pyhton3.9.5:
centos8 安装 python3.8Python3 安装
-
Anaconda3 安装:(应该不需要吧,把 python3 安装好后有问题的话,可以考虑试试 Anaconda3)
CentOS 7 安装 Anaconda3Anaconda3 安装
Anaconda 简介及 CentOS 下的安装及使用Anaconda 简介与使用
# 软件包列表
此处列举了所需的软件包:
"sudo dnf --enablerepo=powertools install -y xxx" 强烈建议用这句指令来安装上面的软件包,而不是 "yum install -y xxxx",在安装的时候自动搜索所需要的所有依赖包一并安装,避免了安装时候确实依赖包的问题,老省事了~
这些安装包可以直接通过 "yum install xxxx" 来进行安装,当报错找不到相应软件包时,可以考虑使用 "yum search xxxx" 来搜索相应包,实在找不到可以百度等来查看解决方案(一般可能会用到 pip 来安装,但前提是已经安装了 pip)
在官方文档中还给出了另外一条指令,虽然不会影响到后面的 Nominatim 的安装,但是在后面设置 Apache Web 服务器时会报出缺少 psycopg2 模板的错误,如果运行此命令报出 ERROR: No matching distribution found for psycopg2,可以先跳过,解决方案在后面说明
Now you can install all packages needed for Nominatim:
sudo dnf --enablerepo=powertools install -y postgresql12-server
postgresql12-contrib postgresql12-devel postgis30_12
wget git cmake make gcc gcc-c++ libtool policycoreutils-python-utils
llvm-toolset ccache clang-tools-extra
php-pgsql php php-intl php-json libpq-devel
bzip2-devel proj-devel boost-devel
python3-pip python3-setuptools python3-devel
expat-devel zlib-devel libicu-dev
pip3 install --user psycopg2 python-dotenv psutil Jinja2 PyICU
安装完后,检查是否安装上:(查看软件版本)
#查看 PHP 版本 | |
php -v | |
# 查看 PostgreSQL 版本 | |
psql --version | |
# 查看 PostGIS 版本 | |
rpm -qa | grep postgis |
# 系统配置
以上已经安装完了 Nominatim 所需要的所有软件包,从此处开始对系统进行一些配置:
# 创建专有用户账户
Nominatim 将作为全局服务在您的计算机上运行。因此,最好以其自己的单独用户帐户安装它。在下面的示例中,我们假设该用户名为 nominatim,安装位于 "/srv/nominatim" 中。要创建用户和目录,则运行命令:
[root@VM-0-5-centos /root]#sudo useradd -d /srv/nominatim -s /bin/bash -m nominatim |
需要注意的是,这里没有指定密码,可以设定一下 nominatim 用户的密码方便切换:
[root@VM-0-5-centos /root]#sudo passwd nominatim |
# 设置环境变量
之所以要设置环境变量,方便后期的一些安装:(还需要在 nominatim 里设置一下)
[root@VM-0-5-centos /root]#export USERNAME=nominatim | |
[root@VM-0-5-centos /root]#export USERHOME=/srv/nominatim |
确保系统可以从主目录读取:
[root@VM-0-5-centos /root]#chmod a+x $USERHOME |
在这里官方给出了一个警告,表示不能用 root 权限来编译安装和运行,为了安全啥的...... 但要注意的是,每次重新链接到 Centos 时都得重新设置一下环境变量,不然会找不到路径.
# 设置 PostgreSQL
由于 CentOS 不会自动创建数据库(就是安装完后 PostgreSQL 数据库是空的),所以需要先初始化一下:
[root@VM-0-5-centos /root]#sudo /usr/pgsql-12/bin/postgresql-12-setup initdb | |
[root@VM-0-5-centos /root]#sudo systemctl enable postgresql-12 |
这里由于是安装 postgresql12,所以是初始化 postgresql-12
初始完后会显示一个 OK,表示初始化完成
下面就是修改一下 postgresql 里的配置(文件位置大概在 /var/lib/pgsql/data/postgresql.conf)
按照官方的修改要求,建议 32Gb RAM 的机器的配置为这样的:
(在文件里修改时,需要把前面的 #给删掉~)
由于服务器没有这么大而且还是初次导入,所以只建议修改这两个设置:
fsync = off | |
full_page_writes = off |
在更新完配置后,重启一下 postgresql 服务:
[root@VM-0-5-centos /root]#sudo systemctl restart postgresql-12 |
在最后,需要添加两个 postgres 用户:一个用于执行导入的用户,另一个用于应仅读取数据库才能访问数据库的 Web 服务器:
[root@VM-0-5-centos /root]#sudo -u postgres createuser -s $USERNAME | |
[root@VM-0-5-centos /root]#sudo -u postgres createuser apache |
这里第一个添加执行导入的用户时,需要先在 sudoers 文件里把 nominatim 用户添加进去,文件位置:/etc/sudoers
# Nominatim 安装与配置
# 编译安装 Nominatim
从这里开始需要先切换到 nominatim 用户下
[root@VM-0-5-centos /root]#su nominatim | |
[nominatim@VM-0-5-centos /root]$ |
获取发行版的源代码并解压缩:
[nominatim@VM-0-5-centos /root]$cd $USERHOME | |
[nominatim@VM-0-5-centos /srv/nominatim]$wget https://nominatim.org/release/Nominatim-3.7.1.tar.bz2 | |
[nominatim@VM-0-5-centos /srv/nominatim]$tar xf Nominatim-3.7.1.tar.bz2 |
该代码必须构建在单独的目录中。创建此目录,然后在其中配置和构建 Nominatim:
[nominatim@VM-0-5-centos /srv/nominatim]$mkdir $USERHOME/build | |
[nominatim@VM-0-5-centos /srv/nominatim]$cd $USERHOME/build | |
[nominatim@VM-0-5-centos /srv/nominatim/build]$cmake $USERHOME/Nominatim-3.7.1 | |
[nominatim@VM-0-5-centos /srv/nominatim/build]$make | |
[nominatim@VM-0-5-centos /srv/nominatim/build]$sudo make install |
这里的 build 文件夹是在 Nominatim-3.7.1 文件夹外面创建的,当然可以创建到 Nominatim-3.7.1 里(有些博客是这样子的)
正常情况 cmake 不会报错,但有些时候会遇到一些问题
# cmake 相关报错
在 cmake 编译的过程中,当时遇到了这样的问题:
[nominatim@VM-0-5-centos /srv/nominatim/build]$cmake $USERHOME/Nominatim-3.7.1 | |
-- The C compiler identification is GNU 8.3.1 | |
-- The CXX compiler identification is GNU 8.3.1 | |
-- Detecting C compiler ABI info | |
-- Detecting C compiler ABI info - done | |
-- Check for working C compiler: /usr/lib64/ccache/cc - skipped | |
-- Detecting C compile features | |
-- Detecting C compile features - done | |
-- Detecting CXX compiler ABI info | |
-- Detecting CXX compiler ABI info - done | |
-- Check for working CXX compiler: /usr/lib64/ccache/c++ - skipped | |
-- Detecting CXX compile features | |
-- Detecting CXX compile features - done | |
-- Building osm2pgsql 1.4.2 | |
-- Building in C++11 mode | |
-- Found Git: /usr/bin/git (found version "2.27.0") | |
-- Looking for include file termios.h | |
-- Looking for include file termios.h - found | |
-- Looking for include file unistd.h | |
-- Looking for include file unistd.h - found | |
-- Found ZLIB: /usr/lib64/libz.so (found version "1.2.11") | |
-- Looking for pthread.h | |
-- Looking for pthread.h - found | |
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD | |
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed | |
-- Looking for pthread_create in pthreads | |
-- Looking for pthread_create in pthreads - not found | |
-- Looking for pthread_create in pthread | |
-- Looking for pthread_create in pthread - found | |
-- Found Threads: TRUE | |
-- Found Protozero: /srv/nominatim/Nominatim-3.7.1/osm2pgsql/contrib/protozero/include (found suitable version "1.7.0", minimum required is "1.6.3") | |
-- Found EXPAT: /usr/lib64/libexpat.so (found version "2.2.5") | |
-- Found BZip2: /usr/lib64/libbz2.so (found version "1.0.6") | |
-- Looking for BZ2_bzCompressInit | |
-- Looking for BZ2_bzCompressInit - found | |
-- Found Osmium: /srv/nominatim/Nominatim-3.7.1/osm2pgsql/contrib/libosmium/include (found suitable version "2.16.0", minimum required is "2.15.6") | |
-- Found Boost: /usr/include (found suitable version "1.66.0", minimum required is "1.50") found components: system filesystem | |
-- Found PostgreSQL: /usr/lib64/libpq.so (found version "12.6") | |
-- Found proj_api.h | |
-- Found Proj [API 4] /usr/lib64/libproj.so | |
-- Libraries used to build: /usr/lib64/libboost_system.so;/usr/lib64/libboost_filesystem.so;/usr/lib64/libpq.so;/usr/lib64/libz.so;-lpthread;/usr/lib64/libexpat.so;/usr/lib64/libbz2.so;/usr/lib64/libproj.so | |
-- Looking for clang-tidy | |
-- Looking for clang-tidy - found /usr/bin/clang-tidy | |
-- Tests disabled. Set BUILD_TESTS=ON to enable tests. | |
-- Looking for pandoc | |
-- Looking for pandoc - not found | |
-- Manual page can not be built | |
-- Found PythonInterp: /usr/bin/python3 (found suitable version "3.6.8", minimum required is "3.5") | |
-- Using PHP binary /usr/bin/php | |
-- Using php-cgi binary /usr/bin/php-cgi | |
-- Using Python behave binary /srv/nominatim/.local/bin/behave | |
-- Using phpunit binary /usr/local/bin/phpunit | |
-- Using phpcs binary /usr/bin/phpcs | |
CMake Warning at CMakeLists.txt:89 (message): | |
php-cgi binary not found. nominatim tool will not provide query functions. | |
CMake Warning at CMakeLists.txt:156 (message): | |
behave not found. BDD tests disabled. | |
CMake Warning at CMakeLists.txt:165 (message): | |
phpunit not found. PHP unit tests disabled. | |
CMake Warning at CMakeLists.txt:174 (message): | |
phpcs not found. PHP linting tests disabled. | |
CMake Warning at CMakeLists.txt:183 (message): | |
pylint not found. Python linting tests disabled. | |
CMake Warning at CMakeLists.txt:192 (message): | |
pytest not found. Python tests disabled. | |
-- Configuring done | |
-- Generating done | |
-- Build files have been written to: /srv/nominatim/build |
也就是找不到 pylint 和 pytest,在 root 权限下安装一下就行啦~
yum 安装是找不到 pytest 包的,需要通过 pip 安装,在安装的时候需要三个依赖包:
[root@VM-0-5-centos /root]#pip install -U pytest | |
[root@VM-0-5-centos /root]#pip install -U requests | |
[root@VM-0-5-centos /root]#pip install -U pytest-pythonpath | |
[root@VM-0-5-centos /root]#pip install -U pytest-capturelog |
- 参考博客
Centos 上 pytest 环境搭建pytest 环境搭建
# 安装 pylint
直接通过 yum 来安装:
[root@VM-0-5-centos /root]#yum install pylint |
# 安装 phpunit
要获取 PHPUnit,最简单的方法是下载 PHPUnit 的 PHP 档案包(PHAR),它将 PHPUnit 所需要的所有必要组件(以及某些可选组件)捆绑在单个文件中
如果启用了 Suhosin 扩展,需要在 php.ini 中允许执行 PHAR:(php.in 位置在 /etc/opt/remi/php74/php.ini)
suhosin.executor.include.whitelist = phar |
可以在下载后立即使用 PHPUnit PHAR:
[root@VM-0-5-centos /root]#wget https://phar.phpunit.de/phpunit-9.0.phar | |
[root@VM-0-5-centos /root]#chmod +x phpunit-9.0.phar | |
[root@VM-0-5-centos /root]#sudo mv phpunit-9.0.phar /usr/local/bin/phpunit |
这样以后应该不会报错 "phpunit not found. PHP unit tests disabled."
# 安装 behave
直接 "pip install behave" 就行了~
# 安装 phpcs
这个安装之前需要配置好 pear,当然可以通过其他方式来安装,这里给出用 pear 的安装流程
# 下载安装
[root@VM-0-5-centos /root]#wget http://pear.php.net/go-pear.phar | |
[root@VM-0-5-centos /root]#php74 go-pear.phar |
然后就开始安装,第一步配置安装的路径
Below is a suggested file layout for your new PEAR installation. To | |
change individual locations, type the number in front of the | |
directory. Type 'all' to change all of them or simply press Enter to | |
accept these locations. | |
1. Installation base ($prefix) : /opt/remi/php74/root/usr | |
2. Temporary directory for processing : /tmp/pear/install | |
3. Temporary directory for downloads : /tmp/pear/install | |
4. Binaries directory : /opt/remi/php74/root/usr/bin | |
5. PHP code directory ($php_dir) : /opt/remi/php74/root/usr/share/pear | |
6. Documentation directory : /opt/remi/php74/root/usr/docs | |
7. Data directory : /opt/remi/php74/root/usr/data | |
8. User-modifiable configuration files directory : /opt/remi/php74/root/usr/cfg | |
9. Public Web Files directory : /opt/remi/php74/root/usr/www | |
10. System manual pages directory : /opt/remi/php74/root/usr/man | |
11. Tests directory : /opt/remi/php74/root/usr/tests | |
12. Name of configuration file : /etc/opt/remi/php74/pear.conf | |
1-12, 'all' or Enter to continue: |
我这里默认路径,所以直接回车就行了
# 配置 pear 命令
打开 /etc/profile,在文件的最后添加 export PATH=/opt/remi/php74/root/usr/bin:$PATH (其中的 /opt/remi/php74/root/usr/ 请改成你们自己的安装目录)
强制更新配置文件
[root@VM-0-5-centos /root]#source /etc/profile |
如果 pear 后返回这样的信息,则证明 pear 配置成功
# 安装 phpcs
Package Information - PHP_CodeSniffer
[root@VM-0-5-centos /root]#pear install PHP_CodeSniffer-3.6.0 |
这里 cmake 可能还是会报错,先 whereis phpcs 查看 phpcs 的位置,然后去 CMakeCache.txt 里指明一下路径即可(CMakeCache.txt 在 build 目录下)
解决 "php-cgi binary not found. nominatim tool will not provide query functions." 问题:
同样 whereis phpcs 查看 php-cgi 的位置,然后去 CMakeCache.txt 里指明一下路径即可(CMakeCache.txt 在 build 目录下)
# cmake
再次 cmake,就没报错了......
然后就是 make 一下了
make 成功后的提示:
然后安装:
之后就 Nominatim 安装好了~
# Apache Web 服务器配置
网络服务器应从项目目录的网站目录中提供 php 脚本 。因此,设置项目目录并填充网站目录:
[nominatim@VM-0-5-centos /srv/nominatim/build]$mkdir $USERHOME/nominatim-project | |
[nominatim@VM-0-5-centos /srv/nominatim/build]$cd $USERHOME/nominatim-project | |
[nominatim@VM-0-5-centos /srv/nominatim/nominatim-project]$nominatim refresh --website |
还需要在 apache 配置中为网站目录创建别名。将单独的 nominatim 配置添加到您的 Web 服务器:
[nominatim@VM-0-5-centos /srv/nominatim/nominatim-project]$sudo tee /etc/httpd/conf.d/nominatim.conf << EOFAPACHECONF | |
<Directory "$USERHOME/nominatim-project/website"> | |
Options FollowSymLinks MultiViews | |
AddType text/html .php | |
DirectoryIndex search.php | |
Require all granted | |
</Directory> | |
Alias /nominatim $USERHOME/nominatim-project/website | |
EOFAPACHECONF |
重新加载 Apache
[root@VM-0-5-centos /root]#sudo systemctl enable httpd | |
[root@VM-0-5-centos /root]#sudo systemctl restart httpd |
在 "nominatim refresh --website" 时可能会报 python 相关的错误,就是有一些 python 模板没有安装,安装一下就行了
-
第一次报错:缺少 "dotenv" 模板
只需要执行以下指令即可[root@VM-0-5-centos /root]#pip install python-dotenv
执行 "pip" 会把这个扩展它会自动保存在 python3.6(详细地址:/usr/local/lib/python3.6/site-packages),如果安装了 pyhton3.6 以上的版本,可能需要把 dotenv 这个文件夹从 python3.6 移到你所安装的高版本的 python 文件里,我这里以 Python 3.9.5 为例,最后移到的位置为 /opt/python3.9/lib/python3.9
可以直接运行 "pip3 install python-dotenv" 就可以避免上述问题
No module named 'dotenv'No module named 'dotenv'解决办法
-
第二次报错:缺少 "psycopg2" 模板
直接运行下述指令一般会报错,表示找不到适合的发行版进行安装[root@VM-0-5-centos /root]#pip3 install psycopg2
直接运行:
[root@VM-0-5-centos /root]#pip3 install psycopg2-binary
Unable to install psycopg2 (pip install psycopg2)Unable to install psycopg2 (pip install psycopg2)
-
第三次报错:缺少 "psutil" 模板
直接运行:[root@VM-0-5-centos /root]#pip3 install psutil
-
第四次报错:缺少 "icu" 模板
直接运行:[root@VM-0-5-centos /root]#pip3 install icu
-
第五次报错:缺少 "tkinter" 模板
yum 和 pip 安装不行,找不到相应的包
通过 "yum install tk-devel" 安装后,还是没有该模板,这个时候通过 "yum search" 来查看一下正确的包名
再 yum 安装一下,发现还是模板不存在......
摸索了半天,最后受到这位大佬的启发
注意报错信息里面有一句话import _tkinter # If this fails your Python may not be configured for Tk
或许问题并不是 tkinter 有没有安装,有可能 tkinter 已经被正常安装了,但 python 没有配置好,所以尝试一下重新编译安装一下 python 的运行环境
先 cd 到一开始安装 python3.9 的目录下,重新编译安装即可[root@VM-0-5-centos /root/Python-3.9.5]#./configure --prefix=/opt/python3.9
[root@VM-0-5-centos /root/Python-3.9.5]#make
[root@VM-0-5-centos /root/Python-3.9.5]#make install
然后就没有报错了,当然如果还是报错的话,尝试把上面的 tkinter 给安上后再重新编译安装 python
-
第六次报错:"cannot import name 'Transliterator' from 'icu'"
本来是要重新安装 icu 的,但 python 在上个环节已经重新编译安装了,所以就不需要把 icu 给卸载掉了,直接重新安装 icu,当安装好模块后还是报相关错误的话,可以尝试重新编译 python,或者重新编译安装 nominatim,一般疑难杂症可以解决掉(确实有点玄学~)
以上就是在执行 "nominatim refresh --website" 时会发生的报错,该指令是在当前目录下生成 php 前端网页文件,也就是前端所访问的 php 脚本,后面在 Apache 设置中,需要指定当前网页文件目录
# 服务器安全设置(Adding SELinux Security Settings)
It is a good idea to leave SELinux enabled and enforcing, particularly with a web server accessible from the Internet. At a minimum the following SELinux labeling should be done for Nominatim.
[nominatim@VM-0-5-centos /srv/nominatim/build]$sudo semanage fcontext -a -t httpd_sys_content_t "/usr/local/nominatim/lib/lib-php(/.*)?" | |
[nominatim@VM-0-5-centos /srv/nominatim/build]$sudo semanage fcontext -a -t httpd_sys_content_t "$USERHOME/nominatim-project/website(/.*)?" | |
[nominatim@VM-0-5-centos /srv/nominatim/build]$sudo semanage fcontext -a -t lib_t "$USERHOME/nominatim-project/module/nominatim.so" | |
[nominatim@VM-0-5-centos /srv/nominatim/build]$sudo restorecon -R -v /usr/local/lib/nominatim | |
[nominatim@VM-0-5-centos /srv/nominatim/build]$sudo restorecon -R -v $USERHOME/nominatim-project |
最后再创建一个小的配置文件,来告诉 nominatim,网络服务器用户的名字
[nominatim@VM-0-5-centos /srv/nominatim/build]$echo NOMINATIM_DATABASE_WEBUSER="apache" | tee .env |
# 导入地图数据 OSM
# 数据目录创建
在开始导入之前,需要先创建一个专门存放 Nominatim 设置的所有相关数据:配置,地图 OSM,额外数据等:
[nominatim@VM-0-5-centos /srv/nominatim]$mkdir ~/nominatim-planet | |
[nominatim@VM-0-5-centos /srv/nominatim]$cd ~/nominatim-planet |
为该目录创建环境变量 $PROJECT_DIR:
[nominatim@VM-0-5-centos /srv/nominatim]$export PROJECT_DIR=~/nominatim-planet |
# Flatnode files 设置
当需要导入大地图数据时(例如北美,欧洲,整个地球),应该启用节点位置的 flatnode 存储方式。启用此设置后,节点坐标将会存储在一个简单的文件当中,而不是存储在数据库里,这样会节省导入数据的时间和所需的磁盘存储空间,需要在 "**env.defaults"** 中设置一下 Flatnode files 文件的位置:
(文件路径:“/srv/nominatim/Nominatim-3.7.1/settings”)
参考路径:
在设置该路径时,需要确保该路径下的磁盘至少有 75GB 的可用空间,由于在导入 OSM 数据时,好像有些参数设置不当,导致并没有使用 flatnode 储存的方式,而是往数据库导入数据,所以并没有在指定的目录文件下生成 Flatnode files 文件
# 下载所需地图数据文件
地图数据下载
访问上述网站,下载自己所需的地图数据文件,建议下载 “.osm.pdf” 格式的文件
如果需要下载中国的地图数据,进入主页后选择左下角的 Asia (亚洲),进一步选择 China,在网页的右上角的地图会显示现在所选国家的地理位置
选中 ".osm.pdf" 后,右键选择复制链接地址,返回 ssh 中,在 “nominatim-planet” 目录下下载:
[nominatim@VM-0-5-centos /srv/nominatim/nominatim-planet]$wget https://download.geofabrik.de/asia/china-latest.osm.pbf |
由于中国的地图数据很小,1GB 都不到,所以这里以导入北美的地图数据为例,毕竟导入大数据的地图,遇到的错误可能会更多一点
北美的数据 osm 文件有 10GB 大,所以导入数据库的时间可能比导入中国数据的时间更久一点,第一次导入中国数据,花费了 7 个小时,而导入北美的地图数据预计要导入 72 个小时左右
# 将 OSM 数据导入到 Postgresql 数据库
在导入之前可以设置一些相关参数,来实现目标化导入,以节省时间,例如,“Reverse-only Imports” 设置,过滤相关数据设置等,详细内容参考官方文档:
nominatim 官方
官方建议第一次导入的时候,先导入一些小的地图数据,当然我这里直接给它硬塞一个大的地图数据 😅
在 build 目录先运行以下指令开始导入数据:
"nominatim import --osm-file <data file> 2>&1 | tee setup.log"
-
<data file> 为所导入数据的绝对或相对路径
-
<-osm2pgsql-cache xxxxx> 为维护节点位置的缓存,其值应该小于可用内存的 2/3
以下为我所输入的指令,仅供参考:
[nominatim@VM-0-5-centos /srv/nominatim/build]$nominatim import --osm-file /srv/nominatim/nominatim-planet/north-america-latest.osm.pbf --osm2pgsql-cache 1529 2>&1 | tee setup.log |
开始导入:
导入过程分为 30 个等级(rank)处理,一般 rank26-30 最为繁琐,耗时可能会多一点,它们各占总导入时间三分之一左右,由于它是一个节点一个节点导入进去的,所以返回的每一条导入消息最后的数字就是待处理的节点数。如果导入两天后还未到达 rank26,可以考虑重新配置相关设置后重新导入
在第一步导入过程中,Nominatim 使用 osm2pgsql 将 OSM 数据导入到 Postgresql 数据库中,这一步对 RAM 的使用要求非常高,此时 osm2pgsql 和 PostgreSQL 是同时运行的,osm2pgsql 需要至少 2GB 的 RAM 用于其内部数据结构的处理,当它需要处理的关系更大时,所需要的 RAM 更多。所以可能需要通过设置”--osm2pgsql-cache“参数,参数的单位 MB,来优化导入过程;
如果没有使用 flatnode 文件来导入,设置的”--osm2pgsql-cache“参数大约为所需要导入 OSM pdf 文件的大小,不过我觉得这样设置一般会报错,提示什么内存空间不够,请求重新设置参数等,如果系统开始交换或出现内存不足错误,请减少缓存大小,甚至考虑使用 flatnode 文件。
如果导的时间过场,中途断线了,默认情况下的 Centos 会结束掉进程,并不会继续导下去,可以运行该指令来验证是否已成功创建所有必需的表和索引:
[nominatim@VM-0-5-centos /srv/nominatim/build]$nominatim admin --check-database |
如果还没有创建完,它会报出如下提示:
[nominatim@VM-0-5-centos /srv/nominatim/build]$nominatim admin --check-database | |
2021-05-23 10:36:37: Using project directory: /srv/nominatim/build | |
2021-05-23 10:36:37: Checking database | |
Checking database connection ... OK | |
Checking for placex table ... OK | |
Checking for placex content ... OK | |
Checking that nominatim.so module is installed ... OK | |
Checking indexing status ... Failed | |
The indexing didn't finish. 39317720 entries are not yet indexed. | |
To index the remaining entries, run: nominatim import --continue indexing | |
Checking that database indexes are complete ... Failed | |
The following indexes are missing: | |
idx_word_word_id | |
idx_place_addressline_address_place_id | |
idx_placex_rank_address | |
idx_placex_parent_place_id | |
idx_placex_geometry_reverse_lookuppolygon | |
idx_placex_geometry_reverse_placenode | |
idx_osmline_parent_place_id | |
idx_osmline_parent_osm_id | |
idx_postcode_postcode | |
idx_search_name_nameaddress_vector | |
idx_search_name_name_vector | |
idx_search_name_centroid | |
idx_placex_pendingsector | |
idx_location_area_country_place_id | |
idx_place_osm_unique | |
Rerun the index creation with: nominatim import --continue db-postprocess | |
Checking that all database indexes are valid ... OK | |
Checking TIGER external data table. ... not applicable | |
[nominatim@VM-0-5-centos /srv/nominatim/build]$nominatim import --continue db-postprocess | |
2021-05-23 10:41:22: Using project directory: /srv/nominatim/build | |
2021-05-23 10:41:22: Post-process tables | |
Traceback (most recent call last): | |
File "/usr/local/bin/nominatim", line 11, in <module> | |
exit(cli.nominatim(module_dir='/usr/local/lib64/nominatim/module', | |
File "/usr/local/lib64/nominatim/lib-python/nominatim/cli.py", line 288, in nominatim | |
return parser.run(**kwargs) | |
File "/usr/local/lib64/nominatim/lib-python/nominatim/cli.py", line 92, in run | |
return args.command.run(args) | |
File "/usr/local/lib64/nominatim/lib-python/nominatim/clicmd/setup.py", line 133, in run | |
database_import.create_search_indices(conn, args.config, | |
File "/usr/local/lib64/nominatim/lib-python/nominatim/tools/database_import.py", line 308, in create_search_indices | |
sql.run_sql_file(conn, 'indices.sql', drop=drop) | |
File "/usr/local/lib64/nominatim/lib-python/nominatim/db/sql_preprocessor.py", line 103, in run_sql_file | |
cur.execute(sql) | |
File "/usr/local/lib64/nominatim/lib-python/nominatim/db/connection.py", line 26, in execute | |
super().execute(query, args) | |
File "/opt/python3.8/lib/python3.8/site-packages/psycopg2/extras.py", line 146, in execute | |
return super(DictCursor, self).execute(query, vars) | |
psycopg2.errors.DeadlockDetected: deadlock detected | |
DETAIL: Process 3512930 waits for ShareLock on relation 925313 of database 28269; blocked by process 3512886. | |
Process 3512886 waits for RowExclusiveLock on relation 925309 of database 28269; blocked by process 3512930. | |
HINT: See server log for query details. |
根据 “To index the remaining entries, run: nominatim import --continue indexing”,输入指令继续导入,它会从 rank0 开始一级一级检索,然后再继续导入未导入的索引:
[nominatim@VM-0-5-centos /srv/nominatim/build]$nominatim import --continue indexing |
导入结束后:
为了检测是否真的导入完成,可以再次运行 “nominatim admin --check-database”,得:
最后一项为 Tiger housenumber data for the US(美国的 OSM 门牌号数据),为非必要数据,可以忽略
到这里地图数据就已经导入结束了,需要注意的是,磁盘空间的问题,别看北美地图 OSM 包才 10GB,最后导完后却占了 200GB 多的空间......
# 数据测试,并通过公网 ip 进行访问
# 数据测试
现在可以通过执行以下指令来测试是否可用:
[nominatim@VM-0-5-centos /srv/nominatim/build]$nominatim serve |
这将运行一个通常用于开发的小型测试服务器。你可以用它来验证你的安装是否正常。转到 http://localhost:8088/status.php , 你应该看到 OK 的信息。你也可以运行一个搜索查询,例如:http://localhost:8088/search.php?q=Berlin
在 SSH 中使用 curl 来下载网页源码,看是否成功,一般会返回查询信息
# 外网访问
在 Apache 设置后一般可以直接通过公网 ip 进行访问,如果不行可以先在 build 目录下,新建一个 local.php 文件,输入以下内容,保存:
<?php | |
@define('CONST_Database_Web_User', 'apache'); #如果使用的是 Nginx,则填 nginx | |
@define('CONST_Website_BaseURL', 'http://你的公网ip/nominatim/'); |
也可以在 /srv/nominatim/Nominatim-3.7.1/settings 下也设置一个相同的文件,先在自己的浏览器里进行访问
http:// 你的公网 ip/nominatim/status.php |
如果返回状态码为 200,且内容为 OK,则表示可以通过外网进行查询
如果返回状态码为 500,且内容为 Database query failure,则有可能没有给 Apache 用户查询 Postgresql 的 nominatim 数据库的权限,需要进行以下设置:
- 切换为 nominatim 用户
[root@VM-0-5-centos /root]#su nominatim |
- 进入 PostgreSQL
[nominatim@VM-0-5-centos /root]$psql | |
could not change directory to "/root": Permission denied | |
psql (12.6) | |
Type "help" for help. | |
nominatim=# |
- 使用 nominatim 数据库:(好像进去就是使用的 nominatim 数据库)
nominatim=#\c nominatim | |
You are now connected to database "nominatim" as user "nominatim". | |
nominatim=# |
- 给 apache 用户权限
nominatim=#GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO apache; |
设置完后,就应该可以查询了~
# 总结
以上就是有关 Nominatim 在 Centos8 上的安装与配置的整个过程,其中包含了对报错的处理办法的讨论以及一些相关建议,一般遇到什么疑难杂症,可以考虑是由于某些配置的环境的版本问题,可以考虑更换另外一个版本进行重试(在导入数据时,一开始卡在了最后创建表那里,最后更换 python 版本后,就没有报相关的错误了),而且 python 安装新的模组或第三方库后,如果还是报错没找到,可以考虑是第三方库安装到了其他版本上,比如有些时候没配置好的化,用 pip3 进行安装会安装到 Python3.6.x 以上的版本中,而 pip 的话,则会安装到 Python 初始版本中。
如果本机安装了 python2,尽量不要管他,使用 python3 运行 python 脚本就好,因为可能有程序依赖目前的 python2 环境,比如 yum!!!!!不要动现有的 python2 环境!