让我来构建我的地球吧!我们应该尽快让OpenStreetMap瓦片服务器在几秒钟内建立起来
我之前已经做过几次OpenStreetMap的瓦片服务器,但是却花了很多时间反复做同样的工作。我会忘记很多细节,数据的部署也很耗时,感觉就像一整天的工作。
因此,这次的目标是尽量快速且简单地创建自己的地图服务器,所以我创建了一个Docker容器,并希望与大家分享。
此外,如果您想要使用各地區的地圖,最好將地圖數據存入外部的PostgreSQL。因此,我還想介紹如何使用Azure Database for PostgreSQL來使用更大的地圖數據。
用Docker容器独立运行的OpenStreetMap切片服务器
首先,这是一个在Docker容器上运行的OpenStreetMap瓦片服务器。该瓦片服务器包含了各个区域的地形数据和南极洲的数据。
1.2. 建构和启动方式
请参考以下链接使用Docker构建。有关Docker的安装方法,请查看此处。
git clone https://github.com/KentaroAOKI/openstreetmap-docker.git
cd openstreetmap-docker
docker build -t openstreetmaptile .
只用这个就可以了。由于构建需要一些时间,如果想使用构建好的图像,请执行以下指令。
docker pull kekekekenta/openstreetmaptile
docker rename kekekekenta/openstreetmaptile openstreetmaptile
我将尝试使用以下命令进行启动。(启动时会执行Renderd的数据库设置初始化过程,请稍等一会直到Web服务启动)
docker run -d -p 8080:80 openstreetmaptile
如果在本地环境下运行,请尝试访问以下URL。尽管只是个外观因为没有包含日本地区的数据,但我相信您可以确认它是可以工作的。(如果在Azure等云平台上启动,请确保修改主机名并检查端口安全设置)
我在Windows 10(WSL2后端)上运行,但我认为显示如下(如果在云端如Azure上启动,请检查主机名和端口的安全设置)。

使用Docker容器和外部的PostgreSQL,利用各个地区的OpenStreetMap数据。
由于在Docker容器内放置各地区的OpenStreetMap数据不切实际,因此还介绍了使用外部的PostgreSQL的方法。
2.1. 搭建PostgreSQL
首先,我们将创建PostgreSQL。由于大家可能拥有不同的环境,如果不需要此步骤,请跳过。本次我们的目标是简单地建立数据库,因此我想使用Azure Database for PostgreSQL。

Azure Database for PostgreSQL提供了四种特色的配置供选择。虽然我们选择了“单一服务器”作为本次配置,但如果您没有问题的话,我认为使用灵活服务器会更好。

版本可以选择12,但这次选择10。IOPS的上限会根据存储大小而改变。如果想要尽可能快地处理,请选择更大的大小。

最后,请确保不要忘记设置连接的安全性,以允许来自Docker容器的访问。

2.2. 初始化PostgreSQL数据库
当准备完毕PostgreSQL后,我们将初始化数据库以供OpenStreetMap的瓦片服务器使用。
在Docker容器中,提供了以下环境变量。通过将PostgreSQL连接信息设置为环境变量,可以使用外部的PostgreSQL。
– PSQL_HOST:设置PostgreSQL的主机名(默认设置为“localhost”)。
– PSQL_PORT:设置PostgreSQL的端口号(默认设置为“5432”)。
– PSQL_USERNAME:设置PostgreSQL的管理员用户名(默认设置为“postgres”)。
– PSQL_PASSWORD:设置PostgreSQL的管理员密码(默认设置为“postgrespassword”)。
– PSQL_DBNAME:设置要创建的数据库名称(默认设置为“gis”)。
创建数据库的过程如下,执行Docker容器即可。
docker run -ti -e PSQL_HOST=xxxx.postgres.database.azure.com -e PSQL_USERNAME=xxx@xxx -e PSQL_PASSWORD=xxxx openstreetmaptile scripts/01_initialize_database.sh
接下来,将地图数据写入数据库。(在这里写入南极洲的数据)
docker run -ti -e PSQL_HOST=xxxx.postgres.database.azure.com -e PSQL_USERNAME=xxx@xxx -e PSQL_PASSWORD=xxxx openstreetmaptile scripts/02_write_osm.sh
最后,我们将写入各个地区的外部数据,例如形状数据。
docker run -ti -e PSQL_HOST=xxxx.postgres.database.azure.com -e PSQL_USERNAME=xxx@xxx -e PSQL_PASSWORD=xxxx openstreetmaptile scripts/03_write_external.sh
2.3. 向外部的PostgreSQL添加地图数据
如果要添加地图,请从Geofabrik GmbH的OpenStreetMap Data Extracts获取。
比如,在日本地图的情况下,可以将”asia/japan-latest.osm.pbf”作为命令传递。
docker run -ti -e PSQL_HOST=xxxx.postgres.database.azure.com -e PSQL_USERNAME=xxx@xxx -e PSQL_PASSWORD=xxxx openstreetmaptile scripts/append_osm.sh asia/japan-latest.osm.pbf
使用外部的PostgreSQL进行运行
在运行OpenStreetMap的瓦片服务器时,即使使用外部的PostgreSQL,也请将PostgreSQL的连接信息指定到环境变量中。
docker run -d -p 8080:80 -e PSQL_HOST=xxxx.postgres.database.azure.com -e PSQL_USERNAME=xxx@xxx -e PSQL_PASSWORD=xxxx openstreetmaptile

3. 重新使用已制作的瓷砖图像。
在网页上显示的地图图片已被缓存在Docker容器内。因此,如果重新启动容器,会花费一些时间重新生成地图图片以显示出来。因此,可能可以考虑按以下方式挂载存储并启动。
docker run -d -p 80:80 -e PSQL_HOST=xxxx.postgres.database.azure.com -v /home/user/mod_tile:/var/lib/mod_tile openstreetmaptile
而且,如果将挂载了的文件系统通过fuse挂载到Azure Storage Blob,再利用性将进一步提高。
通过使用blobfuse将Blob Storage挂载为文件系统的方法
最后
以前我把很多个假日都用来工作了,但是现在似乎可以用更多时间来进行深入的实验了。好的,那么……