第01章 - Mapsui概述与入门
第01章:Mapsui概述与入门
1.1 Mapsui 简介
1.1.1 什么是 Mapsui
Mapsui(发音为 map-su-wii)是一个开源的 .NET 地图组件库,专门为跨平台地图应用开发而设计。它支持几乎所有主流的 .NET UI 框架,包括 MAUI、Avalonia、Uno Platform、Blazor、WPF、WinUI、Windows Forms、Eto Forms 以及原生的 .NET for Android 和 .NET for iOS。
Mapsui 采用 MIT 开源许可证,可免费用于商业和非商业项目。它基于 SkiaSharp 进行高性能渲染,提供了统一的 API 设计,使开发者能够用相同的代码逻辑在不同平台上构建地图应用。
┌─────────────────────────────────────────────────────────────────┐
│ 应用层 │
│ (桌面应用、移动应用、Web 应用、跨平台应用...) │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ Mapsui │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Map │ │ Layer │ │ Style │ │
│ │ (地图) │ │ (图层) │ │ (样式) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Provider │ │ Navigator │ │ Widget │ │
│ │ (提供者) │ │ (导航器) │ │ (小部件) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 渲染引擎 (SkiaSharp) │
│ 高性能2D图形渲染 │ 矢量绘制 │ 图像处理 │ ... │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 数据层 │
│ OpenStreetMap │ WMS/WMTS │ MBTiles │ GeoJSON │ Shapefile │ ...│
└─────────────────────────────────────────────────────────────────┘
1.1.2 Mapsui 的历史背景
Mapsui 项目最初源自 SharpMap 项目,随着 .NET 技术的发展和跨平台需求的增加,逐渐演变为一个独立的、现代化的地图组件库。其发展历程反映了 .NET 生态系统在地理信息可视化领域的演进:
| 阶段 | 主要特征 |
|---|---|
| 早期阶段 | 基于 SharpMap 的架构设计,主要支持 WPF 平台 |
| 中期发展 | 引入 SkiaSharp 渲染引擎,开始支持跨平台 |
| 现代阶段 | 全面支持 .NET 6/7/8/9,覆盖所有主流 UI 框架 |
| V5 版本 | 统一触摸和鼠标处理,改进的 Widget 系统 |
1.1.3 Mapsui 的核心特点
Mapsui 之所以成为 .NET 平台地图开发的优选方案,是因为具备以下关键特点:
1. 真正的跨平台支持
Mapsui 支持所有主流 .NET UI 框架:
| UI 框架 | NuGet 包 | 支持状态 |
|---|---|---|
| MAUI | Mapsui.Maui | ✅ 完全支持 |
| Avalonia | Mapsui.Avalonia | ✅ 完全支持 |
| Uno Platform | Mapsui.Uno.WinUI | ✅ 完全支持 |
| Blazor | Mapsui.Blazor | ✅ 完全支持 |
| WPF | Mapsui.Wpf | ✅ 完全支持 |
| WinUI | Mapsui.WinUI | ✅ 完全支持 |
| Windows Forms | Mapsui.WindowsForms | ✅ 完全支持 |
| Eto Forms | Mapsui.Eto | ✅ 完全支持 |
| .NET for Android | Mapsui.Android | ✅ 完全支持 |
| .NET for iOS | Mapsui.iOS | ✅ 完全支持 |
2. 高性能渲染
Mapsui 基于 SkiaSharp 实现高性能的 2D 图形渲染:
┌─────────────────────────────────────────────────────────────┐
│ Mapsui 渲染架构 │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ 图层渲染 │ │ 样式应用 │ │
│ │ (Layer Render) │ │ (Style Apply) │ │
│ └─────────────────┘ └─────────────────┘ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ 瓦片缓存 │ │ 视口裁剪 │ │
│ │ (Tile Cache) │ │ (Viewport Clip) │ │
│ └─────────────────┘ └─────────────────┘ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ 异步数据获取 │ │ 增量渲染 │ │
│ │ (Async Fetch) │ │ (Incremental) │ │
│ └─────────────────┘ └─────────────────┘ │
└─────────────────────────────────────────────────────────────┘
3. 丰富的数据源支持
Mapsui 支持多种地图数据源和格式:
在线地图服务:
| 服务类型 | 描述 |
|---|---|
| OpenStreetMap | 开源地图瓦片服务 |
| WMS | OGC Web Map Service |
| WMTS | OGC Web Map Tile Service |
| TMS | Tile Map Service |
| ArcGIS 服务 | Esri ArcGIS Server 服务 |
离线数据格式:
| 格式 | 描述 |
|---|---|
| MBTiles | SQLite 格式的瓦片数据库 |
| GeoJSON | 通用矢量数据格式 |
| Shapefile | Esri 矢量数据格式 |
| 内存数据 | 程序化生成的几何数据 |
4. NTS 几何处理集成
Mapsui 与 NetTopologySuite (NTS) 深度集成,提供强大的几何处理能力:
| 功能 | 描述 |
|---|---|
| 几何创建 | 点、线、多边形、多几何体 |
| 空间分析 | 缓冲区、联合、交集、差集 |
| 空间关系 | 包含、相交、邻近等判断 |
| 几何变换 | 投影转换、坐标变换 |
1.2 Mapsui 核心概念
1.2.1 Map(地图)
Map 是 Mapsui 的核心对象,它是所有地图内容的容器:
// 创建地图对象
var map = new Map();
// 配置地图属性
map.CRS = "EPSG:3857"; // 设置坐标参考系统(默认为 SphericalMercator)
// 添加图层
map.Layers.Add(OpenStreetMap.CreateTileLayer());
// 访问导航器
map.Navigator.ZoomToBox(new MRect(-180, -90, 180, 90));
Map 主要组成:
| 组件 | 描述 |
|---|---|
| Layers | 图层集合,包含所有地图图层 |
| Navigator | 导航器,控制地图视角和缩放 |
| Widgets | 小部件集合,如缩放按钮、比例尺等 |
| CRS | 坐标参考系统标识符 |
| BackColor | 地图背景颜色 |
1.2.2 MapControl(地图控件)
MapControl 是各平台特定的 UI 控件,用于在界面上显示地图:
// WPF 示例
var mapControl = new MapControl();
mapControl.Map = map;
Content = mapControl;
// MAUI 示例
var mapControl = new Mapsui.UI.Maui.MapControl();
mapControl.Map?.Layers.Add(OpenStreetMap.CreateTileLayer());
Content = mapControl;
1.2.3 Layer(图层)
图层是地图内容的基本组织单位,Mapsui 支持多种图层类型:
// 瓦片图层 - 用于显示栅格瓦片
var tileLayer = OpenStreetMap.CreateTileLayer();
// 内存图层 - 用于显示内存中的要素
var memoryLayer = new MemoryLayer
{
Name = "Points",
Features = CreateFeatures(),
Style = new SymbolStyle { Fill = new Brush(Color.Red) }
};
// 图片图层 - 用于显示单张图片
var imageLayer = new ImageLayer("Background");
// 可写图层 - 支持编辑操作
var writableLayer = new WritableLayer();
常用图层类型:
| 图层类型 | 用途 |
|---|---|
| TileLayer | 显示瓦片地图(在线或离线) |
| MemoryLayer | 显示内存中的矢量要素 |
| WritableLayer | 支持动态编辑的矢量图层 |
| ImageLayer | 显示单张图片作为图层 |
| Layer | 基于数据提供者的通用图层 |
| RasterizingLayer | 将矢量图层栅格化以提高性能 |
| MyLocationLayer | 显示用户当前位置 |
1.2.4 Feature(要素)
要素是地图上的单个地理对象,包含几何和属性信息:
// 创建点要素
var pointFeature = new PointFeature(new MPoint(116.4, 39.9));
pointFeature["name"] = "北京";
pointFeature["population"] = 21540000;
// 创建带样式的要素
pointFeature.Styles = new[] { new SymbolStyle
{
SymbolScale = 0.5,
Fill = new Brush(Color.Blue),
Outline = new Pen(Color.White, 2)
}};
// 使用 NTS 创建复杂几何
var geometryFactory = new GeometryFactory();
var polygon = geometryFactory.CreatePolygon(new[]
{
new Coordinate(0, 0),
new Coordinate(0, 10),
new Coordinate(10, 10),
new Coordinate(10, 0),
new Coordinate(0, 0)
});
var polygonFeature = new GeometryFeature(polygon);
1.2.5 Style(样式)
样式定义了要素的视觉外观:
// 符号样式 - 用于点要素
var symbolStyle = new SymbolStyle
{
SymbolScale = 1.0,
Fill = new Brush(Color.Red),
Outline = new Pen(Color.Black, 1)
};
// 矢量样式 - 用于线和面
var vectorStyle = new VectorStyle
{
Fill = new Brush(new Color(255, 0, 0, 128)), // 半透明红色填充
Line = new Pen(Color.Blue, 2), // 蓝色边框
Outline = new Pen(Color.Black, 1) // 黑色轮廓
};
// 标签样式
var labelStyle = new LabelStyle
{
Text = "北京",
ForeColor = Color.Black,
BackColor = new Brush(Color.White),
Font = new Font { Size = 14 }
};
// 图像样式
var imageStyle = new ImageStyle
{
ImageSource = "embedded://Mapsui.Samples.Common.Images.marker.png"
};
1.3 Mapsui 生态系统
1.3.1 核心 NuGet 包
Mapsui 的核心功能通过以下 NuGet 包提供:
| 包名 | 描述 |
|---|---|
| Mapsui | 核心库,包含 Map、Layer、Style 等基础类 |
| Mapsui.Nts | NTS 集成,提供高级几何处理能力 |
| Mapsui.Tiling | 瓦片图层支持,包括 OpenStreetMap |
| Mapsui.Rendering.Skia | SkiaSharp 渲染引擎 |
| Mapsui.ArcGIS | ArcGIS 服务支持 |
| Mapsui.Extensions | 扩展功能,如 GeoJSON 支持 |
1.3.2 平台特定包
每个 UI 框架都有对应的 NuGet 包:
| 包名 | 目标平台 |
|---|---|
| Mapsui.Maui | .NET MAUI 应用 |
| Mapsui.Avalonia | Avalonia UI 应用 |
| Mapsui.Uno.WinUI | Uno Platform 应用 |
| Mapsui.Blazor | Blazor WebAssembly 应用 |
| Mapsui.Wpf | WPF 桌面应用 |
| Mapsui.WinUI | WinUI 3 应用 |
| Mapsui.WindowsForms | Windows Forms 应用 |
| Mapsui.Eto | Eto.Forms 跨平台应用 |
| Mapsui.Android | .NET for Android 应用 |
| Mapsui.iOS | .NET for iOS 应用 |
1.3.3 相关技术栈
Mapsui 常与以下技术配合使用:
| 技术 | 用途 |
|---|---|
| NetTopologySuite | 几何处理与空间分析 |
| BruTile | 瓦片获取与缓存 |
| SkiaSharp | 2D 图形渲染 |
| ProjNet | 坐标投影转换 |
| SQLite | MBTiles 离线存储 |
| GeoJSON.NET | GeoJSON 数据处理 |
1.4 Mapsui 应用场景
1.4.1 典型应用领域
| 领域 | 应用场景 |
|---|---|
| 移动应用 | 导航应用、位置服务、户外运动追踪 |
| 桌面应用 | GIS 分析工具、资产管理系统、监控大屏 |
| Web 应用 | Blazor 地图应用、数据可视化面板 |
| 物联网 | 设备位置展示、传感器数据可视化 |
| 企业应用 | 物流追踪、销售区域管理、设施管理 |
1.4.2 实际案例
案例1:显示 OpenStreetMap 地图
// 最简单的地图应用
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var map = new Map();
map.Layers.Add(OpenStreetMap.CreateTileLayer());
mapControl.Map = map;
}
}
案例2:添加标注点
// 添加带标注的点
var map = new Map();
map.Layers.Add(OpenStreetMap.CreateTileLayer());
var memoryLayer = new MemoryLayer
{
Name = "POI",
Features = new[]
{
CreatePointFeature(116.4, 39.9, "北京"),
CreatePointFeature(121.5, 31.2, "上海"),
CreatePointFeature(113.3, 23.1, "广州")
},
Style = null // 使用要素自带的样式
};
map.Layers.Add(memoryLayer);
static PointFeature CreatePointFeature(double lon, double lat, string name)
{
var point = SphericalMercator.FromLonLat(lon, lat).ToMPoint();
var feature = new PointFeature(point);
feature["name"] = name;
feature.Styles = new[]
{
new SymbolStyle
{
SymbolScale = 0.5,
Fill = new Brush(Color.Red)
},
new LabelStyle
{
Text = name,
ForeColor = Color.Black,
Offset = new Offset(0, -20)
}
};
return feature;
}
案例3:响应地图点击
// 处理地图点击事件
mapControl.Map.Info += (sender, args) =>
{
if (args.MapInfo?.Feature != null)
{
var feature = args.MapInfo.Feature;
var name = feature["name"]?.ToString() ?? "未知";
MessageBox.Show($"点击了: {name}");
}
};
1.5 Mapsui 版本与特性
1.5.1 当前版本特性
Mapsui V5 是当前的主要版本,带来了多项重要改进:
| 特性 | 描述 |
|---|---|
| 统一的输入处理 | 触摸和鼠标事件在所有平台上保持一致 |
| 改进的 Widget 系统 | 新的事件类型:PointerPressed、PointerMoved、PointerReleased、Tapped |
| 更好的性能 | 优化的渲染管道和缓存机制 |
| 简化的 API | 更直观的 API 设计和更好的文档 |
1.5.2 版本升级注意事项
从 V4 升级到 V5 时需要注意:
| 变更 | 说明 |
|---|---|
| 命名空间变更 | 部分命名空间已重新组织 |
| API 变更 | 某些方法签名可能已更改 |
| Widget 事件 | Widget 事件处理方式已更新 |
1.5.3 选择合适的版本
| 需求 | 推荐方案 |
|---|---|
| 新项目开发 | 使用最新稳定版 V5 |
| 现有项目维护 | 评估升级成本后决定 |
| 实验性功能 | 可以使用预览版 |
1.6 学习资源与社区
1.6.1 官方资源
| 资源 | URL | 描述 |
|---|---|---|
| 官方网站 | https://mapsui.com | 文档和入门指南 |
| GitHub | https://github.com/Mapsui/Mapsui | 源码、Issue、Discussions |
| 在线示例 | https://mapsui.com/v5/samples/ | Blazor 在线演示 |
| API 文档 | https://mapsui.com/v5/api | API 参考文档 |
| NuGet | https://www.nuget.org/packages/Mapsui | NuGet 包 |
1.6.2 学习路径
入门阶段:
- 完成各平台的 Quickstart 教程
- 学习基本的地图、图层、样式概念
- 掌握要素创建和显示
- 理解坐标系统
进阶阶段:
- 深入学习各种图层类型
- 掌握 NTS 几何处理
- 学习数据提供者的使用
- 实现自定义样式和渲染
高级阶段:
- 自定义 Widget 开发
- 性能优化技巧
- 复杂应用架构设计
- 贡献社区开发
1.6.3 社区支持
| 平台 | 用途 |
|---|---|
| GitHub Issues | 报告 Bug 和功能请求 |
| GitHub Discussions | 技术讨论和问答 |
| BlueSky | 官方社交媒体 (@mapsui.bsky.social) |
| Stack Overflow | 使用 mapsui 标签提问 |
1.7 本章小结
本章介绍了 Mapsui 的基本概念和核心组件:
- Mapsui 是什么:跨平台的 .NET 地图组件库,支持所有主流 UI 框架
- 核心概念:
- Map:地图容器
- MapControl:平台特定的 UI 控件
- Layer:图层系统
- Feature:地理要素
- Style:样式系统
- 主要特点:跨平台支持、高性能渲染、丰富的数据源
- 生态系统:核心包、平台包、相关技术栈
- 应用场景:移动应用、桌面应用、Web 应用等
在下一章中,我们将详细介绍 Mapsui 的环境搭建与快速开始,包括各个平台的详细配置步骤。
1.8 思考与练习
- Mapsui 相比其他 .NET 地图库(如 GMap.NET)有什么优势?
- 为什么 Mapsui 选择 SkiaSharp 作为渲染引擎?
- MemoryLayer 和 WritableLayer 各自适合什么场景?
- 列举三个你能想到的 Mapsui 应用场景。
- 访问 Mapsui 官方在线示例,运行并理解一个基础示例。

浙公网安备 33010602011771号