Veröffentlichen

HTTPS

Ihr könnt euren Kartendienst einfach über HTTPS veröffentlichen.

HTTPS ist auch für HTTP/2 erforderlich, wodurch die Kartenanzeige auch schneller wird, da dann mehr Anfragen auf einmal möglich sind.

CORS

Cross-Origin Resource Sharing schränkt die Websites ein, die eure gehosteten Ressourcen einbetten dürfen.

Warnung

Vermeidet Wildcards * für Access-Control-Allow-Origin im produktiven Einsatz.

Karten-Ressourcen

Auch wenn eure PMTiles-Archive oder Kachelendpunkte aus eurer eigenen Infrastruktur stammen, können andere Ressourcen auf einer Webkarte von externen Anbietern stammen. Dazu gehören JavaScript-Bibliotheken, CSS-Stylesheets und Schriften.

Content Security Policy

Durch die Festlegung einer Content Security Policy über einen HTTP-Header oder ein HTML-Meta-Tag könnt ihr sicherstellen, dass alle Ressourcen der HTML-Seite aus derselben Quelle stammen, z.B. für MapLibre:

<meta
  http-equiv="Content-Security-Policy"
  content="default-src 'self' 'nonce-n0nce' 'nonce-n0nce1'; worker-src blob: ; child-src blob: ; img-src data: blob: ;" />

Beispiel

Nachfolgend findet ihr ein vollständiges Beispiel für eine Kartenanwendung, bei der Quellen von Dritten vermieden werden:

 1<html>
 2    <head>
 3        <meta charset="utf-8"/>
 4        <meta
 5          http-equiv="Content-Security-Policy"
 6          content="default-src 'self' 'nonce-n0nce' 'nonce-n0nce1'; worker-src blob: ; child-src blob: ; img-src data: blob: ;" />
 7        <link rel="stylesheet" href="maplibre-gl.css">
 8        <script src="maplibre-gl.js"></script>
 9        <script src="pmtiles.js"></script>
10        <script src="basemaps.js"></script>
11    </head>
12    <body>
13        <div id="map" style="height: 100%; width: 100%"></div>
14        <script type="text/javascript">
15            let protocol = new pmtiles.Protocol();
16            maplibregl.addProtocol("pmtiles", protocol.tile);
17            maplibregl.setRTLTextPlugin(
18              "mapbox-gl-rtl-text.min.js",
19              true,
20            );
21            const map = new maplibregl.Map({
22              container: "map",
23              zoom: 12,
24              center: [13.424233,52.534675],
25              style: {
26                glyphs: "fonts/{fontstack}/{range}.pbf",
27                sprite: "sprites/v4/light",
28                version: 8,
29                sources: {
30                  protomaps: {
31                    type: "vector",
32                    url: "pmtiles://berlin.pmtiles",
33                    attribution: '© <a href="https://openstreetmap.org">OpenStreetMap</a>'
34                  },
35                },
36                layers: basemaps.layers("protomaps", basemaps.namedFlavor("light"), {lang: "en"})
37              },
38            });
39        </script>
40    </body>
41</html>
Zeilen 7–10

maplibre-gl.js und maplibre-gl.css sind JavaScript und CSS für die MapLibre GL-Rendering-Bibliothek.

pmtiles.js ist eine JavaScript-Datei zum Dekodieren von PMTiles-Archiven im Browser.

basemaps.js ist eine JavaScript-Datei zum Erstellen eines MapLibre GL-Stils für ein Basiskarten-Kachelset.

Zeile 18

mapbox-gl-rtl-text.min. js ist ein MapLibre-Plugin für die Unterstützung von Sprachen, die von rechts nach links geschrieben werden.

Zeilen 26–27

fonts/fontstack/range.pbf sind Schriftglyphen für die Darstellung von Labels, verfügbar unter protomaps/basemaps-assets.

sprites/version/{flavor_name sind Sprites für Basemap-Icons, verfügbar unter protomaps/basemaps-assets.

Zeile 32

pmtiles://berlin.pmtiles ist die Archivdatei mit den Kartendaten.

Cloud-Speicher

PMTiles funktioniert auf jeder S3-kompatiblen Cloud-Speicherplattform, die HTTP Range Requests und Cross-Origin Resource Sharing (CORS) unterstützt.

Upload

Das Kommandozeilentool pmtiles verfügt über den Befehl pmtiles upload, um Dateien in einen Cloud-Speicher zu übertragen. RClone ist ein weiteres Tool für die Verwaltung großer Dateien auf S3-kompatiblem Speicher:

rclone copyto FILENAME CONFIGURATION:BUCKET/FOLDER/FILENAME.pmtiles --progress --s3-chunk-size=256M

Web-Server

Caddy

Caddy ist wegen seiner eingebauten HTTPS-Unterstützung sehr empfehlenswert für die Bereitstellung von PMTiles. Verwendet die file_server-Konfiguration, um *.pmtiles aus einem statischen Verzeichnis mit folgender CORS-Konfiguration bereitzustellen:

header {
  Access-Control-Allow-Methods GET,HEAD
  Access-Control-Expose-Headers ETag
  Access-Control-Allow-Headers Range,If-Match
  Access-Control-Allow-Origin https://www.cusy.io
}

Als Alternative könnt ihr das pmtiles_proxy-Plugin für Caddy verwenden.

nginx

nginx unterstützt HTTP Range Requests, wobei die CORS-Header und die Unterstützung für CORS Preflight-Anfragen in der Konfigurationsdatei gesetzt werden sollten:

if ($request_method = 'OPTIONS') {
  add_header 'Access-Control-Max-Age' 3600;
  add_header 'Content-Type' 'text/plain charset=UTF-8';
  add_header 'Access-Control-Allow-Origin' '*' always;
  add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always;
  add_header 'Content-Length' 0;
  return 204;
}