如何在 Ubuntu 20.04 上为 OpenStreetMap 设置 Tegola 矢量切片服务器

2021-07-28 01:56:53

Tegola 是 OpenStreetMap 的开源矢量切片服务器。之前我们解释了设置 OSM tile server 的过程,它是一个基于光栅的 tile server。本教程将向您展示如何在 Ubuntu 20.04 上设置 Tegola 矢量切片服务器。单独的内容和样式,允许创建指向同一个图块堆栈的多个样式。所需的 RAM 和磁盘空间取决于您要使用的国家/地区地图。例如,整个星球地图至少需要 32G RAM 和 1TB SSD(固态硬盘)。对整个行星地图使用旋转硬盘是不可行的。将整个地球等大型地图数据导入PostgreSQL数据库需要很长时间。考虑添加更多 RAM,尤其是使用 SSD 而不是旋转硬盘以加快导入过程。如果您要托管整个世界地图,我建议您从 Contabo 购买超大 VPS,它吹嘘在您的服务器上进行任何重大工作之前更新服务器软件始终是一个好习惯。通过 SSH 登录到您的服务器并运行以下命令。

我们将使用 PostgreSQL 来存储地图数据。 PostGIS 是 PostgreSQL 的地理空间扩展。运行以下命令来安装它们。 PostgreSQL 数据库服务器将自动启动并侦听 127.0.0.1:5432。安装过程中将在操作系统上创建 postgres 用户。它是 PostgreSQL 数据库服务器的超级用户。默认情况下,该用户没有密码,也不需要设置密码,因为您可以使用 sudo 切换到 postgres 用户并登录到 PostgreSQL 服务器。然后创建一个名为 osm 的数据库,同时让 osm 成为数据库的所有者。 -E UTF8 指定在数据库中使用的字符编码方案是UTF8。创建一个名为 natural_earth 的数据库,同时让 osm 作为数据库的所有者。导入过程可能需要一些时间。为了加快这个过程,我们可以调整一些 PostgreSQL 服务器设置来提高性能。编辑 PostgreSQL 主配置文件。这太小了。经验法则是将其设置为总 RAM 的 25%(不包括交换空间)。例如,我的 VPS 有 60G RAM,因此我将其设置为:如果您像我一样有很多 RAM,则可以将 Effective_cache_size 设置为更高的值,例如 20G。

默认情况下,PostgreSQL 会尝试在 RAM 中使用大页面。但是,Linux 默认情况下不分配大页面。检查 PostgreSQL 的进程 ID。这是 PostgreSQL 将使用的峰值内存大小。现在检查 Linux 中大页面的大小。 AnonHugePages: 0 kB ShmemHugePages: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB Hugetlb: 0 kB 我们可以计算我们需要多少个大页面。将 VmPeak 值除以大页面大小:16282784 kB / 2048 kB = 7950。编辑 /etc/sysctl.conf 文件。 AnonHugePages: 0 kB ShmemHugePages: 0 kB HugePages_Total: 7950 HugePages_Free: 7950 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB 由于导入过程可能需要很长时间并且建议您的计算机与互联网断开连接,因此屏幕可能会断开保持您的会话活跃。在 Ubuntu 20.04 服务器上安装屏幕:首次启动时,您将看到一个介绍文本,只需按 Enter 即可结束。然后您将能够像往常一样运行命令。

为了导入地图数据,我们将使用 imposm 将 OpenStreetMap 数据转换为支持 postGIS 的 PostgreSQL 数据库。从 Github 下载。接下来,运行以下命令以PBF(ProtoBufBinary)格式下载整个星球(50G)的地图数据。请注意,openstreetmap.org 的下载速度目前限制为 2048 KB/s。您可以从另一个镜像下载植物地图,例如如果您想要单个国家/州/省/城市的地图,请访问 http://download.geofabrik.de。此外,BBBike.org 提供全球 200 多个城市和地区的不同格式的摘录。例如,使用以下命令下载英国(1.1G)的地图数据。现在您可能不需要在服务器上做其他事情。由于您使用的是 Screen,您可以按 Ctrl+A,松开这些键,然后按 D 键从当前 Screen 会话中分离。您将看到如下所示的消息。这告诉我之前的 Screen 会话 ID 是 32113。您可以从 SSH 会话中注销,甚至关闭您的计算机。别担心,OSM 导入过程仍在运行。当您需要返回并检查导入进度时,通过 SSH 连接到您的服务器并运行以下命令以获取之前的 Screen Session ID。导入地图数据后,运行以下命令将其部署到生产环境中。

转到 Tegola Github 页面并下载 linux 版本。您可以使用以下命令在终端中下载它。运行 postgis_index.sql 脚本为 OSM 表列添加索引以提高查询性能。 [webserver] port = ":8080" # Tegola 提供三种切片缓存策略:"file"、"redis" 和 "s3" [cache] type = "file" basepath="/tmp/tegola-cache" # OpenStreetMap ( OSM) [[providers]] name = "osm" type = "postgis" host = "127.0.0.1" port = "5432" database = "gis" user = "osm" password = " osm_password" # Natural Earth [[providers] ]] name = "ne" type = "postgis" host = "127.0.0.1" port = "5432" database = "natural_earth" user = "osm" password = " osm_password" 可以设置自定义中心位置(经纬度) 用于您的地图和默认缩放级别。请注意,您必须使用十进制值,而不能使用整数值。特戈拉在前台运行。为了在后台运行它,我们可以创建一个 systemd 服务,它也允许 Tegola 在系​​统启动时自动启动。按 Ctrl+C 停止当前的 Tegola 进程,然后创建 tegola.service 文件。 [Unit] Description=Tegola Vector Tile Server [Service] Type=simple User=www-data ExecStart=/usr/local/bin/tegola serve --config=/opt/tegola-osm/tegola.toml Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target 您应该会看到矢量瓦片地图。恭喜!您刚刚成功构建了自己的矢量切片服务器。请注意,Firefox 无法显示这些矢量切片。您需要使用第三方库来显示基于矢量切片的地图,这在本教程末尾进行了解释。

要使用域名访问Tegola,我们可以使用Nginx 或Apache 为Tegola 设置反向代理。这也将允许我们使用免费的 Let's Encrypt 证书启用 HTTPS。 Nginx 是一种非常流行的 Web 服务器和反向代理。如果您更喜欢使用 Nginx,请运行以下命令进行安装。将以下内容添加到此文件中。将 tile.example.com 替换为您自己的域名。您还应该为此子域创建 DNS A 记录。如果您没有真正的域名,我建议您去 NameCheap 购买一个。价格低廉,他们终身免费提供whois隐私保护。服务器{听80;听 [::]:80; server_name tile.example.com; access_log /var/log/nginx/tegola.access; error_log /var/log/nginx/tegola.error;位置 / { proxy_pass http://127.0.0.1:8080; proxy_set_header 主机 $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Protocol $scheme; proxy_set_header X-Forwarded-Host $http_host;如果您更喜欢 Apache 而不是 Nginx,请使用以下命令安装 Apache Web 服务器。要使用 Apache 作为反向代理,我们需要启用代理模块和标头模块。将以下配置放入文件中。将 tile.example.com 替换为您的实际域名。不要忘记为此子域创建 DNS A 记录。如果您没有真正的域名,我建议您去 NameCheap 购买一个。价格低廉,他们终身免费提供whois隐私保护。

<VirtualHost *:80> ServerName tile.example.com ErrorDocument 404 /404.html #HTTP 代理 ProxyPass / http://127.0.0.1:8080/ ProxyPassReverse / http://127.0.0.1:8080/ ProxyPreserveHost On </VirtualHost > 为了在您从外部访问 Tegola 服务器时加密 HTTP 流量,我们可以通过安装 Let's Encrypt 颁发的免费 TLS 证书来启用 HTTPS。运行以下命令在 Ubuntu 20.04 上安装 Let's Encrypt 客户端 (certbot)。 --hsts:将 Strict-Transport-Security 标头添加到每个 HTTP 响应。强制浏览器始终对域使用 TLS。防御 SSL/TLS 剥离。 --staple-ocsp:启用 OCSP 装订。有效的 OCSP 响应被装订到服务器在 TLS 期间提供的证书。现在应该获得并自动安装证书。您可以通过 HTTPS 访问 Tegola:https://tile.example.com。您需要使用第三方库来显示基于矢量切片的地图。我以 OpenLayer 为例。在您的服务器上创建一个 map.html 文件并输入以下代码。 <!doctype html> <html lang="en"> <head> <link rel="stylesheet" href="https://openlayers.org/en/v5.3.0/css/ol.css" type="text /css"> <style> #map{height:1000px;width:100%;background-color:#1C79B5;} </style> <script src="https://openlayers.org/en/v5.3.0/ build/ol.js" type="text/javascript"></script> <title>OpenLayers 示例</title> </head> <body> <div id="map" class="map"></div > <script type="text/javascript"> var defaultStyle = new ol.style.Style({ fill: new ol.style.Fill({ color: [234,231,221,1] }), stroke: new ol.style.Stroke ({ 颜色: [182,177,162,1], 宽度: 1 }) }); var waterStyle = new ol.style.Style({ fill: new ol.style.Fill({ color: [28,121,181,1] }),stroke: new ol.style.Stroke({ color: [27,107,159,1], width : 1 }) }); var streetStyle = new ol.style.Style({ fill: new ol.style.Fill({ color: [111,44,173,1] }), stroke: new ol.style.Stroke({ color: [93,32,150, 1],宽度:1 }) }); function styleFunction(feature, resolution){ if (feature.get('type') == 'water' || feature.get('layer') == 'water_areas' || feature.get('layer') == 'water_lines'){ 返回 [waterStyle]; } if (feature.get('layer') == 'transport_lines'){ return [streetStyle]; } if (feature.get('layer') == 'country_polygons' || feature.get('layer') == 'landuse_areas'){ return null; // 不应用任何样式,返回 null } return [defaultStyle]; } var map = new ol.Map({ target: 'map', layers: [ new ol.layer.VectorTile({ source: new ol.source.VectorTile({ format: new ol.format.MVT(), url: 'https://tile.linuxbabe.com/maps/osm/{z}/{x}/{y}.pbf' }), style:styleFunction }) ], view: new ol.View({ center: ol .proj.fromLonLat([0.5,54.5]), //地图将以初始缩放为中心的坐标:6 }) }); </script> </body> </html>

我希望本文能帮助您在 Ubuntu 20.04 上设置 Tegola Vector Tile Server。与往常一样,如果您觉得这篇文章有用,请订阅我们的免费时事通讯以获取更多提示和技巧。保重🙂