Геолокация и карты в Rust: обзор библиотек и практические примеры
Rust — язык системного программирования, который набирает популярность в областях, требующих высокой производительности и безопасности. Работа с геоданными не исключение. Если вы разрабатываете сервис для трекинга транспорта, геоинформационную систему или просто хотите добавить на сайт интерактивную карту, экосистема Rust предлагает несколько зрелых решений. В этой статье мы разберем ключевые библиотеки для геолокации и отображения карт, а также приведем практические примеры кода.
1. Библиотека geo — основа геометрических вычислений
Библиотека geo (crate geo-types и geo) предоставляет базовые типы данных: точки, линии, полигоны, а также алгоритмы для работы с ними. Она является фундаментом для многих других гео-крейтов.
// cargo add geo-types geo
use geo_types::{Point, LineString, Polygon};
use geo::algorithm::haversine_distance;
fn main() {
let moscow = Point::new(37.6173, 55.7558);
let spb = Point::new(30.3351, 60.0);
// Расстояние по гаверсинусу (в метрах)
let dist = haversine_distance(&moscow, &spb);
println!("Расстояние Москва — СПб: {:.0} км", dist / 1000.0);
// Создание полигона
let coords = vec![
(37.0, 55.0), (38.0, 55.0), (38.0, 56.0), (37.0, 56.0), (37.0, 55.0),
];
let polygon = Polygon::new(
LineString::from(coords),
vec![],
);
println!("Площадь полигона: {:?}", polygon.unsigned_area());
}
Возможности:
- Типы: Point, Line, LineString, Polygon, MultiPoint, GeometryCollection
- Алгоритмы: расстояние Гаверсинуса, Винсенти, площадь, центроид, буферизация, пересечения
- Сериализация через serde (совместимость с GeoJSON)
2. geoutils — работа с GPS и форматами данных
Крейт geoutils специализируется на парсинге и валидации GPS-данных. Он умеет читать NMEA-строки (стандартный протокол GPS-приемников) и конвертировать координаты.
// cargo add geoutils
use geoutils::{Location, Distance};
fn main() {
// Создание точки из широты/долготы
let point_a = Location::new(55.7558, 37.6173).unwrap();
let point_b = Location::new(59.9343, 30.3351).unwrap();
// Расстояние по гаверсинусу
let dist = point_a.distance_to(&point_b).unwrap();
println!("Расстояние: {} км", dist.as_kilometers());
// Парсинг NMEA-строки (пример)
let nmea = "$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47";
if let Ok(loc) = Location::from_nmea(nmea) {
println!("Парсинг NMEA: {:?}", loc);
}
}
Особенности:
- Парсинг NMEA-0183 (GPGGA, GPRMC)
- Поддержка форматов: DMS (градусы/минуты/секунды), десятичные градусы
- Конвертация между системами координат (WGS84, UTM)
3. mapbox-gl-native-rs — рендеринг карт на Rust
Для отображения карт в десктопных или встраиваемых приложениях можно использовать Rust-обертку над Mapbox GL Native. Библиотека позволяет рендерить векторные тайлы, накладывать маркеры и полигоны, управлять стилями.
// Пример упрощен — требуется настройка окружения
// cargo add mapbox-gl-native-rs
use mapbox_gl_native_rs::{Map, MapOptions, Style};
fn main() {
let opts = MapOptions::new()
.size(800, 600)
.center(37.6173, 55.7558)
.zoom(10.0);
let mut map = Map::new(opts);
map.load_style(Style::from_url("https://demotiles.mapbox.com/style.json"));
// Добавление маркера
map.add_marker(37.6173, 55.7558, "Москва");
// Рендеринг в буфер (например, в PNG)
let img = map.render_to_image();
img.save("map.png").unwrap();
}
Примечание: Для работы требуется установленный Mapbox GL Native. Библиоте
Также в библиотеке
reflect-metadata для TypeScript: полное руководство с примерами
Swagger/OpenAPI генерация для C++: лучшие инструменты и библиотеки
Работа с изображениями на Swift: resize и crop для iOS/macOS
PDF генерация в TypeScript: библиотеки, инструменты и примеры кода
Prisma для JavaScript (Node.js): полное руководство с примерами