Geografische / räumliche Abfrage
Oracle
-- Oracle Spatial: SDO_GEOMETRY column and spatial index
CREATE INDEX location_sidx ON shop(location)
INDEXTYPE IS MDSYS.SPATIAL_INDEX;
-- Shops within 5 km:
SELECT name FROM shop
WHERE SDO_WITHIN_DISTANCE(location,
SDO_GEOMETRY(2001, 4326,
SDO_POINT_TYPE(32.85, 39.92, NULL), NULL, NULL),
'distance=5 unit=KM') = 'TRUE';Oracle Spatial speichert Geodaten im Typ SDO_GEOMETRY; ein Eintrag in USER_SDO_GEOM_METADATA und ein Spatial Index sind erforderlich. Operatoren wie SDO_WITHIN_DISTANCE, SDO_RELATE und SDO_NN beantworten Distanz-, Schnitt- und Nearest-Neighbor-Abfragen. SRID 4326 ist das WGS84-System (Breite/Länge).
PostgreSQL
-- PostGIS extension:
CREATE EXTENSION IF NOT EXISTS postgis;
CREATE INDEX location_gix ON shop USING GIST (location);
-- Shops within 5 km (geography, meters):
SELECT name FROM shop
WHERE ST_DWithin(location,
ST_SetSRID(ST_MakePoint(32.85, 39.92), 4326)::geography,
5000);PostGIS macht PostgreSQL zu einer vollwertigen räumlichen Datenbank. Es bietet die Typen geometry (planar) und geography (sphärisch) sowie Hunderte ST_-Funktionen wie ST_Distance/ST_DWithin/ST_Intersects/ST_Contains. Ein GiST-/SP-GiST-Index beschleunigt räumliche Abfragen.
MySQL
-- Spatial column (with SRID) and SPATIAL index:
ALTER TABLE shop MODIFY location POINT NOT NULL SRID 4326;
ALTER TABLE shop ADD SPATIAL INDEX (location);
-- Compute distance (meters, geography):
SELECT name,
ST_Distance(location,
ST_SRID(POINT(32.85, 39.92), 4326)) AS distance
FROM shop
ORDER BY distance LIMIT 10;MySQL (5.7+) unterstützt OGC-konforme räumliche Datentypen (POINT, POLYGON usw.) und ST_-Funktionen. Ein SPATIAL-Index (R-Tree) lässt sich nur unter InnoDB/MyISAM und auf NOT NULL-Spalten anlegen; damit der Optimizer ihn nutzt, muss die Spalte mit einem SRID-Attribut definiert sein (SRID 4326). Mit SRID 4326 liefert ST_Distance die geodätische Distanz in Metern. Bei POINT(x, y) + ST_SRID ist x der Längengrad und y der Breitengrad; bei WKT-Eingabe (ST_GeomFromText) mit SRID 4326 lautet die Reihenfolge Breite-Länge.
SQL Server
-- geography type and spatial index:
CREATE SPATIAL INDEX location_sidx ON dbo.shop(location);
-- Shops within 5 km (STDistance returns meters):
SELECT name FROM dbo.shop
WHERE location.STDistance(
geography::Point(39.92, 32.85, 4326)) <= 5000;SQL Server bietet zwei räumliche Typen: geography (sphärisch, Breite/Länge) und geometry (planar). Methoden wie STDistance, STIntersects und STContains beantworten die Abfragen. Ein Spatial Index (rasterbasiert) verbessert die Performance. Beachte die Argumentreihenfolge von geography::Point(latitude, longitude, SRID).
MongoDB
// 2dsphere index (for GeoJSON):
db.shop.createIndex({ location: "2dsphere" })
// Shops nearest to a given point ($near):
db.shop.find({
location: {
$near: {
$geometry: { type: "Point", coordinates: [32.85, 39.92] },
$maxDistance: 5000
}
}
})MongoDB speichert Geodaten im GeoJSON-Format und führt sphärische Abfragen mit einem 2dsphere-Index aus. Die Operatoren $near (nach Distanz sortiert), $geoWithin (innerhalb eines Gebiets) und $geoIntersects werden unterstützt. Koordinaten stehen in der Reihenfolge [longitude, latitude]; $maxDistance ist in Metern.
Redis
# Built-in geospatial commands (built on sorted sets):
GEOADD shops 32.85 39.92 "kizilay"
GEOADD shops 32.86 39.93 "cankaya"
# Search within 5 km of a point:
GEOSEARCH shops FROMLONLAT 32.85 39.92
BYRADIUS 5 km ASCRedis speichert geografische Positionen mit GEOADD (longitude latitude member) in einem Sorted Set. GEOSEARCH (Redis 6.2+, ersetzt das ältere GEORADIUS) liefert die Mitglieder innerhalb eines Radius oder Rechtecks, nach Distanz sortiert. GEODIST liefert die Distanz zwischen zwei Punkten. Dies ist eine Kernfunktion; ein Modul ist nicht nötig.
Elasticsearch
# Map the field as geo_point:
PUT shop
{ "mappings": { "properties": { "location": { "type": "geo_point" } } } }
# Query within 5 km:
GET shop/_search
{ "query": { "geo_distance": {
"distance": "5km",
"location": { "lat": 39.92, "lon": 32.85 } } } }Elasticsearch unterstützt die Feldtypen geo_point (Punkt) und geo_shape (Polygon/Linie). Gefiltert wird mit den Abfragen geo_distance (Radius), geo_bounding_box (Rechteck) und geo_polygon, sortiert mit geo_distance, aggregiert mit geohash_grid/geotile_grid. Koordinaten werden als lat/lon oder als Array [lon, lat] angegeben.