C# (.NET) 中的地理定位与地图:库与工具概览

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

C# (.NET) 中的地理定位与地图:关键库与工具概览

在现代 .NET 应用程序中,处理地理数据和地图是一项常见需求。从位置追踪到地图可视化,C# 生态系统提供了多种强大的解决方案。本文将介绍用于地理定位和地图处理的主要库、它们的功能及使用示例。



1. 内置库 System.Device.Location (GeoCoordinate)

对于 .NET Framework 中基本的 GPS 坐标处理,可以使用 System.Device.Location 命名空间中的 GeoCoordinate 类。它允许获取设备的当前位置(Windows)并计算两点之间的距离。

使用示例:

using System.Device.Location;

var watcher = new GeoCoordinateWatcher();watcher.TryStart(false, TimeSpan.FromMilliseconds(1000));

if (watcher.Status == GeoPositionStatus.Ready){ GeoCoordinate coord = watcher.Position.Location; Console.WriteLine($"纬度: {coord.Latitude}, 经度: {coord.Longitude}");}

// 计算两点之间的距离var point1 = new GeoCoordinate(55.7558, 37.6176); // 莫斯科var point2 = new GeoCoordinate(59.9343, 30.3351); // 圣彼得堡double distance = point1.GetDistanceTo(point2); // 单位:米Console.WriteLine($"距离: {distance / 1000:F2} 公里");


2. NetTopologySuite — 高级几何处理

NetTopologySuite (NTS) 是流行的 Java 库 JTS 的 .NET 移植版。它提供了处理几何对象(点、线、多边形)和空间操作(相交、合并、缓冲区)的强大工具。

主要功能:

  • 创建和分析几何图形(Point、LineString、Polygon)。
  • 空间谓词(Contains、Intersects、Within)。
  • 坐标转换和投影(与 ProjNet 配合使用)。
  • 读写 WKT、WKB、GeoJSON 格式。

示例:

using NetTopologySuite.Geometries;using NetTopologySuite.IO;

var geometryFactory = new GeometryFactory();Point point1 = geometryFactory.CreatePoint(new Coordinate(37.6176, 55.7558));Point point2 = geometryFactory.CreatePoint(new Coordinate(30.3351, 59.9343));

double distance = point1.Distance(point2); // 单位:度Console.WriteLine($"距离(度): {distance:F4}");

// 从 WKT 读取var reader = new WKTReader();Polygon polygon = reader.Read("POLYGON ((30 20, 45 40, 10 40, 30 20))") as Polygon;Console.WriteLine($"多边形面积: {polygon.Area}");


3. Mapsui — 跨平台地图库

Mapsui 是一个用于在 .NET(Windows、Android、iOS、WebAssembly)中显示地图的现代库。它支持多种瓦片源(OpenStreetMap、Bing、MapBox),以及自定义图层(标记、线、多边形)的绘制。

主要特点:

  • 支持 WPF、MAUI、Avalonia、Blazor。
  • 简单的 API 用于添加标记和图层。
  • 动画和交互(缩放、拖拽)。
  • 支持离线地图(MBTiles)。

WPF 示例:

using Mapsui;using Mapsui.Projections;using Mapsui.Tiling;

var map = new Map();map.Layers.Add(OpenStreetMap.CreateTileLayer());

// 添加标记var pin = new PointFeature(37.6176, 55.7558);pin["label"] = "莫斯科";map.Layers.Add(new Layer { Name = "标记", DataSource = new MemoryProvider(pin) });

// 在 XAML 中:<MapControl Map="{Binding Map}" />// 在代码中绑定的示例:// mapControl.Map = map;


4. SharpMap — 经典地理信息系统库

SharpMap 是

推荐