Entfernung und nächste Nachbarn
Finden Sie heraus, was in der Nähe liegt
Entfernung und nächste Nachbarn ist eine kostenlose SQL Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des SQL Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.
Was ist eine räumliche Entfernung?
In Geodatenbanken ist die Entfernung der gemessene Abstand zwischen zwei geografischen Orten. PostGIS stellt leistungsfähige Funktionen bereit, um Entfernungen zwischen Punkten, Linien, Polygonen und anderen Geometrietypen zu berechnen.
Wenn Sie Entfernungsabfragen verstehen, können Sie Fragen beantworten wie: Welches Restaurant ist mir am nächsten? oder Welche Kunden befinden sich im Umkreis von 5 km um unser Lager?
Die Funktion ST_Distance
ST_Distance(geom_a, geom_b) gibt die minimale Entfernung zwischen zwei Geometrieobjekten zurück. Bei Verwendung gewöhnlicher geometry-Typen wird das Ergebnis standardmäßig in den Einheiten des Koordinatenreferenzsystems zurückgegeben (bei EPSG:4326 normalerweise in Grad).
Für aussagekräftige Ergebnisse in Metern sollten Sie geography-Typen verwenden oder Ihre Daten neu projizieren.
SELECT ST_Distance(
ST_MakePoint(28.9784, 41.0082)::geography,
ST_MakePoint(29.0100, 41.0200)::geography
) AS distance_meters;Eine Beispieltabelle einrichten
Lassen Sie uns eine einfache Tabelle mit Orten und geografischen Koordinaten erstellen. Wir verwenden den Typ geography, damit alle Entfernungsberechnungen automatisch Meter zurückgeben – ohne dass eine manuelle Projektion erforderlich ist.
Diese Tabelle enthält Cafés in einer Stadt, jeweils mit einem Namen und einem als Punkt gespeicherten Standort.
CREATE TABLE cafes (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
location GEOGRAPHY(Point, 4326)
);
INSERT INTO cafes (name, location) VALUES
('Cafe Alpha', ST_MakePoint(28.9784, 41.0082)::geography),
('Cafe Beta', ST_MakePoint(28.9900, 41.0150)::geography),
('Cafe Gamma', ST_MakePoint(29.0100, 41.0200)::geography),
('Cafe Delta', ST_MakePoint(28.9650, 40.9980)::geography),
('Cafe Epsilon', ST_MakePoint(29.0250, 41.0350)::geography);Die Entfernung von einem festen Punkt ermitteln
Sobald Sie Standortdaten haben, können Sie die Entfernung jeder Zeile zu einem Referenzpunkt berechnen. Hier ermitteln wir, wie weit jedes Café von einer Person entfernt ist, die sich an den Koordinaten (28.9800, 41.0100) befindet.
Das Ergebnis wird in Metern angegeben, weil wir den geography-Typ verwendet haben.
SELECT
name,
ROUND(
ST_Distance(
location,
ST_MakePoint(28.9800, 41.0100)::geography
)::NUMERIC
) AS distance_m
FROM cafes
ORDER BY distance_m;Den nächsten Nachbarn finden
Um den einzigen nächstgelegenen Standort zu einem bestimmten Punkt zu finden, sortieren Sie nach der Entfernung und übernehmen mit LIMIT 1 nur eine Zeile. Dies ist die klassische Nearest-Neighbor-Abfrage.
Dieses Muster ist in standortbezogenen Anwendungen äußerst verbreitet: etwa zum Finden des nächsten Geschäfts, Arztes oder einer Haltestelle.
SELECT
name,
ROUND(
ST_Distance(
location,
ST_MakePoint(28.9800, 41.0100)::geography
)::NUMERIC
) AS distance_m
FROM cafes
ORDER BY location <-> ST_MakePoint(28.9800, 41.0100)::geography
LIMIT 1;Der <->-Operator für den nächsten Nachbarn
PostGIS stellt den Operator <-> (KNN – K Nearest Neighbors) bereit, der den Index nutzt. Im Gegensatz zu ST_Distance in einer ORDER BY-Klausel kann <-> einen räumlichen GiST-Index verwenden und so vermeiden, jede Zeile zu durchsuchen.
Verwenden Sie in ORDER BY immer bevorzugt <->, wenn Sie die nächsten Nachbarn effizient benötigen. Erstellen Sie zur Unterstützung einen Index wie diesen:
CREATE INDEX ON cafes USING GIST (location);
SELECT
name,
ROUND(
ST_Distance(
location,
ST_MakePoint(28.9800, 41.0100)::geography
)::NUMERIC
) AS distance_m
FROM cafes
ORDER BY location <-> ST_MakePoint(28.9800, 41.0100)::geography
LIMIT 5;Nach Entfernung filtern (ST_DWithin)
ST_DWithin(geom_a, geom_b, distance) gibt TRUE zurück, wenn zwei Geometrien höchstens den angegebenen Abstand voneinander entfernt sind. Bei geography-Typen wird die Entfernung in Metern angegeben.
Das ist effizienter als ST_Distance(...) < radius in einer WHERE-Klausel, weil ST_DWithin den Index nutzt und die Prüfung beendet, sobald die Bedingung erfüllt ist.
SELECT
name,
ROUND(
ST_Distance(
location,
ST_MakePoint(28.9800, 41.0100)::geography
)::NUMERIC
) AS distance_m
FROM cafes
WHERE ST_DWithin(
location,
ST_MakePoint(28.9800, 41.0100)::geography,
2000
)
ORDER BY distance_m;Die nächsten Top-N mit Radiusbegrenzung
Ein häufig verwendetes Muster in Produktionssystemen kombiniert ST_DWithin als Vorfilter mit der Sortierung nach <->. Die Prüfung mit ST_DWithin verwendet den räumlichen Index, um weit entfernte Zeilen schnell auszusortieren. Anschließend werden die verbleibenden Kandidaten nach der exakten Entfernung sortiert.
So erhalten Sie äußerst effizient die N nächstgelegenen Standorte innerhalb eines maximalen Radius.
SELECT
name,
ROUND(
ST_Distance(
location,
ST_MakePoint(28.9800, 41.0100)::geography
)::NUMERIC
) AS distance_m
FROM cafes
WHERE ST_DWithin(
location,
ST_MakePoint(28.9800, 41.0100)::geography,
5000
)
ORDER BY location <-> ST_MakePoint(28.9800, 41.0100)::geography
LIMIT 3;Entfernung zwischen zwei Tabellen (tabellenübergreifend)
Sie können Entfernungen zwischen Zeilen in zwei verschiedenen Tabellen berechnen, indem Sie einen JOIN mit ST_Distance kombinieren. Das ist beispielsweise nützlich, um jedem Kunden das nächstgelegene Lager oder jedem Vorfall das nächstgelegene Krankenhaus zuzuordnen.
Im Folgenden ermitteln wir mithilfe eines LATERAL JOIN das nächstgelegene Café für jeden Benutzer in einer users-Tabelle – ein leistungsfähiges PostgreSQL-Muster für Unterabfragen pro Zeile.
SELECT
u.username,
c.name AS nearest_cafe,
ROUND(ST_Distance(u.location, c.location)::NUMERIC) AS distance_m
FROM (
VALUES
('alice', ST_MakePoint(28.9810, 41.0095)::geography),
('bob', ST_MakePoint(29.0200, 41.0300)::geography)
) AS u(username, location)
CROSS JOIN LATERAL (
SELECT name, location
FROM cafes
ORDER BY location <-> u.location
LIMIT 1
) c;Entfernungen formatieren
Rohe Entfernungen in Metern können schwer lesbar sein. Sie können sie als Kilometer formatieren oder mithilfe von CASE-Ausdrücken und Zeichenkettenformatierung um benutzerfreundliche Bezeichnungen ergänzen. Die folgende Abfrage gibt kurze Entfernungen in Metern und längere Entfernungen in Kilometern aus.
SELECT
name,
CASE
WHEN ST_Distance(location, ST_MakePoint(28.9800, 41.0100)::geography) < 1000
THEN ROUND(ST_Distance(location, ST_MakePoint(28.9800, 41.0100)::geography)::NUMERIC)
|| ' m'
ELSE ROUND((ST_Distance(location, ST_MakePoint(28.9800, 41.0100)::geography) / 1000.0)::NUMERIC, 2)
|| ' km'
END AS formatted_distance
FROM cafes
ORDER BY location <-> ST_MakePoint(28.9800, 41.0100)::geography;Einen Rang nach Entfernung vergeben
Fensterfunktionen wie RANK() und ROW_NUMBER() eignen sich hervorragend für Entfernungsabfragen. Sie können jedem Standort relativ zu einem Benutzer einen Rang nach Nähe zuweisen. Das ist nützlich, um nach Rang geordnete Empfehlungslisten oder nach Nähe sortierte Suchergebnisse zu erstellen.
SELECT
name,
ROUND(
ST_Distance(
location,
ST_MakePoint(28.9800, 41.0100)::geography
)::NUMERIC
) AS distance_m,
ROW_NUMBER() OVER (
ORDER BY location <-> ST_MakePoint(28.9800, 41.0100)::geography
) AS proximity_rank
FROM cafes;Wissenscheck
Testen Sie Ihr Verständnis von Entfernungsabfragen und Nearest-Neighbor-Suchen in PostGIS.
Zusammenfassung der Lektion
In dieser Lektion haben Sie gelernt, wie Sie mit räumlichen Entfernungen und Nearest-Neighbor-Abfragen in PostGIS arbeiten:
- ST_Distance berechnet die exakte Entfernung zwischen zwei Geometrien. Verwenden Sie den Typ geography, um automatisch Ergebnisse in Metern zu erhalten.
- ST_DWithin filtert mithilfe des räumlichen Index effizient Zeilen innerhalb eines Radius. Verwenden Sie die Funktion in WHERE-Klauseln bevorzugt gegenüber
ST_Distance < radius. - Der <->-Operator (KNN) in ORDER BY nutzt den Index und ist der schnellste Weg, die nächsten N Nachbarn abzurufen.
- Kombinieren Sie
ST_DWithinals Vorfilter mit der Sortierung nach<->, um möglichst effiziente Abfragen für die Top-N innerhalb eines Radius zu erstellen. - CROSS JOIN LATERAL ermöglicht es Ihnen, für jede Zeile den nächsten Treffer aus einer anderen Tabelle zu finden.
- Fensterfunktionen wie
ROW_NUMBER()können Ihren nach Entfernung sortierten Ergebnissen Rangnummern nach Nähe zuweisen.
Diese Muster bilden die Grundlage für standortbezogene Funktionen in realen Anwendungen.
Häufig gestellte Fragen
Ist die Lektion „Entfernung und nächste Nachbarn“ kostenlos?
Ja — der vollständige Text von „Entfernung und nächste Nachbarn“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des SQL Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Entfernung und nächste Nachbarn“?
Finden Sie heraus, was in der Nähe liegt Du übst SQL Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um SQL Academy zu starten?
Keine Vorkenntnisse erforderlich. SQL Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „Entfernung und nächste Nachbarn“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser SQL Academy-Lektion Code schreiben und ausführen?
Ja. Jede SQL Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Räumliche Datentypen
- Entfernung und nächste Nachbarn
- Räumliche Joins und Enthaltensein
- Räumliche Indizes (GiST)