← Voltar para 11. Espaciais & Geográficos
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();