协作头脑风暴
brainstorming
在实现前澄清需求、探索设计选择,并形成清晰的开发方向。
sharpmap【开发与工程】Use when rendering 2D maps in legacy .NET WinForms or ASP.NET WebForms applications. SharpMap: an older .NET 2D mapping library. For new projects, prefer Mapsui.
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
name: sharpmap description: "Use when rendering 2D maps in legacy .NET WinForms or ASP.NET WebForms applications. SharpMap: an older .NET 2D mapping library. For new projects, prefer Mapsui." tags:
项目地址: https://github.com/SharpMap/SharpMap
官方文档: https://github.com/SharpMap/SharpMap/wiki
NuGet:
SharpMap、SharpMap.UI.WinForms(SharpMap 最新稳定版 1.2.0,截至2026年)许可证: LGPL-2.1
SharpMap 提供:
VectorLayer、LabelLayer、TileLayer、WmsLayerVectorStyle、LabelStyle、按属性主题样式ProjNetMapBox注意:SharpMap 主要面向 .NET Framework / 较旧 .NET,新项目建议改用 Mapsui。
dotnet add package SharpMap
dotnet add package SharpMap.UI.WinForms
dotnet add package SharpMap.Extensions
dotnet add package ProjNet
| 类型 | 说明 |
|---|---|
Map | 地图 |
ILayer / VectorLayer / LabelLayer / TileLayer | 图层 |
IProvider | 数据提供者 |
VectorStyle / LabelStyle | 样式 |
using SharpMap;
using SharpMap.Layers;
using SharpMap.Data.Providers;
using SharpMap.Styles;
using System.Drawing;
var map = new Map(new Size(800, 600));
var prov = new ShapeFile("countries.shp", true);
var layer = new VectorLayer("countries", prov)
{
Style = new VectorStyle {
Fill = new SolidBrush(Color.LightGreen),
Outline = Pens.Black,
EnableOutline = true
}
};
map.Layers.Add(layer);
var labels = new LabelLayer("labels") {
DataSource = prov,
LabelColumn = "NAME",
Style = new LabelStyle { Font = new Font("Arial", 10) }
};
map.Layers.Add(labels);
map.ZoomToExtents();
mapBox1.Map = map;
mapBox1.Refresh();
var conn = "Host=localhost;Database=gisdb;User Id=postgres;Password=pg";
var prov = new PostGIS(conn, "poi", "geom", "id");
map.Layers.Add(new VectorLayer("poi", prov));
using BruTile.Predefined;
var src = KnownTileSources.Create(KnownTileSource.OpenStreetMap);
map.Layers.Add(new TileAsyncLayer(src, "OSM"));
map.SRID = 3857;
using SharpMap.Rendering.Thematics;
var theme = new CustomTheme(row => {
var pop = (int)row["POP"];
return new VectorStyle {
Fill = new SolidBrush(pop > 1_000_000 ? Color.Red : Color.Blue)
};
});
layer.Theme = theme;
using ProjNet.CoordinateSystems;
using ProjNet.CoordinateSystems.Transformations;
var ctf = new CoordinateTransformationFactory();
layer.CoordinateTransformation = ctf.CreateFromCoordinateSystems(
GeographicCoordinateSystem.WGS84,
ProjectedCoordinateSystem.WebMercator);
map.SRID = 3857;
using var img = map.GetMap();
img.Save("map.png");
// ASP.NET WMS
public void ProcessRequest(HttpContext ctx)
{
var map = MapHelper.InitializeMap();
SharpMap.Web.Wms.WmsServer.ProcessRequest(ctx, map);
}
mapBox1.MouseDown += (s, e) => {
var pt = mapBox1.Map.ImageToWorld(new PointF(e.X, e.Y));
var ds = new SharpMap.Data.FeatureDataSet();
layer.DataSource.ExecuteIntersectionQuery(
new NetTopologySuite.Geometries.Envelope(pt.X-1e-3, pt.X+1e-3,
pt.Y-1e-3, pt.Y+1e-3), ds);
foreach (FeatureDataRow row in ds.Tables[0].Rows)
Console.WriteLine(row["NAME"]);
};
.qix、PostGIS GiST)TileAsyncLayer 用于在线底图LabelLayer 启用优先级与碰撞检测Brush/Pen/VectorStyle| 问题 | 解决 |
|---|---|
| 无图 | 检查 SRID、ZoomToExtents |
| 文字模糊 | 设置高 DPI Aware、MapBox.MapTransform |
| GDI+ 内存泄漏 | 释放 Brush/Pen/Bitmap |
| Shapefile 中文乱码 | new ShapeFile(path, true, false, Encoding.UTF8) |
using SharpMap;
using SharpMap.Layers;
using SharpMap.Data.Providers;
using SharpMap.Styles;
using SharpMap.Rendering.Thematics;
using System.Drawing;
// 创建地图
var map = new Map(new Size(1024, 768));
map.SRID = 4326;
// 添加 Shapefile 图层
var prov = new ShapeFile("countries.shp", true);
var layer = new VectorLayer("Countries", prov)
{
Style = new VectorStyle
{
Fill = Brushes.LightGreen,
Outline = Pens.Black,
EnableOutline = true
}
};
// 按人口设置主题样式
layer.Theme = new CustomTheme(row =>
{
var pop = (int)row["POP_EST"];
return new VectorStyle
{
Fill = new SolidBrush(pop > 100_000_000 ? Color.Red : Color.LightBlue)
};
});
map.Layers.Add(layer);
// 添加行政标注
var labels = new LabelLayer("Labels")
{
DataSource = prov, LabelColumn = "NAME",
Style = new LabelStyle { Font = new Font("Arial", 10) }
};
map.Layers.Add(labels);
// 渲染
map.ZoomToExtents();
using var img = map.GetMap();
img.Save("output.png");
// PostGIS 数据
var pgConn = "Host=localhost;Database=gisdb;User Id=postgres;Password=pg";
var poiProvider = new PostGIS(pgConn, "poi", "geom", "id");
map.Layers.Add(new VectorLayer("POI", poiProvider)
{
Style = new VectorStyle { Fill = Brushes.OrangeRed }
});
// OSM 底图
using BruTile.Predefined;
var tileSrc = KnownTileSources.Create(KnownTileSource.OpenStreetMap);
map.Layers.Add(new TileAsyncLayer(tileSrc, "OSM"));
map.SRID = 3857;
new Map(new Size(width, height)) → 设置 SRIDShapeFile(path) / PostGIS(conn, table, geomCol, idCol) 等方式连接数据VectorLayer(name, provider) 并设置 Style;按需添加 LabelLayerTileAsyncLayer + BruTile 加载 OSM 在线底图map.GetMap() 获取 Image 对象 → 保存为 PNG 或通过 ASP.NET WMS 发布CoordinateTransformation 转换.qix 索引,PostGIS 用 GiST 索引加速查询Brush/Pen/Bitmap 需及时释放避免内存泄漏Encoding.UTF8 或 Encoding.GetEncoding("GBK")