C# (.NET) 中的地理定位与地图:处理空间数据的工具
开发处理地理坐标、地图和路线的应用程序是 C# 开发人员的一项常见任务。在 .NET 生态系统中,有多个强大的库可用于解决从简单坐标确定到构建复杂地理信息系统 (GIS) 的各种任务。在本文中,我们将介绍 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;何时使用:如果需要将地图嵌入到不依赖第三方 API 密钥的 .NET MAUI/WPF 桌面或移动应用程序中(OSM 是免费的)。
3. NetTopologySuite (NTS) — 几何与空间查询处理
NetTopologySuite 是著名的 Java 库 JTS(Java Topology Suite)到 .NET 的移植版本。它提供了用于处理几何对象的强大工具:点、线、多边形、多多边形。NTS 被用作许多 GIS 应用程序和 ORM 的基础(例如,带有 Npgsql 提供程序用于 PostgreSQL/PostGIS 的 Entity Framework Core)。
关键功能:
- 创建和操作几何图形
- 空间谓词:相交、包含、接触
- 缓冲、合并、多边形相交
- 读取/写入格式