# 概述

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).

# 相关准备

先更新 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)
此处贴出其他博客的安装过程来做参考:

# 软件包列表

此处列举了所需的软件包:

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 (yum 可能找不到,可能要通过 rpm 安装)

"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

# 安装 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

[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" 就可以避免上述问题

  • 第二次报错:缺少 "psycopg2" 模板

    直接运行下述指令一般会报错,表示找不到适合的发行版进行安装

    [root@VM-0-5-centos /root]#pip3 install psycopg2

    直接运行:

    [root@VM-0-5-centos /root]#pip3 install psycopg2-binary

  • 第三次报错:缺少 "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” 设置,过滤相关数据设置等,详细内容参考官方文档:

官方建议第一次导入的时候,先导入一些小的地图数据,当然我这里直接给它硬塞一个大的地图数据 😅
在 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 数据库的权限,需要进行以下设置:

  1. 切换为 nominatim 用户
[root@VM-0-5-centos /root]#su nominatim
  1. 进入 PostgreSQL
[nominatim@VM-0-5-centos /root]$psql
could not change directory to "/root": Permission denied
psql (12.6)
Type "help" for help.
nominatim=#
  1. 使用 nominatim 数据库:(好像进去就是使用的 nominatim 数据库)
nominatim=#\c nominatim
You are now connected to database "nominatim" as user "nominatim".
nominatim=#
  1. 给 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 环境!

更新于

请我喝[茶]~( ̄▽ ̄)~*

HentaiMikuy 微信支付

微信支付

HentaiMikuy 支付宝

支付宝