Геолокация и карты в C# (.NET): обзор библиотек и инструментов

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Геолокация и карты в C# (.NET): инструменты для работы с пространственными данными

Разработка приложений, работающих с географическими координатами, картами и маршрутами, — востребованная задача для C#-разработчиков. В экосистеме .NET существует несколько мощных библиотек, которые позволяют решать задачи от простого определения координат до построения сложных геоинформационных систем (ГИС). В этой статье мы рассмотрим ключевые инструменты для работы с геолокацией и картами в C#.

1. Встроенные средства: класс GeoCoordinate

Платформа .NET предоставляет базовый класс System.Device.Location.GeoCoordinate (доступен в .NET Framework и через пакет System.Device.Location.Portable для .NET Core). Он позволяет хранить широту и долготу, а также вычислять расстояние между двумя точками по формуле гаверсинусов.

using System.Device.Location;

public class GeoService
{
    public double CalculateDistance(double lat1, double lon1, double lat2, double lon2)
    {
        var point1 = new GeoCoordinate(lat1, lon1);
        var point2 = new GeoCoordinate(lat2, lon2);
        return point1.GetDistanceTo(point2); // результат в метрах
    }

    public void ShowDistance()
    {
        double distance = CalculateDistance(55.7558, 37.6176, 59.9343, 30.3351);
        Console.WriteLine($"Расстояние Москва-СПб: {distance / 1000:F2} км");
    }
}

Ограничения: класс не поддерживает работу с картами, геокодирование (преобразование адреса в координаты) или построение маршрутов. Для полноценной работы с картами потребуются сторонние библиотеки.

2. Mapsui — кроссплатформенная библиотека для отображения карт

Mapsui — это современная кроссплатформенная библиотека для .NET (поддерживает WPF, MAUI, Avalonia, Blazor). Она позволяет отображать карты из различных источников: OpenStreetMap (OSM), Bing Maps, Stamen, а также собственные тайловые сервера. Библиотека имеет открытый исходный код и активно развивается.

Основные возможности:

  • Отображение растровых и векторных тайлов
  • Поддержка слоёв (маркеры, полигоны, линии)
  • Интерактивность: масштабирование, панорамирование, клики по объектам
  • Интеграция с провайдерами карт (OSM, CartoDB, MapTiler)
  • Поддержка проекций (EPSG:4326, EPSG:3857)
using Mapsui;
using Mapsui.Providers;
using Mapsui.Tiling;
using Mapsui.Widgets.MapInfo;
using Mapsui.Widgets;

// Создаем карту с тайлами OpenStreetMap
var map = new Map();
map.Layers.Add(OpenStreetMap.CreateTileLayer());

// Добавляем маркер (точку)
var pointLayer = new MemoryLayer
{
    DataSource = new PointsProvider(new[] {
        new Feature(new MPoint(37.6176, 55.7558)) { ["Name"] = "Москва" }
    }),
    Style = new SymbolStyle { Fill = new Brush(Color.Red), SymbolScale = 1.5 }
};
map.Layers.Add(pointLayer);

// Отображаем в WPF MapControl
// mapControl.Map = map;

Когда использовать: если нужно встроить карту в десктопное или мобильное приложение на .NET MAUI/WPF, не зависящее от сторонних API-ключей (OSM бесплатен).

3. NetTopologySuite (NTS) — работа с геометрией и пространственными запросами

NetTopologySuite — это порт известной Java-библиотеки JTS (Java Topology Suite) для .NET. Она предоставляет мощные инструменты для работы с геометрическими объектами: точками, линиями, полигонами, мультиполигонами. NTS используется как основа для многих ГИС-приложений и ORM (например, Entity Framework Core с провайдером Npgsql для PostgreSQL/PostGIS).

Ключевые возможности:

  • Создание и манипуляция геометрическими фигурами
  • Пространственные предикаты: пересечение, вхождение, касание
  • Буферизация, объединение, пересечение полигонов
  • Чтение/запись форматов WKT, WKB, GeoJSON
  • Интеграция с PostGIS через Entity Framework Core
using NetTopologySuite.Geometries;
using NetTopologySuite.IO;

var geometryFactory = new GeometryFactory();

// Создаем точку
Point point = geometryFactory.CreatePoint(new Coordinate(37.6176, 55.7558));

// Создаем полигон (прямоугольник вокруг Москвы)
var coords = new[]
{
    new Coordinate(37.3, 55.5),
    new Coordinate(37.9, 55.5),                    

Рекомендаций