Геолокация и карты в JavaScript (Node.js): полный гайд по библиотекам и инструментам
Работа с географическими данными и картами — одна из ключевых задач современных веб-приложений. На платформе Node.js существует множество библиотек, которые позволяют не только отображать карты на клиенте, но и выполнять сложную серверную обработку геоданных: геокодирование, обратное геокодирование, вычисление расстояний, построение маршрутов и анализ геометрий.
В этой статье мы рассмотрим основные библиотеки для работы с геолокацией и картами в экосистеме JavaScript (Node.js), приведём примеры кода и дадим рекомендации по выбору инструмента под конкретные задачи.
1. Leaflet — интерактивные карты на клиенте
Leaflet — это лёгкая, но мощная JavaScript-библиотека для создания интерактивных карт. Она работает на стороне браузера, но отлично интегрируется с Node.js через сборщики (Webpack, Vite) или как часть SSR-приложений.
Основные возможности:
- Поддержка тайловых слоёв (OpenStreetMap, Mapbox, Google Maps и др.);
- Маркеры, всплывающие окна, полигоны, линии;
- Обработка событий (клик, перемещение, зум);
- Плагины для кластеризации, heatmap, поиска.
Пример подключения и отображения карты с маркером:
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
</head>
<body>
<div id="map" style="height: 400px;"></div>
<script>
const map = L.map('map').setView([55.7558, 37.6173], 10);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap contributors'
}).addTo(map);
L.marker([55.7558, 37.6173]).addTo(map)
.bindPopup('Москва, Кремль')
.openPopup();
</script>
</body>
</html>
Leaflet идеально подходит для фронтенда, но если вам нужна серверная генерация карт (например, для печати или статических изображений), используйте leaflet-headless или связку с Puppeteer.
2. node-geocoder — геокодирование и обратное геокодирование
node-geocoder — универсальная библиотека для преобразования адресов в координаты и наоборот. Поддерживает множество провайдеров: Google, OpenStreetMap (Nominatim), Yandex, Here и другие.
Установка:
npm install node-geocoder
Пример использования с OpenStreetMap:
const NodeGeocoder = require('node-geocoder');
const options = {
provider: 'openstreetmap',
language: 'ru'
};
const geocoder = NodeGeocoder(options);
// Прямое геокодирование (адрес → координаты)
geocoder.geocode('Красная площадь, Москва')
.then(res => {
console.log('Координаты:', res[0].latitude, res[0].longitude);
})
.catch(err => console.error(err));
// Обратное геокодирование (координаты → адрес)
geocoder.reverse({ lat: 55.7558, lon: 37.6173 })
.then(res => {
console.log('Адрес:', res[0].formattedAddress);
})
.catch(err => console.error(err));
Библиотека автоматически обрабатывает лимиты запросов и поддерживает кэширование. Рекомендуется для серверных приложений, где нужно конвертировать пользовательские данные.
3. Turf.js — геоаналитика и пространственные операции
Turf.js — это библиотека для геопространственного анализа. Работает как в браузере, так и в Node.js. Включает более 150 модулей для работы с GeoJSON.
Основные возможности:
- Вычисление расстояний (Haversine, Vincenty);
- Поиск пересечений, объединений, буферов;
- Кластеризация точек;
- Генерация случайных точек, сеток, изолиний.
Пример расчёта расстояния между двумя точками:
const turf = require('@turf/turf');
const from = turf.point([37.6173, 55