DotSpatial简介
官方介绍:DotSpatial是一个NET 4.0的GIS库,具有空间数据读取、绘制、分析、以及扩展等功能。可用于:
- 在.NET窗体或Web程序下显示地图
- 读写矢量, 网格和栅格数据
- 符号化和标注
- 数据投影
- 读取并显示属性表
- 空间分析
- 读取GPS数据
DotSpatial是开源的GIS地图库,由MapWindow基础上转换而来,因此在功能上继承了原有的功能。个人觉得优缺点如下:
- 优点
符号系统比较丰富,可以做出复杂的符号
架构合理
模块分离,降低了耦合度
可扩展性强 - 缺点
图形绘制效率较MapWindow低
对较大影像支持不好
支持的投影方式少
对于一般所需的地图功能,DotSpatial基本能满足,因此也不必使用昂贵的商业软件进行二次开发了。
环境搭建
- 首先在DotSpatial官网下载发布包并解压;
新建一个WinForm工程,添加引用;
- 工具箱中添加DotSpatial.Controls.dll到常规;
- 拖动Legend和Map到窗体中,并设置Map的legend属性为legend1;
基本操作
- 添加数据
添加一个按钮,双击该按钮添加后台代码:
private void button1_Click(object sender, EventArgs e)
{
map1.AddLayers();
}
- 地图功能
map1.FunctionMode = DotSpatial.Controls.FunctionMode.Pan;//平移
map1.FunctionMode = DotSpatial.Controls.FunctionMode.ZoomIn;//放大
map1.FunctionMode = DotSpatial.Controls.FunctionMode.ZoomOut;//缩小
map1.FunctionMode = DotSpatial.Controls.FunctionMode.Select;//选择
map1.FunctionMode = DotSpatial.Controls.FunctionMode.Info;//要素识别
- 创建矢量
/// <summary>
/// 创建点
/// </summary>
private void CreateNewPointLayer()
{
FeatureSet fs = new FeatureSet(FeatureType.Point);
DotSpatial.Topology.Point point0 = new DotSpatial.Topology.Point(0, 0);
fs.AddFeature(point0);
MapPointLayer layer = new MapPointLayer(fs)
{
LegendText = "点"
};
map1.Layers.Add(layer);
}
/// <summary>
/// 创建线
/// </summary>
private void CreateNewLineLayer()
{
FeatureSet fs = new FeatureSet(FeatureType.Line);
List<Coordinate> coords = new List<Coordinate>()
{
new Coordinate(0,0),
new Coordinate(10,10),
new Coordinate(20,15)
};
LineString line = new LineString(coords);
fs.AddFeature(line);
MapLineLayer layer = new MapLineLayer(fs)
{
LegendText = "线"
};
map1.Layers.Add(layer);
}
/// <summary>
/// 创建面
/// </summary>
private void CreateNewPolygonLayer()
{
FeatureSet fs = new FeatureSet(FeatureType.Polygon);
List<Coordinate> coords = new List<Coordinate>()
{
new Coordinate(25,25),
new Coordinate(35,25),
new Coordinate(35,35),
new Coordinate(25,35)
};
Polygon polygon = new Polygon(coords);
fs.AddFeature(polygon);
MapPolygonLayer layer = new MapPolygonLayer(fs)
{
LegendText = "面"
};
map1.Layers.Add(layer);
}