Consulta geográfica / espacial
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 almacena los datos geográficos en el tipo SDO_GEOMETRY; se requieren una entrada en USER_SDO_GEOM_METADATA y un índice espacial. Operadores como SDO_WITHIN_DISTANCE, SDO_RELATE y SDO_NN resuelven consultas de distancia/intersección/vecino más cercano. SRID 4326 es el sistema WGS84 (latitud/longitud).
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 convierte PostgreSQL en una base de datos espacial completa. Proporciona los tipos geometry (plano) y geography (esférico) y cientos de funciones ST_ como ST_Distance/ST_DWithin/ST_Intersects/ST_Contains. Un índice GiST/SP-GiST acelera las consultas espaciales.
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+) admite tipos de datos espaciales conformes con OGC (POINT, POLYGON, etc.) y funciones ST_. Un índice SPATIAL (R-tree) solo se puede crear en InnoDB/MyISAM y sobre columnas NOT NULL; para que el optimizador lo use, la columna debe definirse con un atributo SRID (SRID 4326). Con SRID 4326, ST_Distance devuelve la distancia geodésica en metros. Con POINT(x, y) + ST_SRID, x es la longitud e y la latitud; para entrada WKT (ST_GeomFromText) con SRID 4326 el orden es latitud-longitud.
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 ofrece dos tipos espaciales: geography (esférico, latitud/longitud) y geometry (plano). Métodos como STDistance, STIntersects y STContains resuelven las consultas. Un índice espacial (basado en cuadrícula) mejora el rendimiento. Tenga en cuenta el orden de los argumentos de 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 almacena los datos geográficos en formato GeoJSON y ejecuta consultas esféricas con un índice 2dsphere. Se admiten los operadores $near (ordenado por distancia), $geoWithin (dentro de un área) y $geoIntersects. Las coordenadas van en el orden [longitud, latitud]; $maxDistance está en metros.
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 almacena ubicaciones geográficas en un sorted set con GEOADD (longitude latitude member). GEOSEARCH (Redis 6.2+, que sustituye al antiguo GEORADIUS) devuelve los miembros dentro de un radio o rectángulo, ordenados por distancia. GEODIST da la distancia entre dos puntos. Es una función básica; no se necesita ningún módulo.
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 admite los tipos de campo geo_point (punto) y geo_shape (polígono/línea). El filtrado se hace con las consultas geo_distance (radio), geo_bounding_box (rectángulo) y geo_polygon; la ordenación con geo_distance y la agregación con geohash_grid/geotile_grid. Las coordenadas se indican como lat/lon o como un array [lon, lat].