nominatim部署OSM离线地图

时间:2024-10-01 07:21:31

第一步:准备一个大内存的服务器,磁盘PG大小根据实际导入的数据确定,全量数据1T,osm.pdf属于压缩文件,如果能下载,但下载很慢,可以尝试用迅雷下载。

osm.pdf下载
osm.pdf另外一个下载路径
全量数据下载
另一个全量数据瞎子啊
增量数据下载

第二步:拉取Docker 镜像(如果拉取失败,可以在另外一个服务器拉取,之后使用docker打包导出tar,之后导入的形式获取对应的docker镜像)

github镜像原码

docker pull mediagis/nominatim:4.4

第三步、启动容器(如果是剥离PG库,需要看第六步)

创建文件夹/data/nominatim/osm,上传osm.pdf文件数据。

cd /
mkdir data
cd data
mkdir nominatim
cd nominatim
mkdir osm
cd osm
sz abruzzo-latest.osm.pbf

docker run -d -e PBF_PATH=/nominatim/data/abruzzo-latest.osm.pbf -p 8081:8080 -p 5433:5432 -v /data/nominatim/osm:/nominatim/data --name nominatim mediagis/nominatim:4.4

容器内启动端口 8080,容器外端口 8081(接口调用端口)
PG库容器内端口5432,容器外使用的也是5433

映射路径 容器外 /data/nominatim/osm,容器内/nominatim/data(需要跟PBF_PATH路径相同),把下载的文件放在容器外路径下。

第四步:记录导入时长,占用空间

文件大小:76M
启动时间:2024-09-24 11:30:00
启动完成时间:2024-09-24 11:42:00
总计耗时:12分钟
PG库用户名密码:nominatim/qaIACxO6wMR3
PG库占用空间大小:SELECT pg_size_pretty(pg_database_size(‘nominatim’));
PG表大小:SELECT pg_size_pretty(pg_total_relation_size(‘table_name’));
PG数据库大小 = 1601M
在这里插入图片描述
在这里插入图片描述

第五步、查看服务是否正常启动,接口是否可以正常访问

在这里插入图片描述

第六步、指定外部PG路径(生产部署,剥离PG库,便于维护)

(一)、创建nominatim角色,必须要创建超级管理员,要有所有操作权限,需要用超级管理员创建,创建完成之后,需要把所有这个库的连接断开,否则启动报错;
(二)、安装PG(如果使用云厂商直接选择PG,版本14,查看是否可以选择PostGIS插件,如果可以就可以跳过安装);
(三)、第一次需要初始化表,需要指定外部的PG连接信息,启动之后,登录docker 容器,修改start.sh文件信息,注释掉跟PG有关的信息,之后docker commit ID mediagis/xxx-nominatim:4.4,之后的启动使用这个镜像,否则每次docker run 都会删除数据库;
在这里插入图片描述
(四)、安装插件PostGIS

登录PG库查询PostGIS插件版本

psql postgres -c "SELECT PostGIS_Version();"

安装PG插件(PostGIS,osm2pgsql)

PostGIS安装需要安装mysql客户端

yum install --nogpgcheck -y postgis2_14 postgis2_14-utils

如果报错没有mysql包,需要导入mysql

sudo yum install -y https://repo.mysql.com/mysql80-community-release-el7-3.noarch.rpm
yum install -y mysql-community-client
#如果存在公钥未导入,需要导入公钥
wget https://repo.mysql.com/RPM-GPG-KEY-mysql -O /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
rpm -qa gpg-pubkey*

安装mysql客户端之后,重新执行

yum install --nogpgcheck -y postgis2_14 postgis2_14-utils

登录pg数据库,导入 PostGIS 插件

CREATE EXTENSION postgis;

查看是否导入成功,必须要导入成功PostGIS之后才能导入OSM数据

SELECT PostGIS_Version();

在这里插入图片描述

docker ps
docker stop id
docker run -d -e PBF_PATH=/nominatim/data/friuli_venezia_giulia-latest.osm.pbf -e NOMINATIM_TOKENIZER=icu -e NOMINATIM_DATABASE_DSN="pgsql:dbname=nominatim;host=172.26.10.92;port=5432;user=nominatim;password=qaIACxO6wMR3" -e PGHOST=172.26.10.92 -e PGPORT=5432 -e PGDATABASE=nominatim -e PGUSER=nominatim -e PGPASSWORD=qaIACxO6wMR3 -v /data/nominatim/osm:/nominatim/data -p 7070:8080 --name nominatim mediagis/nominatim:4.4

启动失败,可能需要删除前面的容器信息

docker rm xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

文件大小:76M
导入开始时间:2024-09-26 13:53:00
导入开始时间:2024-09-26 14:11:00
导入耗时:18分钟

备注:

1、这种方式并没有剥离内部的PG库,实际上还是会在容器里面创建一个PG库,只是在执行sql,导入等过程的时候,会使用覆盖的PG参数连接到远端的PG库,容器中的PG库没有数据,所以占用空间会很小;
2、剥离PG之后,比较了外部PG调用和Docker容器中PG调用耗时情况;基本相同

空间大小参照

3、容器重启成功之后,不能直接在外面重启容器,否者会执行删除库语句,除非修改docker容器,可以进入docker容器中,执行startapache.sh多次启动apache服务,但不能执行pg重启服务
sudo -E -u postgres psql postgres -c “DROP DATABASE IF EXISTS
nominatim”

第七步、增量更新(需要能连接上OSM,可以在国外的服务器上下载)

备份数据库
cp -R /path/to/nominatim/data /path/to/nominatim/data_backup

1、docker支持增量更新,如果FREEZE=true(默认false),就会冻结数据库,只能做查询操作,不能修改,所有的增量操作都做不了

远程拉取数据服务器

REPLICATION_URL=https://planet.osm.org/replication/hour

每24小时拉取一次更新数据(单位s)

NOMINATIM_REPLICATION_INTERVAL=86400

每12小时拉取检测一次是否有新的更新数据

NOMINATIM_REPLICATION_RECHECK_INTERVAL=43200

更新方式 smart/force/none 只能模式,根据网络和数据动态更新/强制更新,不管网络和数据情况/不更新

UPDATE_MODE=smart
2、下载增量包,通过osm2pgsql插件导入数据

(一)、安装osm2pgsql插件
sudo yum update
sudo yum install osm2pgsql
osm2pgsql --version

(二)、下载增量osc文件信息

#!/bin/bash

# 设置日期索引范围
START_NUMBER=374
END_NUMBER=400

#
DAY=004

# 目标目录
TARGET_DIR="/tmp/osc/$DAY"

# 创建目标目录
mkdir -p "$TARGET_DIR"

# 下载并解压文件
for NUMBER in $(seq -w $START_NUMBER $END_NUMBER); do
    FILENAME="$NUMBER.osc.gz"
    URL="https://planet.osm.org/replication/day/000/$DAY/$FILENAME"
    wget -P "$TARGET_DIR" "$URL"
    if [ $? -eq 0 ]; then
        gunzip -c "$TARGET_DIR/$FILENAME" > "$TARGET_DIR/${FILENAME%.gz}"
		rm -rf "$TARGET_DIR/$FILENAME"
        echo "Downloaded and extracted: $FILENAME"
    else
        echo "Failed to download: $FILENAME"
    fi
done

echo "download finish."

(三)、执行osc文件合并命令

#!/bin/bash

# 数据库信息
TABASE="nominatim"
HOST="172.26.10.92"
PORT="5433"
USERNAME="nominatim"
PASSWORD="qaIACxO6wMR3"
STYLE="/usr/share/osm2pgsql/default.style"

# OSC 文件列表
OSC_FILES=("changes_2024-09-02_2024-09-05.osc")

# 应用 OSC 文件
for osc_file in "${OSC_FILES[@]}"; do
    # 检查表存在性
    if psql -d "$DATABASE" -U "$USERNAME" -H "$HOST" -p "$PORT" -W "$PASSWORD" -tA -c "SELECT EXISTS(SELECT 1 FROM information_schema.tables WHERE table_name = 'planet_osm_line' AND table_schema = 'public');" | grep -q "t"; then
        # 表存在,继续导入
        osm2pgsql --append --database="$DATABASE" --host="$HOST" --port="$PORT" --username="$USERNAME" --password="$PASSWORD" --style="$STYLE" "/paas/nominatim/$osc_file"
        echo "Applied changes from '$osc_file'"
    else
        # 表不存在,跳过
        echo "Table does not exist, skipping '$osc_file'"
    fi
done

echo "All changes applied successfully."

在这里插入图片描述

3、下载全量包

新建一个数据库,docker启动连接新库,新库导入完成,重启就的docker镜像,数据库指向新库。