@dsh-gis/dsh-opengis-skill 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.editorconfig +19 -0
- package/CHANGELOG.md +96 -0
- package/LICENSE +21 -21
- package/README.md +91 -30
- package/THIRD_PARTY_NOTICES.md +37 -10
- package/assets/gdal/reference/raster-tools.md +538 -538
- package/assets/gdal/reference/vector-tools.md +149 -149
- package/assets/gdal-api/reference/raster-api.md +424 -424
- package/assets/gdal-api/reference/vector-api.md +724 -724
- package/assets/geometry-api-net/reference/geometry-types.md +243 -243
- package/assets/geopandas/reference/core-api.md +221 -221
- package/assets/geotools/reference/raster-rendering.md +108 -108
- package/assets/geotools/reference/vector-io.md +149 -149
- package/assets/jts/reference/geometry-operations.md +303 -303
- package/assets/mapsui/SKILL.md +283 -283
- package/assets/opengis-all/reference/data-stages.md +608 -608
- package/assets/opengis-all/reference/workflow-cheatsheets.md +324 -324
- package/assets/opengis-utils-for-java/reference/common-tasks.md +384 -384
- package/assets/opengis-utils-for-net/reference/code-patterns.md +124 -124
- package/assets/opengis-utils-for-net/reference/util-classes.md +291 -291
- package/assets/pyqgis/reference/processing-rendering.md +292 -292
- package/assets/pyqgis/reference/vector-raster-layers.md +318 -318
- package/assets/qgis-process/SKILL.md +414 -414
- package/assets/qgis-process/reference/algorithm-cheatsheet.md +194 -194
- package/assets/shapely/reference/operations-reference.md +199 -199
- package/cordis.patch.yml +6 -3
- package/lib/catalog.d.ts +50 -0
- package/lib/catalog.js +238 -0
- package/lib/index.d.ts +47 -6
- package/lib/index.js +32 -44
- package/lib/markdown-links.d.ts +11 -0
- package/lib/markdown-links.js +103 -0
- package/lib/skill-file.js +104 -17
- package/locale/en.json +1 -1
- package/locale/zh.json +1 -1
- package/package.json +11 -5
- package/upstream.json +64 -2
package/assets/mapsui/SKILL.md
CHANGED
|
@@ -1,283 +1,283 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: mapsui
|
|
3
|
-
description: "Use when embedding interactive 2D maps in .NET desktop (WinForms/WPF) or mobile (MAUI) applications — tile layers, vector features, map controls. Mapsui: cross-platform .NET map component library."
|
|
4
|
-
tags:
|
|
5
|
-
- dotnet
|
|
6
|
-
- csharp
|
|
7
|
-
- map
|
|
8
|
-
- wpf
|
|
9
|
-
- maui
|
|
10
|
-
- avalonia
|
|
11
|
-
- blazor
|
|
12
|
-
- skia
|
|
13
|
-
- wms
|
|
14
|
-
- tiles
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
> **项目地址:** <https://github.com/Mapsui/Mapsui>
|
|
18
|
-
>
|
|
19
|
-
> **官方文档:** <https://mapsui.com/v5/documentation/index.html>
|
|
20
|
-
>
|
|
21
|
-
> **最新版本:** 5.1.0(截至2026-10,NuGet)
|
|
22
|
-
>
|
|
23
|
-
> **许可证:** MIT
|
|
24
|
-
|
|
25
|
-
## 概述
|
|
26
|
-
|
|
27
|
-
- 跨 UI 框架:WPF / WinUI / MAUI / Avalonia / Uno / Blazor / WinForms
|
|
28
|
-
- SkiaSharp 渲染,性能优于 GDI+
|
|
29
|
-
- 数据源:OSM / WMS / WMTS / TMS / XYZ / Shapefile / GeoJSON / MBTiles / PostGIS
|
|
30
|
-
- 几何基于 NetTopologySuite
|
|
31
|
-
- 投影:`ProjNet` / `Mapsui.Projections`
|
|
32
|
-
- 内置交互:拖动、缩放、旋转、捏合、命中
|
|
33
|
-
|
|
34
|
-
---
|
|
35
|
-
|
|
36
|
-
## 安装
|
|
37
|
-
|
|
38
|
-
```bash
|
|
39
|
-
dotnet add package Mapsui.Wpf # 或 Mapsui.Maui / Mapsui.Avalonia / ...
|
|
40
|
-
dotnet add package Mapsui.Tiling
|
|
41
|
-
dotnet add package Mapsui.Nts
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
---
|
|
45
|
-
|
|
46
|
-
## WPF 入门
|
|
47
|
-
|
|
48
|
-
```xml
|
|
49
|
-
<Window xmlns:mapsui="clr-namespace:Mapsui.UI.Wpf;assembly=Mapsui.UI.Wpf">
|
|
50
|
-
<mapsui:MapControl x:Name="MapControl"/>
|
|
51
|
-
</Window>
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
```csharp
|
|
55
|
-
using Mapsui;
|
|
56
|
-
using Mapsui.Tiling;
|
|
57
|
-
using Mapsui.Projections;
|
|
58
|
-
|
|
59
|
-
var map = new Map();
|
|
60
|
-
map.Layers.Add(OpenStreetMap.CreateTileLayer());
|
|
61
|
-
|
|
62
|
-
var pt = SphericalMercator.FromLonLat(116.397, 39.908).ToMPoint();
|
|
63
|
-
map.Navigator.CenterOnAndZoomTo(pt, map.Navigator.Resolutions[10]);
|
|
64
|
-
|
|
65
|
-
MapControl.Map = map;
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
---
|
|
69
|
-
|
|
70
|
-
## 核心概念
|
|
71
|
-
|
|
72
|
-
| 类型 | 说明 |
|
|
73
|
-
|------|------|
|
|
74
|
-
| `Map` | 地图 |
|
|
75
|
-
| `Layer` / `MemoryLayer` / `ImageLayer` / `TileLayer` | 图层 |
|
|
76
|
-
| `IProvider` | 数据提供者 |
|
|
77
|
-
| `IFeature` / `GeometryFeature` | 要素(NTS 几何) |
|
|
78
|
-
| `IStyle` / `VectorStyle` / `LabelStyle` / `SymbolStyle` | 样式 |
|
|
79
|
-
| `Navigator` | 视图操作 |
|
|
80
|
-
|
|
81
|
-
---
|
|
82
|
-
|
|
83
|
-
## 矢量图层
|
|
84
|
-
|
|
85
|
-
```csharp
|
|
86
|
-
using Mapsui.Nts;
|
|
87
|
-
using Mapsui.Styles;
|
|
88
|
-
|
|
89
|
-
var features = new List<IFeature>();
|
|
90
|
-
foreach (var f in geoJsonFeatures)
|
|
91
|
-
features.Add(new GeometryFeature(f.Geometry) {
|
|
92
|
-
Styles = { new VectorStyle {
|
|
93
|
-
Fill = new Brush(Color.Red),
|
|
94
|
-
Outline = new Pen(Color.Black, 1)
|
|
95
|
-
}}
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
map.Layers.Add(new MemoryLayer("Roads") { Features = features, Style = null });
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
---
|
|
102
|
-
|
|
103
|
-
## Shapefile
|
|
104
|
-
|
|
105
|
-
```csharp
|
|
106
|
-
using Mapsui.Nts.Providers.Shapefile;
|
|
107
|
-
var prov = new ShapeFile("china.shp", true);
|
|
108
|
-
map.Layers.Add(new Layer("China") { DataSource = prov });
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
---
|
|
112
|
-
|
|
113
|
-
## 瓦片图层
|
|
114
|
-
|
|
115
|
-
```csharp
|
|
116
|
-
map.Layers.Add(OpenStreetMap.CreateTileLayer());
|
|
117
|
-
|
|
118
|
-
var src = new HttpTileSource(
|
|
119
|
-
new GlobalSphericalMercator(0, 18),
|
|
120
|
-
"https://webst02.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}",
|
|
121
|
-
name: "AMap");
|
|
122
|
-
map.Layers.Add(new TileLayer(src) { Name = "AMap" });
|
|
123
|
-
|
|
124
|
-
// MBTiles
|
|
125
|
-
var mb = new MbTilesTileSource(new SQLiteConnectionString("city.mbtiles", false));
|
|
126
|
-
map.Layers.Add(new TileLayer(mb));
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
---
|
|
130
|
-
|
|
131
|
-
## WMS
|
|
132
|
-
|
|
133
|
-
```csharp
|
|
134
|
-
using Mapsui.Providers.Wms;
|
|
135
|
-
var wms = new WmsProvider("https://demo.mapserver.org/cgi-bin/wms?",
|
|
136
|
-
new[] { "continents" });
|
|
137
|
-
map.Layers.Add(new ImageLayer("WMS") { DataSource = wms });
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
---
|
|
141
|
-
|
|
142
|
-
## 样式
|
|
143
|
-
|
|
144
|
-
```csharp
|
|
145
|
-
new SymbolStyle { SymbolScale = 0.7, Fill = new Brush(Color.Red) };
|
|
146
|
-
|
|
147
|
-
new LabelStyle {
|
|
148
|
-
Text = "{name}",
|
|
149
|
-
Font = new Font { Size = 14 },
|
|
150
|
-
BackColor = new Brush(Color.WhiteSmoke),
|
|
151
|
-
Halo = new Pen(Color.White, 2)
|
|
152
|
-
};
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
---
|
|
156
|
-
|
|
157
|
-
## 主题样式
|
|
158
|
-
|
|
159
|
-
```csharp
|
|
160
|
-
public class PopulationStyle : IThemeStyle {
|
|
161
|
-
public IStyle? GetStyle(IFeature f) {
|
|
162
|
-
var pop = (int)f["population"];
|
|
163
|
-
return new VectorStyle { Fill = new Brush(pop > 1_000_000 ? Color.Red : Color.Blue) };
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
layer.Style = new PopulationStyle();
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
---
|
|
170
|
-
|
|
171
|
-
## 交互
|
|
172
|
-
|
|
173
|
-
```csharp
|
|
174
|
-
MapControl.Info += (s, e) => {
|
|
175
|
-
if (e.MapInfo?.Feature is GeometryFeature gf)
|
|
176
|
-
Debug.WriteLine($"clicked {gf["name"]}");
|
|
177
|
-
};
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
---
|
|
181
|
-
|
|
182
|
-
## 性能优化
|
|
183
|
-
|
|
184
|
-
1. 海量点 → `RasterizingTileLayer` 包一层(按瓦片预渲染)
|
|
185
|
-
2. 优先 `MemoryLayer` + 缓存 Feature
|
|
186
|
-
3. 异步加载 + `await Layer.WaitForFinishedRefresh()`
|
|
187
|
-
4. 共享 Brush/Pen/Style 实例
|
|
188
|
-
5. SkiaSharp 关闭抗锯齿对极小符号有性能提升
|
|
189
|
-
|
|
190
|
-
---
|
|
191
|
-
|
|
192
|
-
## 常见问题
|
|
193
|
-
|
|
194
|
-
| 问题 | 解决 |
|
|
195
|
-
|------|------|
|
|
196
|
-
| WPF 无图 | NuGet 缺 `Mapsui.Wpf` 或没设置 `MapControl.Map` |
|
|
197
|
-
| 找不到 `Mapsui.UI.Wpf` 包 | NuGet 包名为 `Mapsui.Wpf`(v3 起启用该名称;程序集仍为 `Mapsui.UI.Wpf.dll`) |
|
|
198
|
-
| 投影错误 | `SphericalMercator.FromLonLat` 转换 |
|
|
199
|
-
| MAUI 空白 | `MauiProgram` 中 `UseSkiaSharp()` + `UseMapsui()` |
|
|
200
|
-
| Shapefile 中文乱码 | 指定 Encoding |
|
|
201
|
-
| `GeometryFeature` / 瓦片类型找不到 | 矢量要素需安装 `Mapsui.Nts`,瓦片图层需安装 `Mapsui.Tiling` |
|
|
202
|
-
|
|
203
|
-
---
|
|
204
|
-
|
|
205
|
-
## 典型工作流
|
|
206
|
-
|
|
207
|
-
### 工作流 1:加载底图 + GeoJSON 矢量数据
|
|
208
|
-
|
|
209
|
-
```csharp
|
|
210
|
-
using Mapsui;
|
|
211
|
-
using Mapsui.Tiling;
|
|
212
|
-
using Mapsui.Nts;
|
|
213
|
-
using Mapsui.Styles;
|
|
214
|
-
using NetTopologySuite.IO;
|
|
215
|
-
|
|
216
|
-
var map = new Map();
|
|
217
|
-
|
|
218
|
-
// 1. 添加 OSM 底图
|
|
219
|
-
map.Layers.Add(OpenStreetMap.CreateTileLayer());
|
|
220
|
-
|
|
221
|
-
// 2. 读取 GeoJSON 并添加为矢量图层
|
|
222
|
-
var gjReader = new GeoJsonReader();
|
|
223
|
-
var features = new List<IFeature>();
|
|
224
|
-
foreach (var f in geojsonFeatures)
|
|
225
|
-
{
|
|
226
|
-
features.Add(new GeometryFeature(f.Geometry)
|
|
227
|
-
{
|
|
228
|
-
Styles = { new VectorStyle { Fill = new Brush(Color.Red) } }
|
|
229
|
-
});
|
|
230
|
-
}
|
|
231
|
-
map.Layers.Add(new MemoryLayer("Data") { Features = features });
|
|
232
|
-
|
|
233
|
-
// 3. 定位
|
|
234
|
-
var center = SphericalMercator.FromLonLat(116.4, 39.9).ToMPoint();
|
|
235
|
-
map.Navigator.CenterOnAndZoomTo(center, map.Navigator.Resolutions[10]);
|
|
236
|
-
|
|
237
|
-
MapControl.Map = map;
|
|
238
|
-
```
|
|
239
|
-
|
|
240
|
-
### 工作流 2:Shapefile + WMS 叠加
|
|
241
|
-
|
|
242
|
-
```csharp
|
|
243
|
-
// Shapefile 图层
|
|
244
|
-
var shpProvider = new ShapeFile("china.shp", true);
|
|
245
|
-
map.Layers.Add(new Layer("China") { DataSource = shpProvider });
|
|
246
|
-
|
|
247
|
-
// WMS 图层(叠加)
|
|
248
|
-
var wmsProvider = new WmsProvider("https://geo.example.com/wms?", new[] { "rivers" });
|
|
249
|
-
map.Layers.Add(new ImageLayer("Rivers") { DataSource = wmsProvider });
|
|
250
|
-
|
|
251
|
-
map.ZoomToExtents();
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
## AI 使用建议
|
|
255
|
-
|
|
256
|
-
### 推荐工作流
|
|
257
|
-
|
|
258
|
-
1. **选择 UI 框架**:Mapsui 支持 WPF/WinUI/MAUI/Avalonia/Uno/Blazor/WinForms,根据需要选择对应的 NuGet 包
|
|
259
|
-
2. **创建 Map**:实例化 `Map`,添加图层(`TileLayer` 作为底图 + `MemoryLayer` 作为矢量覆盖层)
|
|
260
|
-
3. **数据转换**:通过 `SphericalMercator.FromLonLat()` 将经纬度转为 Web Mercator 坐标
|
|
261
|
-
4. **绑定控件**:将 `MapControl.Map` 设置为创建的 Map 对象
|
|
262
|
-
5. **添加交互**:通过 `MapControl.Info` 事件处理点击拾取,`Navigator` 控制视图
|
|
263
|
-
|
|
264
|
-
### 关键注意事项
|
|
265
|
-
|
|
266
|
-
- **NuGet 包完整**:确保安装了 `Mapsui.<UI框架>`、`Mapsui.Tiling`、`Mapsui.Nts` 三个包
|
|
267
|
-
- **投影转换**:WGS84 经纬度必须通过 `SphericalMercator.FromLonLat()` 转换后才能用于 Mapsui 定位
|
|
268
|
-
- **Shapefile 编码**:中文 Shapefile 需指定 `Encoding`(如 `Encoding.UTF8` 或 `Encoding.GetEncoding("GBK")`)
|
|
269
|
-
- **样式共享**:共享 `Brush`/`Pen`/`VectorStyle` 实例可提升性能
|
|
270
|
-
- **海量点优化**:使用 `RasterizingTileLayer` 包装海量点图层,按瓦片预渲染
|
|
271
|
-
|
|
272
|
-
## 相关技能
|
|
273
|
-
|
|
274
|
-
- **openlayers** — Web 二维地图库(JavaScript):[../openlayers/SKILL.md](../openlayers/SKILL.md)
|
|
275
|
-
- **sharpmap** — .NET 传统地图渲染引擎:[../sharpmap/SKILL.md](../sharpmap/SKILL.md)
|
|
276
|
-
- **nettopologysuite** — .NET 几何计算核心:[../nettopologysuite/SKILL.md](../nettopologysuite/SKILL.md)
|
|
277
|
-
- **geoserver** — 地图服务发布:[../geoserver/SKILL.md](../geoserver/SKILL.md)
|
|
278
|
-
|
|
279
|
-
## 参考资源
|
|
280
|
-
|
|
281
|
-
- 文档:<https://mapsui.com/v5/documentation/index.html>
|
|
282
|
-
- 示例:<https://mapsui.com/v5/samples/>
|
|
283
|
-
- 中文教程(znlgis):<https://znlgis.github.io/gis/tutorial/Mapsui/>
|
|
1
|
+
---
|
|
2
|
+
name: mapsui
|
|
3
|
+
description: "Use when embedding interactive 2D maps in .NET desktop (WinForms/WPF) or mobile (MAUI) applications — tile layers, vector features, map controls. Mapsui: cross-platform .NET map component library."
|
|
4
|
+
tags:
|
|
5
|
+
- dotnet
|
|
6
|
+
- csharp
|
|
7
|
+
- map
|
|
8
|
+
- wpf
|
|
9
|
+
- maui
|
|
10
|
+
- avalonia
|
|
11
|
+
- blazor
|
|
12
|
+
- skia
|
|
13
|
+
- wms
|
|
14
|
+
- tiles
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
> **项目地址:** <https://github.com/Mapsui/Mapsui>
|
|
18
|
+
>
|
|
19
|
+
> **官方文档:** <https://mapsui.com/v5/documentation/index.html>
|
|
20
|
+
>
|
|
21
|
+
> **最新版本:** 5.1.0(截至2026-10,NuGet)
|
|
22
|
+
>
|
|
23
|
+
> **许可证:** MIT
|
|
24
|
+
|
|
25
|
+
## 概述
|
|
26
|
+
|
|
27
|
+
- 跨 UI 框架:WPF / WinUI / MAUI / Avalonia / Uno / Blazor / WinForms
|
|
28
|
+
- SkiaSharp 渲染,性能优于 GDI+
|
|
29
|
+
- 数据源:OSM / WMS / WMTS / TMS / XYZ / Shapefile / GeoJSON / MBTiles / PostGIS
|
|
30
|
+
- 几何基于 NetTopologySuite
|
|
31
|
+
- 投影:`ProjNet` / `Mapsui.Projections`
|
|
32
|
+
- 内置交互:拖动、缩放、旋转、捏合、命中
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 安装
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
dotnet add package Mapsui.Wpf # 或 Mapsui.Maui / Mapsui.Avalonia / ...
|
|
40
|
+
dotnet add package Mapsui.Tiling
|
|
41
|
+
dotnet add package Mapsui.Nts
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## WPF 入门
|
|
47
|
+
|
|
48
|
+
```xml
|
|
49
|
+
<Window xmlns:mapsui="clr-namespace:Mapsui.UI.Wpf;assembly=Mapsui.UI.Wpf">
|
|
50
|
+
<mapsui:MapControl x:Name="MapControl"/>
|
|
51
|
+
</Window>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
```csharp
|
|
55
|
+
using Mapsui;
|
|
56
|
+
using Mapsui.Tiling;
|
|
57
|
+
using Mapsui.Projections;
|
|
58
|
+
|
|
59
|
+
var map = new Map();
|
|
60
|
+
map.Layers.Add(OpenStreetMap.CreateTileLayer());
|
|
61
|
+
|
|
62
|
+
var pt = SphericalMercator.FromLonLat(116.397, 39.908).ToMPoint();
|
|
63
|
+
map.Navigator.CenterOnAndZoomTo(pt, map.Navigator.Resolutions[10]);
|
|
64
|
+
|
|
65
|
+
MapControl.Map = map;
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## 核心概念
|
|
71
|
+
|
|
72
|
+
| 类型 | 说明 |
|
|
73
|
+
|------|------|
|
|
74
|
+
| `Map` | 地图 |
|
|
75
|
+
| `Layer` / `MemoryLayer` / `ImageLayer` / `TileLayer` | 图层 |
|
|
76
|
+
| `IProvider` | 数据提供者 |
|
|
77
|
+
| `IFeature` / `GeometryFeature` | 要素(NTS 几何) |
|
|
78
|
+
| `IStyle` / `VectorStyle` / `LabelStyle` / `SymbolStyle` | 样式 |
|
|
79
|
+
| `Navigator` | 视图操作 |
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 矢量图层
|
|
84
|
+
|
|
85
|
+
```csharp
|
|
86
|
+
using Mapsui.Nts;
|
|
87
|
+
using Mapsui.Styles;
|
|
88
|
+
|
|
89
|
+
var features = new List<IFeature>();
|
|
90
|
+
foreach (var f in geoJsonFeatures)
|
|
91
|
+
features.Add(new GeometryFeature(f.Geometry) {
|
|
92
|
+
Styles = { new VectorStyle {
|
|
93
|
+
Fill = new Brush(Color.Red),
|
|
94
|
+
Outline = new Pen(Color.Black, 1)
|
|
95
|
+
}}
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
map.Layers.Add(new MemoryLayer("Roads") { Features = features, Style = null });
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## Shapefile
|
|
104
|
+
|
|
105
|
+
```csharp
|
|
106
|
+
using Mapsui.Nts.Providers.Shapefile;
|
|
107
|
+
var prov = new ShapeFile("china.shp", true);
|
|
108
|
+
map.Layers.Add(new Layer("China") { DataSource = prov });
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## 瓦片图层
|
|
114
|
+
|
|
115
|
+
```csharp
|
|
116
|
+
map.Layers.Add(OpenStreetMap.CreateTileLayer());
|
|
117
|
+
|
|
118
|
+
var src = new HttpTileSource(
|
|
119
|
+
new GlobalSphericalMercator(0, 18),
|
|
120
|
+
"https://webst02.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}",
|
|
121
|
+
name: "AMap");
|
|
122
|
+
map.Layers.Add(new TileLayer(src) { Name = "AMap" });
|
|
123
|
+
|
|
124
|
+
// MBTiles
|
|
125
|
+
var mb = new MbTilesTileSource(new SQLiteConnectionString("city.mbtiles", false));
|
|
126
|
+
map.Layers.Add(new TileLayer(mb));
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## WMS
|
|
132
|
+
|
|
133
|
+
```csharp
|
|
134
|
+
using Mapsui.Providers.Wms;
|
|
135
|
+
var wms = new WmsProvider("https://demo.mapserver.org/cgi-bin/wms?",
|
|
136
|
+
new[] { "continents" });
|
|
137
|
+
map.Layers.Add(new ImageLayer("WMS") { DataSource = wms });
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## 样式
|
|
143
|
+
|
|
144
|
+
```csharp
|
|
145
|
+
new SymbolStyle { SymbolScale = 0.7, Fill = new Brush(Color.Red) };
|
|
146
|
+
|
|
147
|
+
new LabelStyle {
|
|
148
|
+
Text = "{name}",
|
|
149
|
+
Font = new Font { Size = 14 },
|
|
150
|
+
BackColor = new Brush(Color.WhiteSmoke),
|
|
151
|
+
Halo = new Pen(Color.White, 2)
|
|
152
|
+
};
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## 主题样式
|
|
158
|
+
|
|
159
|
+
```csharp
|
|
160
|
+
public class PopulationStyle : IThemeStyle {
|
|
161
|
+
public IStyle? GetStyle(IFeature f) {
|
|
162
|
+
var pop = (int)f["population"];
|
|
163
|
+
return new VectorStyle { Fill = new Brush(pop > 1_000_000 ? Color.Red : Color.Blue) };
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
layer.Style = new PopulationStyle();
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## 交互
|
|
172
|
+
|
|
173
|
+
```csharp
|
|
174
|
+
MapControl.Info += (s, e) => {
|
|
175
|
+
if (e.MapInfo?.Feature is GeometryFeature gf)
|
|
176
|
+
Debug.WriteLine($"clicked {gf["name"]}");
|
|
177
|
+
};
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## 性能优化
|
|
183
|
+
|
|
184
|
+
1. 海量点 → `RasterizingTileLayer` 包一层(按瓦片预渲染)
|
|
185
|
+
2. 优先 `MemoryLayer` + 缓存 Feature
|
|
186
|
+
3. 异步加载 + `await Layer.WaitForFinishedRefresh()`
|
|
187
|
+
4. 共享 Brush/Pen/Style 实例
|
|
188
|
+
5. SkiaSharp 关闭抗锯齿对极小符号有性能提升
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## 常见问题
|
|
193
|
+
|
|
194
|
+
| 问题 | 解决 |
|
|
195
|
+
|------|------|
|
|
196
|
+
| WPF 无图 | NuGet 缺 `Mapsui.Wpf` 或没设置 `MapControl.Map` |
|
|
197
|
+
| 找不到 `Mapsui.UI.Wpf` 包 | NuGet 包名为 `Mapsui.Wpf`(v3 起启用该名称;程序集仍为 `Mapsui.UI.Wpf.dll`) |
|
|
198
|
+
| 投影错误 | `SphericalMercator.FromLonLat` 转换 |
|
|
199
|
+
| MAUI 空白 | `MauiProgram` 中 `UseSkiaSharp()` + `UseMapsui()` |
|
|
200
|
+
| Shapefile 中文乱码 | 指定 Encoding |
|
|
201
|
+
| `GeometryFeature` / 瓦片类型找不到 | 矢量要素需安装 `Mapsui.Nts`,瓦片图层需安装 `Mapsui.Tiling` |
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## 典型工作流
|
|
206
|
+
|
|
207
|
+
### 工作流 1:加载底图 + GeoJSON 矢量数据
|
|
208
|
+
|
|
209
|
+
```csharp
|
|
210
|
+
using Mapsui;
|
|
211
|
+
using Mapsui.Tiling;
|
|
212
|
+
using Mapsui.Nts;
|
|
213
|
+
using Mapsui.Styles;
|
|
214
|
+
using NetTopologySuite.IO;
|
|
215
|
+
|
|
216
|
+
var map = new Map();
|
|
217
|
+
|
|
218
|
+
// 1. 添加 OSM 底图
|
|
219
|
+
map.Layers.Add(OpenStreetMap.CreateTileLayer());
|
|
220
|
+
|
|
221
|
+
// 2. 读取 GeoJSON 并添加为矢量图层
|
|
222
|
+
var gjReader = new GeoJsonReader();
|
|
223
|
+
var features = new List<IFeature>();
|
|
224
|
+
foreach (var f in geojsonFeatures)
|
|
225
|
+
{
|
|
226
|
+
features.Add(new GeometryFeature(f.Geometry)
|
|
227
|
+
{
|
|
228
|
+
Styles = { new VectorStyle { Fill = new Brush(Color.Red) } }
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
map.Layers.Add(new MemoryLayer("Data") { Features = features });
|
|
232
|
+
|
|
233
|
+
// 3. 定位
|
|
234
|
+
var center = SphericalMercator.FromLonLat(116.4, 39.9).ToMPoint();
|
|
235
|
+
map.Navigator.CenterOnAndZoomTo(center, map.Navigator.Resolutions[10]);
|
|
236
|
+
|
|
237
|
+
MapControl.Map = map;
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### 工作流 2:Shapefile + WMS 叠加
|
|
241
|
+
|
|
242
|
+
```csharp
|
|
243
|
+
// Shapefile 图层
|
|
244
|
+
var shpProvider = new ShapeFile("china.shp", true);
|
|
245
|
+
map.Layers.Add(new Layer("China") { DataSource = shpProvider });
|
|
246
|
+
|
|
247
|
+
// WMS 图层(叠加)
|
|
248
|
+
var wmsProvider = new WmsProvider("https://geo.example.com/wms?", new[] { "rivers" });
|
|
249
|
+
map.Layers.Add(new ImageLayer("Rivers") { DataSource = wmsProvider });
|
|
250
|
+
|
|
251
|
+
map.ZoomToExtents();
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
## AI 使用建议
|
|
255
|
+
|
|
256
|
+
### 推荐工作流
|
|
257
|
+
|
|
258
|
+
1. **选择 UI 框架**:Mapsui 支持 WPF/WinUI/MAUI/Avalonia/Uno/Blazor/WinForms,根据需要选择对应的 NuGet 包
|
|
259
|
+
2. **创建 Map**:实例化 `Map`,添加图层(`TileLayer` 作为底图 + `MemoryLayer` 作为矢量覆盖层)
|
|
260
|
+
3. **数据转换**:通过 `SphericalMercator.FromLonLat()` 将经纬度转为 Web Mercator 坐标
|
|
261
|
+
4. **绑定控件**:将 `MapControl.Map` 设置为创建的 Map 对象
|
|
262
|
+
5. **添加交互**:通过 `MapControl.Info` 事件处理点击拾取,`Navigator` 控制视图
|
|
263
|
+
|
|
264
|
+
### 关键注意事项
|
|
265
|
+
|
|
266
|
+
- **NuGet 包完整**:确保安装了 `Mapsui.<UI框架>`、`Mapsui.Tiling`、`Mapsui.Nts` 三个包
|
|
267
|
+
- **投影转换**:WGS84 经纬度必须通过 `SphericalMercator.FromLonLat()` 转换后才能用于 Mapsui 定位
|
|
268
|
+
- **Shapefile 编码**:中文 Shapefile 需指定 `Encoding`(如 `Encoding.UTF8` 或 `Encoding.GetEncoding("GBK")`)
|
|
269
|
+
- **样式共享**:共享 `Brush`/`Pen`/`VectorStyle` 实例可提升性能
|
|
270
|
+
- **海量点优化**:使用 `RasterizingTileLayer` 包装海量点图层,按瓦片预渲染
|
|
271
|
+
|
|
272
|
+
## 相关技能
|
|
273
|
+
|
|
274
|
+
- **openlayers** — Web 二维地图库(JavaScript):[../openlayers/SKILL.md](../openlayers/SKILL.md)
|
|
275
|
+
- **sharpmap** — .NET 传统地图渲染引擎:[../sharpmap/SKILL.md](../sharpmap/SKILL.md)
|
|
276
|
+
- **nettopologysuite** — .NET 几何计算核心:[../nettopologysuite/SKILL.md](../nettopologysuite/SKILL.md)
|
|
277
|
+
- **geoserver** — 地图服务发布:[../geoserver/SKILL.md](../geoserver/SKILL.md)
|
|
278
|
+
|
|
279
|
+
## 参考资源
|
|
280
|
+
|
|
281
|
+
- 文档:<https://mapsui.com/v5/documentation/index.html>
|
|
282
|
+
- 示例:<https://mapsui.com/v5/samples/>
|
|
283
|
+
- 中文教程(znlgis):<https://znlgis.github.io/gis/tutorial/Mapsui/>
|