Sim, existe uma maneira melhor. Você precisa usar um índice espacial . Esses índices organizam metadados sobre geometrias para filtrar geometrias distantes muito rapidamente, economizando muitos ciclos de CPU, evitando os cálculos que você descreve. Você não deve se preocupar em implementar um, pois todos os principais bancos de dados relacionais fornecem um tipo de geometria espacial e índices para acompanhá-los.
O que você deseja examinar são consultas "à distância" (consultas para geometrias a uma certa distância de outra geometria). Estes são muito padrão e muito um problema resolvido e são possíveis em todos os bancos de dados acima (e incorporados em vários):
- PostGIS:
ST_DWithin
- SQL Server:
STDistance
(Não está claro que o uso de índice na versão geográfica 3D dessa função é suportada)
- Oracle:
SDO_WITHIN_DISTANCE
(isso não diz explicitamente que ele acionará o uso do índice. Eu daria uma checada no plano de consulta. Pode ser necessário aplicar um SDO_FILTER
para fazê-lo usar o índice.)
- MySQL: Ainda estou descobrindo isso.
Solução alternativa para acionar o uso do índice
No pior caso onde você tem problemas para obter o sistema para usar o índice espacial com estas consultas, você pode adicionar um filtro adicional. Você criaria uma caixa delimitadora quadrada com lados de comprimento 2 * (distância de pesquisa) centralizada no ponto de pesquisa e compararia as caixas delimitadoras das geometrias da tabela com essa antes de verificar a distância real. É o que o PostGIS ' ST_DWithin
acima faz internamente de qualquer maneira.
Distância em SIG
Embora os índices espaciais sejam fantásticos e absolutamente a solução certa para o seu problema, o cálculo da distância pode ser logicamente complicado. Em particular, você precisa se preocupar com em qual projeção (basicamente todos os parâmetros do sistema de coordenadas) seus dados são armazenados. A maioria das projeções 2D (outras coisas que não os sistemas de coordenadas angulares, como as várias projeções latinas / longas) distorcem significativamente o comprimento. Por exemplo, a projeção Web Mercator (usada pelo Google, Bing e todos os principais fornecedores de mapas de base) expande áreas e distâncias cada vez mais à medida que a localização se afasta do do equador . Posso estar errado, pois não sou formalmente formado em SIG, mas o melhor que já vi para projeções em 2D são algumas específicas que prometem distâncias corretas de umponto único e constante em todo o mundo. (Não, não é prático usar uma projeção diferente para cada consulta; isso tornaria seus índices inúteis.)
A linha inferior é que você precisa ter certeza de que sua matemática está correta. A maneira mais simples de fazer isso da perspectiva do desenvolvimento é usar projeções angulares (geralmente chamadas de "geográficas") e funções que suportam a matemática usando um modelo de esferóide, mas esses cálculos são um pouco mais caros do que os equivalentes 2D e alguns bancos de dados podem não suportar a indexação deles. Se você pode obter um desempenho aceitável usando-os, esse provavelmente é o caminho a percorrer. Outra opção comum são as projeções regionais (como zonas UTM) que obtêm distâncias e áreas muito próximas da correção, se seus dados estiverem confinados a uma parte específica do mundo. O melhor para o seu aplicativo dependerá de seus requisitos específicos,
Isso se aplica mesmo se você não usar índices espaciais incorporados. Seus dados têm alguma projeção, independentemente de qual tecnologia ou técnica você está usando ou usa no futuro, e já está afetando as consultas e cálculos que você está fazendo no momento.