PHPackages                             mandrael/contao-maplibre - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. mandrael/contao-maplibre

ActiveContao-bundle[Utility &amp; Helpers](/categories/utility)

mandrael/contao-maplibre
========================

MapLibre-Karten für Contao mit OpenFreeMap (© OpenMapTiles, Data from OpenStreetMap): Multi-Marker und Cluster-Marker, zentrale Standortverwaltung mit Geocoding (Nominatim) und ein Inhaltselement – datenschutzfreundlicher Ersatz für Google Maps.

00PHPCI passing

Since Jun 24Pushed 1mo agoCompare

[ Source](https://github.com/mandrael/contao-maplibre)[ Packagist](https://packagist.org/packages/mandrael/contao-maplibre)[ RSS](/packages/mandrael-contao-maplibre/feed)WikiDiscussions main Synced 2w ago

READMEChangelogDependenciesVersions (1)Used By (0)

[![Contao MapLibre](logo.svg)](logo.svg)

**Deutsch** | [English](README.en.md)

Contao MapLibre
===============

[](#contao-maplibre)

Datenschutzfreundliche Karten für Contao mit [MapLibre GL JS](https://maplibre.org/) und [OpenFreeMap](https://openfreemap.org/) (Vektor-Tiles auf Basis von OpenMapTiles / OpenStreetMap) – ein direkter Ersatz für Google Maps. Mit **Multi-Marker**, **Cluster-Markern**, zentraler Standortverwaltung und automatischem **Geocoding** (Adresse → Koordinaten via Nominatim).

Eine gemeinsame Codebasis für die drei Contao-LTS-Versionen **4.13, 5.3 und 5.7** (inkl. 5.4–5.6).

---

Funktionsumfang
---------------

[](#funktionsumfang)

- **Inhaltselement „MapLibre Karte"** – platzierbar in jedem Artikel, ersetzt eine Google-Map dort, wo sie steht.
- **Backend-Modul „MapLibre Standorte"** (`tl_maplibre_location`) – zentrale Verwaltung von Orten mit Titel, Adresse, Kategorie, Verknüpfung und Veröffentlichungs-Status.
- **Automatik statt Pflege:** Ein Standort, der **unveröffentlicht** wird, verschwindet automatisch von **allen** Karten. Kein manuelles Entfernen einzelner Marker.
- **Geocoding beim Speichern:** Aus der Adresse werden per Nominatim (OpenStreetMap) die Koordinaten ermittelt und in der Datenbank gecacht – manuelle Koordinaten bleiben möglich.
- **Marker-Symbole:** Kuratiertes, kartenrelevantes Icon-Set ([Maki](https://labs.mapbox.com/maki-icons/), CC0) – im Backend über einen visuellen Picker wählbar (farbiger Pin mit weißem Icon, wie Google My Maps). Gruppen-Standard im Karten-Element, pro Standort überschreibbar; zusätzlich **eigenes SVG** hochladbar.
- **Multi-Marker &amp; Cluster:** Beliebig viele Marker pro Karte; optional als zusammenfassende, nummerierte Cluster-Kreise, die beim Klick in die Region zoomen.
- **Optik wie gewohnt:** OpenFreeMap-Stil `bright` (alternativ `liberty`/`positron`), dezente Marker-Farbe, „Zum Aktivieren klicken" (die Seite scrollt durch die Karte hindurch, bis man sie anklickt).
- **Migration aus Google My Maps:** Ein Konsolen-Befehl importiert die Marker einer bestehenden „Google My Maps"-Karte (KML) als Standorte.
- **Wiederverwendbar:** Die Render-Logik ist als Service (`MaplibreRenderer`) gekapselt und kann von eigenen Bundles genutzt werden.

Datenschutz
-----------

[](#datenschutz)

Es werden **keine** Google-Dienste eingebunden. Die Tiles kommen von OpenFreeMap, MapLibre GL JS von unpkg. Es findet kein Tracking statt. Geocoding läuft ausschließlich **im Backend beim Speichern**(nicht im Frontend), die Koordinaten werden gecacht.

Installation
------------

[](#installation)

```
composer require mandrael/contao-maplibre
vendor/bin/contao-console cache:clear
vendor/bin/contao-console contao:migrate
```

Alternativ über den **Contao Manager** nach `mandrael/contao-maplibre` suchen, hinzufügen und die Datenbank aktualisieren.

Verwendung
----------

[](#verwendung)

### 1. Standorte anlegen

[](#1-standorte-anlegen)

Im Backend unter **Inhalte → MapLibre Standorte** einen Standort anlegen: Titel, Adresse (Straße, PLZ, Ort, optional Land) und eine **Kategorie** (z. B. „Kursorte"). Beim Speichern werden die **Koordinaten automatisch aus der Adresse ermittelt** (Nominatim) und gespeichert.

- Koordinaten lassen sich jederzeit **manuell überschreiben**.
- „Koordinaten neu aus Adresse ermitteln" erzwingt beim nächsten Speichern eine Neuberechnung.
- Nur **veröffentlichte** Standorte (innerhalb des optionalen Anzeige-Zeitraums) erscheinen auf Karten.

### 2. Karte einfügen

[](#2-karte-einfügen)

Im Artikel ein Inhaltselement vom Typ **MapLibre Karte** hinzufügen und die Marker-Quelle wählen:

- **Standorte** – einzelne zentrale Standorte, und/oder
- **Kategorien** – alle veröffentlichten Standorte der gewählten Kategorien, und/oder
- **Eigene Marker (Ad-hoc)** – eine Zeile je Marker im Format `Bezeichnung; Adresse`. Die Koordinaten werden beim Speichern des Elements automatisch ermittelt und gecacht.

Darstellungs-Optionen: Kartenstil, Höhe, Markerfarbe, **Standard-Symbol (Gruppe)**, **Cluster** an/aus, „sofort interaktiv". Ausschnitt: „alle Marker automatisch einpassen" (`fitBounds`) **oder** fester Mittelpunkt + Zoomstufe.

Standardmäßig scrollt die Seite **durch die Karte hindurch** (Mausrad-Zoom erst nach einem Klick in die Karte – wie auf der Vorlage). Die Option **„Karte sofort interaktiv"** lässt die Karte das Mausrad-Scrollen ohne Klick übernehmen (und fängt damit das Seiten-Scrollen ab).

### Marker-Symbole

[](#marker-symbole)

Jeder Marker wird als farbiger Pin (Markerfarbe) mit weißem Icon-Glyph dargestellt – wie bei Google My Maps. Das Symbol wird in dieser Reihenfolge bestimmt: **eigenes SVG des Standorts** › **gewähltes Symbol des Standorts** › **Gruppen-Standardsymbol des Karten-Elements** › schlichter Pin ohne Symbol.

- Im Backend (Standort **und** Karten-Element) öffnet ein **visueller Icon-Picker** ein anklickbares Raster der mitgelieferten Symbole.
- Für ein individuelles Symbol genügt das Feld **„Eigenes SVG-Symbol"** am Standort (eine SVG-Datei aus der Dateiverwaltung). Es wird – passend zum Pin-Stil – weiß im farbigen Pin dargestellt.

### 3. Bestehende Google-My-Maps-Karte importieren

[](#3-bestehende-google-my-maps-karte-importieren)

```
vendor/bin/contao-console contao:maplibre:import-mymaps  --category=Kursorte
```

Die `mid` steht in der Embed-/Teilen-URL der Google-My-Maps-Karte (`https://www.google.com/maps/d/embed?mid=`). Die enthaltenen Marker (Name + Koordinaten) werden als Standorte der angegebenen Kategorie angelegt. Adressen kannst du anschließend im Backend ergänzen.

Content Security Policy (CSP)
-----------------------------

[](#content-security-policy-csp)

Nutzt die Seite eine CSP, müssen folgende Quellen erlaubt sein:

```
script-src  https://unpkg.com;
style-src   https://unpkg.com;
connect-src https://tiles.openfreemap.org;
img-src     data: blob:;
worker-src  blob:;

```

Auf **Contao 5.x** werden diese Quellen **automatisch** in die Seiten-CSP eingetragen, sofern die Seite eine CSP gesetzt hat. Auf Contao 4.13 sind sie ggf. manuell zu ergänzen.

Wiederverwendung in eigenen Bundles
-----------------------------------

[](#wiederverwendung-in-eigenen-bundles)

Die Karte lässt sich programmatisch erzeugen – z. B. aus einem eigenen Katalog-/Personen-Bundle:

```
use Mandrael\ContaoMaplibreBundle\Map\Marker;
use Mandrael\ContaoMaplibreBundle\Map\MaplibreRenderer;

$html = $renderer->render(
    [
        new Marker(47.8127, 13.0489, 'Praxis Tobar', 'Breitenfelderstr. 47a, 5020 Salzburg', '/profil/tobar'),
        // ...
    ],
    ['cluster' => true, 'height' => 500]
);
```

`$renderer` ist der Service `Mandrael\ContaoMaplibreBundle\Map\MaplibreRenderer` (autowire-fähig).

Kompatibilität
--------------

[](#kompatibilität)

- **PHP:** 8.1+
- **Contao:** 4.13 LTS, 5.3 LTS und 5.7 LTS (inkl. 5.4–5.6) aus einer Codebasis.

Attribution
-----------

[](#attribution)

Die geforderte Quellenangabe „MapLibre | OpenFreeMap © OpenMapTiles Data from OpenStreetMap" wird vom OpenFreeMap-Stil automatisch in der Karte angezeigt.

Mitgelieferte Icons
-------------------

[](#mitgelieferte-icons)

Das Symbol-Set unter `public/icons/` stammt aus [Maki](https://github.com/mapbox/maki) von Mapbox und steht unter **CC0 1.0** (Public Domain). Eine Attribution ist nicht erforderlich.

Lizenz
------

[](#lizenz)

MIT – siehe [LICENSE](LICENSE). Mitgelieferte Maki-Icons: CC0 1.0.

###  Health Score

19

—

LowBetter than 9% of packages

Maintenance60

Regular maintenance activity

Popularity0

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity11

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/1d32d1d3f59862d236215afa20d4d02efc3d9da6cfab5584f0619eb6022c1305?d=identicon)[mandrael](/maintainers/mandrael)

---

Top Contributors

[![mandrael](https://avatars.githubusercontent.com/u/5021908?v=4)](https://github.com/mandrael "mandrael (9 commits)")

### Embed Badge

![Health badge](/badges/mandrael-contao-maplibre/health.svg)

```
[![Health](https://phpackages.com/badges/mandrael-contao-maplibre/health.svg)](https://phpackages.com/packages/mandrael-contao-maplibre)
```

###  Alternatives

[ircmaxell/random-lib

A Library For Generating Secure Random Numbers

84032.7M135](/packages/ircmaxell-random-lib)[fact-finder/fact-finder-php-library

FACT Finder PHP Library

17343.8k1](/packages/fact-finder-fact-finder-php-library)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
