Para lidar com essa situação de maneira eficiente, a melhor abordagem é utilizar índices R-tree, que são estruturas de dados otimizadas para consultas espaciais, como a busca de pontos mais próximos. No entanto, a maneira mais prática e performática de fazer isso é utilizar uma base de dados geográfica especializada, como o PostGIS.
Com o PostGIS, você pode armazenar suas cidades com suas coordenadas geográficas e, em seguida, realizar consultas espaciais extremamente eficientes usando SQL. Um exemplo de consulta que encontra a cidade mais próxima de uma determinada coordenada seria algo assim:
SELECT name, ST_Distance(geog::geography, ST_MakePoint(lon, lat)::geography) AS distance
FROM cities
ORDER BY distance
LIMIT 1;
Nesse caso, geog seria uma coluna que contém os pontos geográficos das cidades. O ST_MakePoint cria um ponto a partir das coordenadas fornecidas, e o ST_Distance calcula a distância entre esse ponto e as cidades armazenadas. Essa consulta além de ser trivial é otimizada automaticamente pela indexação espacial!
Portanto, a melhor solução é evitar tentar implementar isso em Node.js e, ao invés disso, confiar em uma base de dados que já é otimizada para esse tipo de operação, como o PostGIS ou outras solucões similares!