11. Espaciais & Geográficos
POINT / DECIMAL(10,8) (Coordenadas GPS)
Armazenamento de coordenadas geográficas (Latitude e Longitude) para mapas e cálculo de distância.
💾 Espaço em Disco: DECIMAL(10,8) + DECIMAL(11,8): 11 Bytes | POINT: 25 Bytes
📏 Limites: Latitude: -90.00000000 a +90.00000000 | Longitude: -180.00000000 a +180.00000000
Você tem duas abordagens excelentes para guardar localização GPS: 1) Duas colunas separadas `latitude DECIMAL(10, 8)` e `longitude DECIMAL(11, 8)`, que é simples, universal e funciona em 100% dos bancos e ORMs; ou 2) O tipo espacial `POINT` com `SPATIAL INDEX`, ideal quando você precisa calcular raio de distância em tempo real (`ST_Distance_Sphere`) para apps de entrega.
✅ Quando Usar
- •Endereços de lojas, restaurantes ou clientes para exibir pino no Google Maps / Leaflet (`DECIMAL(10,8)` e `DECIMAL(11,8)`).
- •Busca geoespacial "encontrar lojas num raio de 5 km" usando `POINT` e `ST_Distance_Sphere`.
🚫 Quando NÃO Usar
- •Não use `FLOAT` para coordenadas GPS precisas, pois perde precisão nas últimas casas decimais.
📐 Configuração no DrawDB
- Type:
- DECIMAL (10,8 e 11,8) ou POINT
- Size / Values:
- 10,8 (para latitude) e 11,8 (para longitude)
- Default:
- NULL
MySQL / MariaDB
DECIMAL(10, 8) / POINT SRID 4326
PostgreSQL
NUMERIC(10, 8) / PostGIS GEOGRAPHY(POINT, 4326)
SQLite
REAL / NUMERIC
🗄️ SQL DDL (Pronto para Importar no DrawDB)
CREATE TABLE filiais (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
latitude DECIMAL(10, 8) NOT NULL COMMENT 'De -90 a +90',
longitude DECIMAL(11, 8) NOT NULL COMMENT 'De -180 a +180'
);
🐘 Exemplo Prático em PHP 8 + PDO
<?php
declare(strict_types=1);
$lat = -23.561414;
$lng = -46.655881;
if ($lat < -90 || $lat > 90 || $lng < -180 || $lng > 180) {
throw new RangeException('Coordenadas GPS fora dos limites terrestres.');
}
$stmt = $pdo->prepare('
INSERT INTO filiais (nome, latitude, longitude)
VALUES (:nome, :lat, :lng)
');
$stmt->bindValue(':nome', 'Filial Avenida Paulista', PDO::PARAM_STR);
$stmt->bindValue(':lat', number_format($lat, 8, '.', ''), PDO::PARAM_STR);
$stmt->bindValue(':lng', number_format($lng, 8, '.', ''), PDO::PARAM_STR);
$stmt->execute();