Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
|
nominatim [2026/03/29 01:47] jango |
nominatim [2026/04/04 11:24] (aktuell) admin [Search] |
||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | Nominatim ist ein Open-Source Geocoder für [[OpenStreetMap]]-Daten (OSM). Das System kann Orts-, Straßen- und Adressangaben in Koordinaten umwandeln (Geocoding) und umgekehrt aus Koordinaten eine möglichst passende Adresse ableiten (Reverse Geocoding). Nominatim indiziert OSM Daten für Suchanfragen. Dabei werden Namen, Adressen, administrative Grenzen und weitere OSM-Merkmale verarbeitet, | ||
| + | |||
| + | Nominatim wird sowohl als öffentliche Web-API betrieben als auch als Software zur Selbstinstallation angeboten. | ||
| + | |||
| Siehe [[OpenStreetMap]] | Siehe [[OpenStreetMap]] | ||
| Demo [[https:// | Demo [[https:// | ||
| + | |||
| + | =====API-Endpunkte===== | ||
| + | |||
| + | Die Web-API von Nominatim stellt unter anderem folgende Endpunkte bereit: /search, /reverse, /lookup, /status und /details. Der Endpunkt /search dient zur textuellen Suche, /reverse zur Adressauflösung aus Koordinaten und /lookup zur Abfrage anhand von OSM-Objekt-IDs. | ||
| + | |||
| + | ====Search==== | ||
| + | |||
| + | Mit /search können freie oder strukturierte Suchanfragen gestellt werden. Nominatim unterstützt sowohl Freitext als auch strukturierte Parameter wie Straße, Stadt oder Postleitzahl. Zusätzlich können bestimmte Begriffe als sogenannte special phrases interpretiert werden, um nach Objekttypen zu suchen. | ||
| + | |||
| + | Beispiel: | ||
| + | |||
| + | https:// | ||
| + | |||
| + | <code python> | ||
| + | import requests | ||
| + | |||
| + | def search_place(query: | ||
| + | url = " | ||
| + | params = { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | headers = { | ||
| + | " | ||
| + | } | ||
| + | |||
| + | response = requests.get(url, | ||
| + | response.raise_for_status() | ||
| + | return response.json() | ||
| + | |||
| + | |||
| + | results = search_place(" | ||
| + | |||
| + | for place in results: | ||
| + | print(place[" | ||
| + | print(place[" | ||
| + | </ | ||
| + | ====Reverse==== | ||
| + | |||
| + | Mit /reverse wird zu einem Koordinatenpaar ein passender OSM-Ort bzw. eine Adresse gesucht. | ||
| + | |||
| + | Beispiel: | ||
| + | |||
| + | https:// | ||
| + | |||
| + | <code python> | ||
| + | import requests | ||
| + | |||
| + | def reverse_geocode(lat: | ||
| + | url = " | ||
| + | params = { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | headers = { | ||
| + | " | ||
| + | } | ||
| + | |||
| + | response = requests.get(url, | ||
| + | response.raise_for_status() | ||
| + | return response.json() | ||
| + | |||
| + | |||
| + | result = reverse_geocode(48.20849, | ||
| + | print(result[" | ||
| + | </ | ||
| + | ====Lookup==== | ||
| + | |||
| + | Mit /lookup lassen sich Detailinformationen zu bekannten OSM-Objekten abrufen, wenn deren Objekt-ID vorliegt. | ||
| =====Setup===== | =====Setup===== | ||
| - | ====WSL==== | + | ====Docker==== |
| + | Persistent | ||
| + | < | ||
| + | docker run -it \ | ||
| + | -e PBF_URL=https:// | ||
| + | -e REPLICATION_URL=https:// | ||
| + | -e IMPORT_STYLE=full \ | ||
| + | -p 8080:8080 \ | ||
| + | --name nominatim-at \ | ||
| + | -v nominatim-data:/ | ||
| + | mediagis/ | ||
| + | </ | ||
| + | ====WSL Demo==== | ||
| + | Non persistent | ||
| <code bash> | <code bash> | ||
| # | # | ||
| Zeile 93: | Zeile 182: | ||
| </ | </ | ||
| - | ====Proxmox Ubuntu 22.04 Template==== | ||
| - | <code bash> | ||
| - | # | ||
| - | set -euo pipefail | ||
| - | |||
| - | NOM_USER=" | ||
| - | WEB_DB_USER=" | ||
| - | NOM_HOME="/ | ||
| - | NOM_VENV="/ | ||
| - | NOM_PROJECT_DIR="/ | ||
| - | NOM_PBF_DOWNLOAD=" | ||
| - | NOM_PBF_FILE="/ | ||
| - | |||
| - | IMPORT_THREADS=" | ||
| - | IMPORT_OSM2PGSQL_CACHE=" | ||
| - | PG_VERSION=" | ||
| - | |||
| - | if [[ "$(id -u)" -ne 0 ]]; then | ||
| - | echo "Run this script as root." | ||
| - | exit 1 | ||
| - | fi | ||
| - | |||
| - | if [[ -n " | ||
| - | echo " | ||
| - | curl -L " | ||
| - | fi | ||
| - | |||
| - | if [[ ! -f " | ||
| - | echo "PBF not found: ${NOM_PBF_FILE}" | ||
| - | exit 1 | ||
| - | fi | ||
| - | |||
| - | export DEBIAN_FRONTEND=noninteractive | ||
| - | |||
| - | echo "[1/8] Installing base packages..." | ||
| - | apt-get update | ||
| - | apt-get install -y \ | ||
| - | ca-certificates curl wget gnupg lsb-release unzip sudo \ | ||
| - | build-essential cmake pkg-config git \ | ||
| - | libboost-dev libexpat1-dev zlib1g-dev libbz2-dev libpq-dev libicu-dev \ | ||
| - | python3 python3-pip python3-venv python3-dev | ||
| - | |||
| - | echo "[2/8] Adding PostgreSQL PGDG repository..." | ||
| - | install -d / | ||
| - | curl -fsSL https:// | ||
| - | -o / | ||
| - | echo "deb [signed-by=/ | ||
| - | > / | ||
| - | |||
| - | echo "[3/8] Installing PostgreSQL/ | ||
| - | apt-get update | ||
| - | apt-get install -y \ | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | postgresql-contrib \ | ||
| - | postgis \ | ||
| - | " | ||
| - | osm2pgsql osmium-tool | ||
| - | |||
| - | echo "[4/8] Starting PostgreSQL..." | ||
| - | service postgresql start | ||
| - | |||
| - | echo "[5/8] Resetting DB roles..." | ||
| - | sudo -u postgres dropdb --if-exists nominatim || true | ||
| - | sudo -u postgres dropuser --if-exists " | ||
| - | sudo -u postgres dropuser --if-exists " | ||
| - | sudo -u postgres createuser -s " | ||
| - | sudo -u postgres createuser " | ||
| - | |||
| - | echo "[6/8] Creating Linux user and directories..." | ||
| - | id -u " | ||
| - | mkdir -p " | ||
| - | rm -rf " | ||
| - | python3 -m venv " | ||
| - | chown -R " | ||
| - | |||
| - | echo "[7/8] Installing Python packages..." | ||
| - | sudo -u " | ||
| - | sudo -u " | ||
| - | nominatim-db nominatim-api falcon uvicorn gunicorn osmium | ||
| - | |||
| - | echo "[8/8] Writing project environment and importing Austria..." | ||
| - | cat > " | ||
| - | NOMINATIM_DEFAULT_LANGUAGE=de, | ||
| - | EOF | ||
| - | chown " | ||
| - | chmod 640 " | ||
| - | |||
| - | sudo -u " | ||
| - | --project-dir " | ||
| - | --osm-file " | ||
| - | --threads " | ||
| - | --osm2pgsql-cache " | ||
| - | |||
| - | echo | ||
| - | echo " | ||
| - | echo | ||
| - | echo "Start API with:" | ||
| - | echo "sudo -u ${NOM_USER} bash -lc 'cd ${NOM_PROJECT_DIR} && ${NOM_VENV}/ | ||
| - | </ | ||
| - | ====Docker==== | ||
| - | Untested | ||
| - | < | ||
| - | docker run -it \ | ||
| - | -e PBF_URL=https:// | ||
| - | -e REPLICATION_URL=https:// | ||
| - | -e IMPORT_STYLE=full \ | ||
| - | -p 8080:8080 \ | ||
| - | --name nominatim-at \ | ||
| - | -v nominatim-data:/ | ||
| - | mediagis/ | ||
| - | </ | ||
| - | |||
| - | ====Ubuntu 24.04==== | ||
| - | Untested | ||
| - | <code bash> | ||
| - | # | ||
| - | set -euo pipefail | ||
| - | |||
| - | # ============================================================ | ||
| - | # Nominatim 5.2 + Austria import on Ubuntu 24.04 | ||
| - | # ============================================================ | ||
| - | |||
| - | # ---- configurable values ---- | ||
| - | NOM_USER=" | ||
| - | NOM_HOME="/ | ||
| - | NOM_VENV="/ | ||
| - | NOM_DATA_DIR="/ | ||
| - | NOM_PROJECT_DIR="/ | ||
| - | NOM_PBF_URL=" | ||
| - | NOM_PBF_FILE=" | ||
| - | |||
| - | # Geofabrik Austria updates | ||
| - | NOM_REPL_URL=" | ||
| - | |||
| - | # API bind | ||
| - | NOM_BIND_ADDR=" | ||
| - | NOM_BIND_PORT=" | ||
| - | |||
| - | # Optional flatnode file: speeds/ | ||
| - | USE_FLATNODE=" | ||
| - | FLATNODE_FILE=" | ||
| - | |||
| - | # Tune this to your RAM. 1-4G are sensible for Austria on smaller boxes. | ||
| - | IMPORT_THREADS=" | ||
| - | IMPORT_OSM2PGSQL_CACHE=" | ||
| - | |||
| - | # PostgreSQL version installed by Ubuntu 24.04 | ||
| - | PG_VERSION=" | ||
| - | |||
| - | # ---- sanity ---- | ||
| - | if [[ "$(id -u)" -ne 0 ]]; then | ||
| - | echo "Run as root." | ||
| - | exit 1 | ||
| - | fi | ||
| - | |||
| - | export DEBIAN_FRONTEND=noninteractive | ||
| - | |||
| - | echo " | ||
| - | apt-get update | ||
| - | apt-get install -y \ | ||
| - | postgresql postgresql-contrib postgresql-server-dev-all \ | ||
| - | postgis postgresql-${PG_VERSION}-postgis-3 \ | ||
| - | osm2pgsql osmium-tool \ | ||
| - | build-essential cmake pkg-config git curl wget unzip \ | ||
| - | libboost-dev libexpat1-dev zlib1g-dev libbz2-dev libpq-dev libicu-dev \ | ||
| - | python3 python3-pip python3-venv python3-dev \ | ||
| - | apache2 php-fpm | ||
| - | |||
| - | echo " | ||
| - | id -u " | ||
| - | |||
| - | mkdir -p " | ||
| - | chown -R " | ||
| - | chmod 755 " | ||
| - | |||
| - | echo " | ||
| - | python3 -m venv " | ||
| - | " | ||
| - | " | ||
| - | |||
| - | echo " | ||
| - | cat > " | ||
| - | # Nominatim project settings | ||
| - | NOMINATIM_DATABASE_DSN=pgsql: | ||
| - | NOMINATIM_REPLICATION_URL=${NOM_REPL_URL} | ||
| - | NOMINATIM_REPLICATION_UPDATE_INTERVAL=86400 | ||
| - | NOMINATIM_REPLICATION_RECHECK_INTERVAL=900 | ||
| - | NOMINATIM_DEFAULT_LANGUAGE=de, | ||
| - | EOF | ||
| - | |||
| - | chown " | ||
| - | chmod 640 " | ||
| - | |||
| - | echo " | ||
| - | systemctl enable postgresql | ||
| - | systemctl restart postgresql | ||
| - | |||
| - | PGCONF="/ | ||
| - | |||
| - | # Backup once | ||
| - | if [[ ! -f " | ||
| - | cp " | ||
| - | fi | ||
| - | |||
| - | # Conservative tuning for an Austria-only host. Adjust if you know your RAM. | ||
| - | sed -ri " | ||
| - | sed -ri " | ||
| - | sed -ri " | ||
| - | sed -ri " | ||
| - | sed -ri " | ||
| - | |||
| - | # Append settings if missing | ||
| - | grep -q " | ||
| - | grep -q " | ||
| - | grep -q " | ||
| - | |||
| - | systemctl restart postgresql | ||
| - | |||
| - | # Create postgres user matching service user for peer auth. | ||
| - | sudo -u postgres psql -tAc " | ||
| - | sudo -u postgres createuser -s " | ||
| - | |||
| - | sudo -u postgres psql -tAc " | ||
| - | sudo -u postgres createdb -O " | ||
| - | |||
| - | sudo -u postgres psql -d nominatim -c " | ||
| - | sudo -u postgres psql -d nominatim -c " | ||
| - | |||
| - | echo " | ||
| - | if [[ ! -f " | ||
| - | wget -O " | ||
| - | fi | ||
| - | chown " | ||
| - | |||
| - | echo " | ||
| - | IMPORT_CMD=( " | ||
| - | --project-dir " | ||
| - | --osm-file " | ||
| - | --threads " | ||
| - | --osm2pgsql-cache " | ||
| - | ) | ||
| - | |||
| - | if [[ " | ||
| - | IMPORT_CMD+=( --flatnode-file " | ||
| - | fi | ||
| - | |||
| - | sudo -u " | ||
| - | |||
| - | echo " | ||
| - | sudo -u " | ||
| - | |||
| - | echo " | ||
| - | cat > / | ||
| - | [Unit] | ||
| - | Description=Nominatim API | ||
| - | After=network.target postgresql.service | ||
| - | Wants=postgresql.service | ||
| - | |||
| - | [Service] | ||
| - | Type=simple | ||
| - | User=${NOM_USER} | ||
| - | Group=${NOM_USER} | ||
| - | WorkingDirectory=${NOM_PROJECT_DIR} | ||
| - | Environment=PATH=${NOM_VENV}/ | ||
| - | ExecStart=${NOM_VENV}/ | ||
| - | Restart=always | ||
| - | RestartSec=5 | ||
| - | |||
| - | [Install] | ||
| - | WantedBy=multi-user.target | ||
| - | EOF | ||
| - | |||
| - | echo " | ||
| - | cat > / | ||
| - | [Unit] | ||
| - | Description=Nominatim Replication Updater | ||
| - | After=network.target postgresql.service | ||
| - | Wants=postgresql.service | ||
| - | |||
| - | [Service] | ||
| - | Type=simple | ||
| - | User=${NOM_USER} | ||
| - | Group=${NOM_USER} | ||
| - | WorkingDirectory=${NOM_PROJECT_DIR} | ||
| - | Environment=PATH=${NOM_VENV}/ | ||
| - | ExecStart=${NOM_VENV}/ | ||
| - | Restart=always | ||
| - | RestartSec=30 | ||
| - | |||
| - | [Install] | ||
| - | WantedBy=multi-user.target | ||
| - | EOF | ||
| - | |||
| - | systemctl daemon-reload | ||
| - | systemctl enable nominatim-api.service | ||
| - | systemctl enable nominatim-replication.service | ||
| - | systemctl start nominatim-api.service | ||
| - | systemctl start nominatim-replication.service | ||
| - | |||
| - | echo | ||
| - | echo " | ||
| - | echo "API should be reachable at:" | ||
| - | echo " | ||
| - | echo | ||
| - | echo " | ||
| - | echo " | ||
| - | echo " | ||
| - | echo " | ||
| - | echo " | ||
| - | </ | ||