Drop-in-Tools

Place-Widget (JS), Map-Widget (JS) und PHP-Client als One-Line-Setup für eigene Seiten.

🧩 Place-Widget (JavaScript)

Verwandelt jedes <input>-Feld mit dem Attribut data-geoapi-place in ein Autosuggest-Feld mit Tastatur-Navigation, Hidden-Field-Pflege und Auto-Fill.

Schnellstart

<form method="post" action="speichern.php">
  <input type="text" name="ort" data-geoapi-place placeholder="Ort eingeben">
  <button type="submit">Speichern</button>
</form>

<script src="https://geoapi.world/dist/geoapi-widget.js"></script>

Im Server-PHP stehen anschließend zur Verfügung:

  • $_POST["ort"] — der angezeigte Text
  • $_POST["ort_geonameid"] — die GeoNames-ID
  • $_POST["ort_timezone"] — die IANA-Zeitzone

data-Attribute

AttributDefaultBedeutung
Pflicht
data-geoapi-placeMarkiert das Feld als Autosuggest.
Hidden-Feld-Namen — Default jeweils {inputname}_{key}
data-geoapi-id{name}_geonameidHidden-Field-Name für die geonameid.
data-geoapi-tz{name}_timezoneHidden-Field-Name für die Zeitzone.
data-geoapi-latHidden-Field für Breitengrad.
data-geoapi-lonHidden-Field für Längengrad.
data-geoapi-countryHidden-Field für ISO-Ländercode.
Format der Anzeige
data-geoapi-format-listname + Land + UntertitelTemplate für die Vorschlagsliste mit {key}-Platzhaltern.
data-geoapi-format-inputname + LandWas nach Auswahl im Eingabefeld steht.
Verhalten
data-geoapi-limit8Maximale Vorschläge in der Liste (1–30).
data-geoapi-min2Mindestlänge des Suchbegriffs.
data-geoapi-base(geraten)Alternative API-Base-URL.
data-geoapi-debugausZeigt eine Debug-Box unter dem Input.

Auto-Fill in beliebige Elemente

Mit data-geoapi-fill="key" auf einem beliebigen Element wird dieses nach jeder Auswahl automatisch gefüllt:

<input type="text" name="ort" data-geoapi-place>

<p>Land:        <span data-geoapi-fill="country_code"></span></p>
<p>Zeitzone:    <span data-geoapi-fill="timezone"></span></p>
<p>Einwohner:   <span data-geoapi-fill="population"></span></p>
<p>Koordinaten: <span data-geoapi-fill="lat"></span>, <span data-geoapi-fill="lon"></span></p>

JavaScript-Events

Vier Events bubbeln bis document:

EventWanndetail
geoapi:fetch-startvor jedem API-Call{ url, query }
geoapi:fetch-endnach Antwort{ url, response, results } oder { url, error }
geoapi:selectbeim Klick/Enter auf einen VorschlagTreffer-Objekt
geoapi:clearwenn der Nutzer das Feld verändert
document.querySelector("[data-geoapi-place]")
  .addEventListener("geoapi:select", (e) => {
    const ort = e.detail;
    console.log("Gewählt:", ort.name);
    // map.setView([ort.lat, ort.lon], 13);
  });

→ Alle Widget-Anpassungen live ausprobieren

🧩 Map-Widget (JavaScript)

Interaktive OpenStreetMap-Karte mit Klick-Reverse-Geocoding. Lädt Leaflet 1.9 automatisch nach.

Schnellstart

<div data-geoapi-map style="height: 500px"></div>
<script src="https://geoapi.world/dist/geoapi-map.js"></script>

Klick auf die Karte → Marker → Popup mit Stadt-Name + Zeitzone + Distanz. Mit Hidden-Feldern (siehe Attribute) kommen die Werte beim Form-Submit als $_POST beim Server an — analog zum Place-Widget.

Wichtigste data-Attribute

AttributDefaultBedeutung
data-geoapi-mapPflicht — markiert das Element als Karte.
data-geoapi-center50,10Initial-Zentrum als "lat,lon".
data-geoapi-zoom4Initial-Zoomlevel (0 = Welt, 19 = Hausnummer).
data-geoapi-modecitycity oder exact.
data-geoapi-markersinglesingle oder double (Klick-Marker + zweiter Marker am Treffer + Distanz-Linie).
data-geoapi-tilesOSMAlternative Tile-Server-URL — siehe Tile-Tabelle weiter unten.
data-geoapi-namePräfix für automatisch angelegte Hidden-Felder.

Auto-Fill funktioniert genauso wie beim Place-Widget: data-geoapi-fill="key" auf beliebige Elemente.

JavaScript-Events

EventWanndetail
geoapi:map-clickdirekt nach jedem Klick auf die Karte{ lat, lon }
geoapi:fetch-startvor dem API-Call{ url, lat, lon, mode }
geoapi:fetch-endnach Antwort{ url, response, hit }
geoapi:map-resultnach erfolgreichem Reverse-GeocodingTreffer + { clickedLat, clickedLon }
document.querySelector("[data-geoapi-map]")
  .addEventListener("geoapi:map-result", (e) => {
    const ort = e.detail;
    document.getElementById("name").textContent = ort.name;
    document.getElementById("timezone").textContent = ort.timezone;
  });

Frei nutzbare Tile-Server

OpenStreetMap (Default), CartoDB Positron, Voyager & Dark Matter, OpenTopoMap, Esri Imagery, CyclOSM. Jeder Anbieter hat eigene Lizenz-Bedingungen — bei produktivem Traffic eigenen Tile-Server (siehe switch2osm) oder kostenpflichtigen Anbieter (Mapbox, MapTiler, Stadia) nutzen.

<div data-geoapi-map
     data-geoapi-tiles="https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png"
     data-geoapi-attribution="Karte: &copy; OpenTopoMap (CC-BY-SA)"
     data-geoapi-max-zoom="17"
     style="height: 500px"></div>

→ Alle Map-Anpassungen live ausprobieren

🧩 PHP-Client

Single-File-Klasse für eigenes Server-PHP, mit optionalem Datei-Cache. Erfordert PHP 8.1+.

Schnellstart

<?php
require __DIR__ . "/GeoApiClient.php";

$api = new GeoApiClient();

// Suche
$treffer = $api->search("Münch", limit: 5);

// Reverse-Geocoding
$ort = $api->lookupCity(48.137, 11.575);
$ort = $api->lookupExact(48.137, 11.575);  // ohne Städte-Präferenz

Konstruktor mit Cache

$api = new GeoApiClient(
    baseUrl:         "https://geoapi.world",
    timeoutSeconds:  5,
    userAgent:       "MeineApp/1.0",
    cacheDir:        __DIR__ . "/cache",
    cacheTtlSeconds: 900,   // 15 Min
);

Fehlerbehandlung

Bei HTTP- oder Parsing-Fehlern wirft der Client GeoApiException:

try {
    $ort = $api->lookupCity($lat, $lon);
    if ($ort === null) {
        echo "Keine Stadt gefunden in der Nähe.";
    } else {
        echo "Stadt: " . $ort["name"];
    }
} catch (GeoApiException $e) {
    error_log("geoAPI-Fehler: " . $e->getMessage());
}