1. O Erro Fundamental da Suposição Retangular
Em um mapa 2D (como Mercator), a Terra parece um retângulo plano com latitude de -90° a +90° e longitude de -180° a +180°.
Muitos tutoriais sugerem gerar coordenadas com matemática plana simples:
// ❌ Naive algorithm (Suffers from polar bias bug) const latitude = (Math.random() * 180) - 90; const longitude = (Math.random() * 360) - 180;
Embora gere números válidos, esse código assume que todas as faixas têm a mesma área física. Em uma esfera, a circunferência diminui com o cosseno da latitude:
No equador (0°), a circunferência é de 40.075 km. A 80° Norte, encolhe para 6.950 km. O algoritmo plano concentra 5,7 vezes mais pontos nos polos do que no equador!
2. A Transformação Esférica de Área Igual de Marsaglia
Para gerar pontos uniformemente distribuídos na esfera, a densidade deve ser proporcional ao elemento diferencial de área:
Como o elemento de área é proporcional a d(sin θ), escolhemos sin(θ) uniformemente no intervalo [-1, 1]:
// ✅ Correct Archimedes-Lambert-Marsaglia equal-area algorithm:
function getRandomSpherePoint() {
const u = Math.random(); // Uniform in [0, 1)
const v = Math.random(); // Uniform in [0, 1)
// Invert the cumulative distribution function:
const sinLat = 2 * u - 1; // Uniform in [-1, 1]
const latRad = Math.asin(sinLat); // In radians
const lat = latRad * (180 / Math.PI); // In degrees [-90, +90]
const lng = -180 + v * 360; // In degrees [-180, +180]
return { lat, lng };
}Essa transformação matemática garante que cada quilômetro quadrado na Terra tenha exatamente a mesma probabilidade de ser escolhido.
3. Amostragem por Rejeição Terrestre e Reprodutibilidade PRNG
Cerca de 71% da Terra é oceano. Quando o usuário seleciona apenas terra firme, utilizamos amostragem por rejeição:
- Gerar um ponto esférico de área igual.
- Testar contra polígonos e vetores continentais.
- Se cair no oceano, descartar e regenerar com até 250 tentativas.
Para garantir reprodutibilidade, combinamos hash cyrb53 de 53 bits com PRNG mulberry32 de 32 bits, assegurando resultados 100% determinísticos.