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';O Oracle Spatial armazena dados geográficos no tipo SDO_GEOMETRY; são necessários uma entrada em USER_SDO_GEOM_METADATA e um índice espacial. Operadores como SDO_WITHIN_DISTANCE, SDO_RELATE e SDO_NN respondem a consultas de distância/interseção/vizinho mais próximo. O SRID 4326 é o sistema WGS84 (latitude/longitude).
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);O PostGIS transforma o PostgreSQL em um banco de dados espacial completo. Fornece os tipos geometry (plano) e geography (esférico) e centenas de funções ST_, como ST_Distance/ST_DWithin/ST_Intersects/ST_Contains. Um índice GiST/SP-GiST acelera as consultas espaciais.
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;O MySQL (5.7+) suporta tipos de dados espaciais compatíveis com OGC (POINT, POLYGON etc.) e funções ST_. Um índice SPATIAL (R-tree) só pode ser criado em InnoDB/MyISAM e em colunas NOT NULL; para que o otimizador o use, a coluna deve ser definida com um atributo SRID (SRID 4326). Com SRID 4326, ST_Distance retorna a distância geodésica em metros. Com POINT(x, y) + ST_SRID, x é a longitude e y é a latitude; para entrada WKT (ST_GeomFromText) com SRID 4326, a ordem é latitude-longitude.
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;O SQL Server oferece dois tipos espaciais: geography (esférico, latitude/longitude) e geometry (plano). Métodos como STDistance, STIntersects e STContains respondem às consultas. Um índice espacial (baseado em grade) melhora o desempenho. Atenção à ordem dos 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
}
}
})O MongoDB armazena dados geográficos no formato GeoJSON e executa consultas esféricas com um índice 2dsphere. Os operadores $near (ordenado por distância), $geoWithin (dentro de uma área) e $geoIntersects são suportados. As coordenadas ficam na ordem [longitude, latitude]; $maxDistance está em 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 ASCO Redis armazena localizações geográficas em um sorted set com GEOADD (longitude latitude member). GEOSEARCH (Redis 6.2+, substituindo o antigo GEORADIUS) retorna os membros dentro de um raio ou retângulo, ordenados por distância. GEODIST fornece a distância entre dois pontos. É um recurso core; não é necessário 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 } } } }O Elasticsearch suporta os tipos de campo geo_point (ponto) e geo_shape (polígono/linha). A filtragem é feita com as consultas geo_distance (raio), geo_bounding_box (retângulo) e geo_polygon; a ordenação com geo_distance, e a agregação com geohash_grid/geotile_grid. As coordenadas são informadas como lat/lon ou como um array [lon, lat].