Benutzer-Werkzeuge

Webseiten-Werkzeuge


nominatim

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
nominatim [2026/03/28 23:26]
admin
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, damit Suchbegriffe effizient in räumliche Treffer übersetzt werden können. Für Reverse Geocoding erzeugt Nominatim synthetische Adressen auf Basis der umliegenden OSM-Daten. Somit unterstützt Nominatim auch Suchanfragen nach Objekttypen, etwa nach Hotels, Pubs oder Kirchen.
 +
 +Nominatim wird sowohl als öffentliche Web-API betrieben als auch als Software zur Selbstinstallation angeboten.
 +
 Siehe [[OpenStreetMap]] Siehe [[OpenStreetMap]]
  
 Demo [[https://nominatim.openstreetmap.org/search?format=jsonv2&q=Stephansplatz]] Demo [[https://nominatim.openstreetmap.org/search?format=jsonv2&q=Stephansplatz]]
 +
 +=====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://nominatim.openstreetmap.org/search?q=Stephansplatz+Wien&format=jsonv2
 +
 +<code python>
 +import requests
 +
 +def search_place(query: str, limit: int = 1) -> list[dict]:
 +    url = "https://nominatim.openstreetmap.org/search"
 +    params = {
 +        "q": query,
 +        "format": "jsonv2",
 +        "limit": limit
 +    }
 +    headers = {
 +        "User-Agent": "mein-technik-wiki-beispiel/1.0 (kontakt@example.org)"
 +    }
 +
 +    response = requests.get(url, params=params, headers=headers, timeout=10)
 +    response.raise_for_status()
 +    return response.json()
 +
 +
 +results = search_place("Stephansplatz, Wien")
 +
 +for place in results:
 +    print(place["display_name"])
 +    print(place["lat"], place["lon"])
 +</code>
 +====Reverse====
 +
 +Mit /reverse wird zu einem Koordinatenpaar ein passender OSM-Ort bzw. eine Adresse gesucht.
 +
 +Beispiel:
 +
 +https://nominatim.openstreetmap.org/reverse?lat=48.20849&lon=16.37208&format=jsonv2
 +
 +<code python>
 +import requests
 +
 +def reverse_geocode(lat: float, lon: float) -> dict:
 +    url = "https://nominatim.openstreetmap.org/reverse"
 +    params = {
 +        "lat": lat,
 +        "lon": lon,
 +        "format": "jsonv2",
 +        "addressdetails": 1
 +    }
 +    headers = {
 +        "User-Agent": "mein-dokuwiki/1.0"
 +    }
 +
 +    response = requests.get(url, params=params, headers=headers, timeout=10)
 +    response.raise_for_status()
 +    return response.json()
 +
 +
 +result = reverse_geocode(48.20849, 16.37208)
 +print(result["display_name"])
 +</code>
 +====Lookup====
 +
 +Mit /lookup lassen sich Detailinformationen zu bekannten OSM-Objekten abrufen, wenn deren Objekt-ID vorliegt.
  
 =====Setup===== =====Setup=====
  
-====WSL====+====Docker==== 
 +Persistent 
 +<code> 
 +docker run -it \ 
 +  -e PBF_URL=https://download.geofabrik.de/europe/austria-latest.osm.pbf \ 
 +  -e REPLICATION_URL=https://download.geofabrik.de/europe/austria-updates \ 
 +  -e IMPORT_STYLE=full \ 
 +  -p 8080:8080 \ 
 +  --name nominatim-at \ 
 +  -v nominatim-data:/var/lib/postgresql/16/main \ 
 +  mediagis/nominatim:5.2 
 +</code>
  
 +====WSL Demo====
 +Non persistent
 <code bash> <code bash>
 #!/usr/bin/env bash #!/usr/bin/env bash
Zeile 16: Zeile 105:
 NOM_VENV="/srv/nominatim-venv" NOM_VENV="/srv/nominatim-venv"
 NOM_PROJECT_DIR="/srv/nominatim/project" NOM_PROJECT_DIR="/srv/nominatim/project"
-NOM_PBF_FILE="/mnt/c/chroot/xampp/htdocs/wien.osm.pbf"+NOM_PBF_DOWNLOAD="https://download.geofabrik.de/europe/austria-latest.osm.pbf" 
 +NOM_PBF_FILE="/home/austria.osm.pbf"
  
 IMPORT_THREADS="4" IMPORT_THREADS="4"
Zeile 25: Zeile 115:
   echo "Run this script as root."   echo "Run this script as root."
   exit 1   exit 1
 +fi
 +
 +if [[ -n "${NOM_PBF_DOWNLOAD}" ]]; then
 +  echo "Downloading ${NOM_PBF_DOWNLOAD} to ${NOM_PBF_FILE}"
 +  curl -L "$NOM_PBF_DOWNLOAD" -o "$NOM_PBF_FILE"
 fi fi
  
Zeile 87: Zeile 182:
 </code> </code>
  
-====Docker==== 
-Untested 
-<code> 
-docker run -it \ 
-  -e PBF_URL=https://download.geofabrik.de/europe/austria-latest.osm.pbf \ 
-  -e REPLICATION_URL=https://download.geofabrik.de/europe/austria-updates \ 
-  -e IMPORT_STYLE=full \ 
-  -p 8080:8080 \ 
-  --name nominatim-at \ 
-  -v nominatim-data:/var/lib/postgresql/16/main \ 
-  mediagis/nominatim:5.2 
-</code> 
  
-====Ubuntu 24.04==== 
-Untested 
-<code bash> 
-#!/usr/bin/env bash 
-set -euo pipefail 
  
-# ============================================================ 
-# Nominatim 5.2 + Austria import on Ubuntu 24.04 
-# ============================================================ 
  
-# ---- configurable values ---- 
-NOM_USER="nominatim" 
-NOM_HOME="/srv/nominatim" 
-NOM_VENV="/srv/nominatim-venv" 
-NOM_DATA_DIR="/srv/nominatim/data" 
-NOM_PROJECT_DIR="/srv/nominatim/project" 
-NOM_PBF_URL="https://download.geofabrik.de/europe/austria-latest.osm.pbf" 
-NOM_PBF_FILE="${NOM_DATA_DIR}/austria-latest.osm.pbf" 
- 
-# Geofabrik Austria updates 
-NOM_REPL_URL="https://download.geofabrik.de/europe/austria-updates" 
- 
-# API bind 
-NOM_BIND_ADDR="0.0.0.0" 
-NOM_BIND_PORT="8080" 
- 
-# Optional flatnode file: speeds/lower memory for bigger imports; for Austria optional. 
-USE_FLATNODE="false" 
-FLATNODE_FILE="${NOM_DATA_DIR}/flatnode.file" 
- 
-# Tune this to your RAM. 1-4G are sensible for Austria on smaller boxes. 
-IMPORT_THREADS="$(nproc)" 
-IMPORT_OSM2PGSQL_CACHE="2048" 
- 
-# PostgreSQL version installed by Ubuntu 24.04 
-PG_VERSION="16" 
- 
-# ---- sanity ---- 
-if [[ "$(id -u)" -ne 0 ]]; then 
-  echo "Run as root." 
-  exit 1 
-fi 
- 
-export DEBIAN_FRONTEND=noninteractive 
- 
-echo "[1/10] Installing OS packages..." 
-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 "[2/10] Creating service user and directories..." 
-id -u "${NOM_USER}" >/dev/null 2>&1 || useradd --system --create-home --home-dir "${NOM_HOME}" --shell /bin/bash "${NOM_USER}" 
- 
-mkdir -p "${NOM_HOME}" "${NOM_VENV}" "${NOM_DATA_DIR}" "${NOM_PROJECT_DIR}" 
-chown -R "${NOM_USER}:${NOM_USER}" "${NOM_HOME}" "${NOM_DATA_DIR}" "${NOM_PROJECT_DIR}" 
-chmod 755 "${NOM_HOME}" "${NOM_PROJECT_DIR}" 
- 
-echo "[3/10] Creating Python virtual environment..." 
-python3 -m venv "${NOM_VENV}" 
-"${NOM_VENV}/bin/pip" install --upgrade pip wheel setuptools 
-"${NOM_VENV}/bin/pip" install nominatim-db nominatim-api osmium gunicorn 
- 
-echo "[4/10] Writing project environment..." 
-cat > "${NOM_PROJECT_DIR}/.env" <<EOF 
-# Nominatim project settings 
-NOMINATIM_DATABASE_DSN=pgsql:dbname=nominatim 
-NOMINATIM_REPLICATION_URL=${NOM_REPL_URL} 
-NOMINATIM_REPLICATION_UPDATE_INTERVAL=86400 
-NOMINATIM_REPLICATION_RECHECK_INTERVAL=900 
-NOMINATIM_DEFAULT_LANGUAGE=de,en 
-EOF 
- 
-chown "${NOM_USER}:${NOM_USER}" "${NOM_PROJECT_DIR}/.env" 
-chmod 640 "${NOM_PROJECT_DIR}/.env" 
- 
-echo "[5/10] PostgreSQL tuning and setup..." 
-systemctl enable postgresql 
-systemctl restart postgresql 
- 
-PGCONF="/etc/postgresql/${PG_VERSION}/main/postgresql.conf" 
- 
-# Backup once 
-if [[ ! -f "${PGCONF}.bak-nominatim" ]]; then 
-  cp "${PGCONF}" "${PGCONF}.bak-nominatim" 
-fi 
- 
-# Conservative tuning for an Austria-only host. Adjust if you know your RAM. 
-sed -ri "s/^#?shared_buffers\s*=.*/shared_buffers = 2GB/" "${PGCONF}" 
-sed -ri "s/^#?maintenance_work_mem\s*=.*/maintenance_work_mem = 2GB/" "${PGCONF}" 
-sed -ri "s/^#?work_mem\s*=.*/work_mem = 32MB/" "${PGCONF}" 
-sed -ri "s/^#?max_wal_size\s*=.*/max_wal_size = 2GB/" "${PGCONF}" 
-sed -ri "s/^#?checkpoint_timeout\s*=.*/checkpoint_timeout = 60min/" "${PGCONF}" 
- 
-# Append settings if missing 
-grep -q "^synchronous_commit = off" "${PGCONF}" || echo "synchronous_commit = off" >> "${PGCONF}" 
-grep -q "^checkpoint_completion_target = 0.9" "${PGCONF}" || echo "checkpoint_completion_target = 0.9" >> "${PGCONF}" 
-grep -q "^random_page_cost = 1.0" "${PGCONF}" || echo "random_page_cost = 1.0" >> "${PGCONF}" 
- 
-systemctl restart postgresql 
- 
-# Create postgres user matching service user for peer auth. 
-sudo -u postgres psql -tAc "SELECT 1 FROM pg_roles WHERE rolname='${NOM_USER}'" | grep -q 1 || \ 
-  sudo -u postgres createuser -s "${NOM_USER}" 
- 
-sudo -u postgres psql -tAc "SELECT 1 FROM pg_database WHERE datname='nominatim'" | grep -q 1 || \ 
-  sudo -u postgres createdb -O "${NOM_USER}" nominatim 
- 
-sudo -u postgres psql -d nominatim -c "CREATE EXTENSION IF NOT EXISTS postgis;" 
-sudo -u postgres psql -d nominatim -c "CREATE EXTENSION IF NOT EXISTS hstore;" 
- 
-echo "[6/10] Downloading Austria extract..." 
-if [[ ! -f "${NOM_PBF_FILE}" ]]; then 
-  wget -O "${NOM_PBF_FILE}" "${NOM_PBF_URL}" 
-fi 
-chown "${NOM_USER}:${NOM_USER}" "${NOM_PBF_FILE}" 
- 
-echo "[7/10] Importing Austria data..." 
-IMPORT_CMD=( "${NOM_VENV}/bin/nominatim" import 
-  --project-dir "${NOM_PROJECT_DIR}" 
-  --osm-file "${NOM_PBF_FILE}" 
-  --threads "${IMPORT_THREADS}" 
-  --osm2pgsql-cache "${IMPORT_OSM2PGSQL_CACHE}" 
-) 
- 
-if [[ "${USE_FLATNODE}" == "true" ]]; then 
-  IMPORT_CMD+=( --flatnode-file "${FLATNODE_FILE}" ) 
-fi 
- 
-sudo -u "${NOM_USER}" "${IMPORT_CMD[@]}" 
- 
-echo "[8/10] Initializing replication..." 
-sudo -u "${NOM_USER}" "${NOM_VENV}/bin/nominatim" replication --project-dir "${NOM_PROJECT_DIR}" --init 
- 
-echo "[9/10] Creating API service..." 
-cat > /etc/systemd/system/nominatim-api.service <<EOF 
-[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}/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 
-ExecStart=${NOM_VENV}/bin/gunicorn -b ${NOM_BIND_ADDR}:${NOM_BIND_PORT} nominatim_api.server.falcon.server:run_wsgi 
-Restart=always 
-RestartSec=5 
- 
-[Install] 
-WantedBy=multi-user.target 
-EOF 
- 
-echo "[10/10] Creating replication service..." 
-cat > /etc/systemd/system/nominatim-replication.service <<EOF 
-[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}/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 
-ExecStart=${NOM_VENV}/bin/nominatim replication --project-dir ${NOM_PROJECT_DIR} 
-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 "Done." 
-echo "API should be reachable at:" 
-echo "  http://${NOM_BIND_ADDR}:${NOM_BIND_PORT}/search?q=Stephansplatz%20Wien&format=jsonv2" 
-echo 
-echo "Useful commands:" 
-echo "  systemctl status nominatim-api" 
-echo "  systemctl status nominatim-replication" 
-echo "  journalctl -u nominatim-api -f" 
-echo "  journalctl -u nominatim-replication -f" 
-</code> 
nominatim.1774736806.txt.gz · Zuletzt geändert: 2026/03/28 23:26 von admin