打个盹

You are being watched.

搭建OSM地图服务器

代码片段 🔥 28

警告:OpenStreetMap地图不符合中国法律,仅供学习,禁止公开发布地图服务。

原文链接,本站有部分更新修改。
https://blog.jackeylea.com/osm/how-to-setup-offline-osm-map-server/


测试环境

2025.9.15 Ubuntu 24.04.3 LTS + Apache2 2.4.58

依赖

bzip2 依赖问题需要降级处理,建议使用 aptitude 替代 apt-get 自动处理。

sudo aptitude install screen locate libapache2-mod-tile renderd git tar \
     unzip wget bzip2 apache2 lua5.1 mapnik-utils python3-mapnik \
     python3-psycopg2 python3-yaml gdal-bin npm fonts-noto-cjk \
     fonts-noto-hinted fonts-noto-unhinted fonts-unifont fonts-hanazono \
     postgresql postgresql-contrib postgis postgresql-16-postgis-3 \
     postgresql-16-postgis-3-scripts osm2pgsql net-tools curl
  • postgres用于保存数据
  • renderd是渲染进程
  • apache2提供www服务
  • mod-tile基于apache2提供切片服务,决定什么时候该切片、把什么切片

创建数据库

sudo -u postgres -i #以root登陆psotgres
createuser _renderd #创建新用户
createdb -E UTF8 -O _renderd gis #创建数据库
psql #此时终端显示postgres=#
\c gis #此时提示You are now connected to database "gis" as user "postgres". 终端显示gis-#
CREATE EXTENSION postgis; #提示CREATE EXTENSION
CREATE EXTENSION hstore; #提示CREATE EXTENSION
ALTER TABLE geometry_columns OWNER TO _renderd; #提示ALTER TABLE
ALTER TABLE spatial_ref_sys OWNER TO _renderd; #提示ALTER TABLE
\q #退出psql
exit #退出root

Mapnik

测试安装状态

python3 #进入python环境
>>> import mapnik #导入库,没有保存就正常
>>> quit() #退出环境

样式表配置

mkdir ~/src #创建文件夹
cd ~/src
git clone https://github.com/gravitystorm/openstreetmap-carto #下载库 17.32MB
cd openstreetmap-carto
git checkout v5.9.0 #官方的新版本在使用新格式
sudo npm install -g carto #安装编译器
carto -v #查看版本 1.2.0
carto project.mml > mapnik.xml #有一些警告

加载数据

mkdir ~/data
cd ~/data
wget https://download.geofabrik.de/asia/china-latest.osm.pbf # 1.3 GB
chmod o+rx ~
sudo -u _renderd osm2pgsql -d gis --create --slim -G --hstore \
     --tag-transform-script ~/src/openstreetmap-carto/openstreetmap-carto.lua \
     -C 2500 --number-processes 4 -S ~/src/openstreetmap-carto/openstreetmap-carto.style \
     ~/data/china-latest.osm.pbf
# 导入China区域数据大约需要半小时。
# 省略输出内容,最后为:
osm2pgsql took 64s (1m 4s) overall.
  • -d gis 使用数据库
  • -–create 删除数据全新导入,后期添加其它地区数据,应删除并使用 --append,否则数据库会被覆盖。
  • slim 渲染表
  • G 表布局
  • hstore 多折线如何处理
  • tag-transform-script 标签转换脚本
  • C 2500 为导入过程分配osm2pgsql 2.5Gb内存,可以修改
  • number-processes 使用的CPU核心数
  • 最后的参数为需要加载的文件

创建索引

cd ~/src/openstreetmap-carto/
sudo -u _renderd psql -d gis -f indexes.sql #输出CREATE INDEX 16次

导入功能

cd ~/src/openstreetmap-carto/
sudo -u _renderd psql -d gis -f functions.sql #输出CREATE FUNCTION 3次

下载shapefile

此文件提供国家边界

cd ~/src/openstreetmap-carto/
mkdir data
sudo chown _renderd data
sudo -u _renderd scripts/get-external-data.py #文件很大,你要忍一下

省略输出内容,最后为:
INFO:root:  Import complete

注意:此过程耗时较长,请耐心等待。

设置服务器

cd ~/src/openstreetmap-carto/

编辑 scripts/get-fonts.sh
https://fonts.google.com/download?family=Noto%20Emoji
替换为
https://archive.org/download/noto-emoji/Noto_Emoji.zip

然后继续执行

sudo scripts/get-fonts.sh #安装字体,安装不了也不影响使用。
sudo vi /etc/renderd.conf

添加配置

[default]
URI=/tile/
XML=/home/accountname/src/openstreetmap-carto/mapnik.xml # 注意修改 accountname
HOST=localhost
TILESIZE=256
MAXZOOM=20

预渲染瓦片,简单示例,详细用法参考文末参考文档。

render_list -a -n 4 -Z 10

地图

sudo vi /etc/apache2/sites-available/000-default.conf

# 在 ServerAdmin webmaster@localhost 后面加入

LoadTileConfigFile /etc/renderd.conf
ModTileRenderdSocketName /run/renderd/renderd.sock
ModTileRequestTimeout 0
ModTileMissingRequestTimeout 30

cd /var/www/html
sudo vi index.html

<!DOCTYPE html>
<html style="height:100%;margin:0;padding:0;">
<title>Leaflet page with tiles from localhost</title>
<meta charset="utf-8">
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.3/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet@1.3/dist/leaflet.js"></script>
<script src="https://unpkg.com/leaflet-hash@0.2.1/leaflet-hash.js"></script>
<style type="text/css">
.leaflet-tile-container { pointer-events: auto; }
</style>
</head>
<body style="height:100%;margin:0;padding:0;">
<div id="map" style="height:100%"></div>
<script>
//<![CDATA[
var map = L.map('map').setView([34.6815699,112.4538231], 10);
L.tileLayer('http://127.0.0.1/tile/{z}/{x}/{y}.png', {
    attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors',
    maxZoom: 21,
    maxNativeZoom: 20
}).addTo(map);
var hash = L.hash(map)
//]]>
</script>
</body>
</html>

重启所有程序

sudo systemctl daemon-reload
sudo systemctl restart renderd
sudo systemctl restart apache2

访问 http://127.0.0.1/sample_leaflet.html 查看示例地图

瓦片地址 http://127.0.0.1/tile/0/0/0.png

部署完毕。


其它可用参考文档
https://ircama.github.io/osm-carto-tutorials/tile-server-ubuntu/
https://github.com/alx77/render_list_geo.pl
https://cn.linux-terminal.com/?p=3284

uBlock Origin B站搜索框信息屏蔽规则