警告: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 #退出rootMapnik
测试安装状态
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 30cd /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: '© <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
