Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

设置底图并从 PostGIS 叠加点

您通常有一些半专有数据源,您想将其叠加到另一个数据源上。 本指南展示如何使用 Planetiler 从 OSM 生成底图,并从 PostGIS 数据库叠加自定义点。 有关此/替代数据源的优缺点讨论,请参见此处。

先决条件

我们期望您已经安装以下内容:

使用 Planetiler 生成 MBTiles 底图

有多种方法可以生成瓦片存档。 对于半静态瓦片存档,我们认为使用 Planetiler 通过 OpenMapTiles 构建 MBtiles 存档是一个很好的起点。

🤔 为什么我首先需要一个工具来将 OSM 转换为 mbtiles?(点击展开)

您需要一个工具从 OpenStreetMap 构建矢量瓦片集的原因是 OpenStreetMap 中的数据

  • 不遵循特定架构,
  • 也没有预先分块为 x/y/z 块。
🤔 MBtiles 和 OpenMapTiles 是什么?(点击展开)

好问题。

MBtiles 是存档格式。可以将其视为一个 sqlite 数据库,存储您需要的世界块(x/y/z)的数据。 有关此/替代格式的优缺点讨论,请参阅我们的比较 pmtiles vs. mbtiles。

但存档中的数据看起来如何? 这就是矢量瓦片架构的作用: OpenMapTiles 定义了在提供的数据中包含哪些层以及它们如何聚合。 OpenMapTiles 确实有归属要求。您需要在地图底部有 © OpenMapTiles。

如果您想了解更多,请参阅 Shortbread,这是一个更新但不太成熟的替代方案。

以下命令为摩纳哥下载一个瓦片存档到 data/monaco.mbtiles。

有关不同下载选项,请参阅 Planetiler 文档。

mkdir --parents data
docker run \
  --user=$UID \
  -e JAVA_TOOL_OPTIONS="-Xmx1g" \
  -v "$(pwd)/data":/data \
  --rm \
  ghcr.io/onthegomap/planetiler:latest \
  --download \
  --minzoom=0 \
  --maxzoom=14 \
  --tile_compression=none \
  --area=monaco \
  --output /data/monaco.mbtiles

将数据加载到 PostGIS 数据库

运行 PostGIS

首先,您需要一个正在运行的 postGIS 实例。

docker run \
  --name some-postgis \
  --env POSTGRES_PASSWORD=mypass \
  --publish 5432:5432 \
  --detach \
  postgis/postgis

将点导入 PostGIS

然后您需要将几何添加到 PostGIS 数据库。 这可以通过多种方式实现,例如 osm2pgsql 用于添加特定的、可更新的 OSM 数据,或通过 postgres 的各种数据库连接器在您选择的编程语言中实现。

docker exec some-postgis psql --dbname postgres --username postgres --command \
  "CREATE TABLE where_yachts_can_be_looked_at ("\
  "  title TEXT NOT NULL, "\
  "  subtitle TEXT NOT NULL, "\
  "  location GEOMETRY(Point, 4326) NOT NULL);"

docker exec some-postgis psql --dbname postgres --username postgres --command \
  "INSERT INTO where_yachts_can_be_looked_at (title, subtitle, location) VALUES ( "\
  "  'Port Hercules', "\
  "  'Great view of superyachts docked in the iconic harbor.', "\
  "  ST_SetSRID(ST_MakePoint(7.424789, 43.735217), 4326));"

使用 Martin 提供瓦片

现在我们将提供 mbtiles 和 postgis 数据库的内容。

如果您想要更精确的选项来控制发布内容的方式,请参阅配置文件或 cli 文档。 默认情况下,我们将共享每个可服务的 postgres 表、视图和函数。

martin data/monaco.mbtiles postgres://postgres:mypass@localhost:5432/postgres

您现在可以在此处查看可用内容的目录:http://localhost:3000/catalog 两个瓦片集的 tilejson 端点是 http://localhost:3000/monaco,where_yachts_can_be_looked_at

在 Maputnik 中使用以设置地图样式

由于 CORS,我们无法在没有进一步设置的情况下使用网站 https://maplibre.org/maputnik/。 一旦瓦片部署在 https 后面,就可以使用它。

要获取 maputnik 的本地版本,请运行

docker run -it --rm -p 8888:80 ghcr.io/maplibre/maputnik:main

Maputnik 现在在线,所以让我们将 martin 的瓦片加载到其中。

  1. 访问 http://localhost:8888
  2. 您首先需要一个样式:
    • 点击 Open UI 中 “Open” 按钮的位置
    • 选择您喜欢的样式(我们将选择 Maptiler Basic) 如何选择样式
  3. 您现在有一个使用 Maptilers’(不是 martin)数据的样式。您需要更改其数据源以使用我们刚刚发布的瓦片:
    • 点击 Data Sources 如何更改数据源
    • 并添加上面的 tilejson http://localhost:3000/monaco,where_yachts_can_be_looked_at: 如何添加 tilejson
  4. 现在,让我们放大到摩纳哥: 摩纳哥在地图上的位置
  5. 最后,让我们为我们的游艇添加一个圆圈层:
    • 点击 Add Layer 添加圆圈层

    • 按如下方式配置层: 添加圆圈层

    • 并将其样式设置为: 添加圆圈层

      json 配置(点击展开)
      {
        "id": "where_yachts_can_be_looked_at",
        "type": "circle",
        "source": "openmaptiles",
        "source-layer": "where_yachts_can_be_looked_at",
        "paint": {
          "circle-color": "rgba(255, 7, 103, 1)",
          "circle-blur": 0.2,
          "circle-radius": {
            "stops": [
              [13, 1],
              [15, 300],
              [20, 2000]
            ]
          },
          "circle-opacity": {
            "stops": [[13.5, 0], [14, 0.4]]
          }
        },
        "minzoom": 13
      }