sharpmap的核心是地图、图层、数据源、绘制。当这些具备的时候,Map类根据给定的缩放比例返回一张图片,sharpmap的其它操作都是建立在这个基础之上的。
一个GIS应用系统,地图显示出来仅仅只完成了第一步。针对地图需要一些gis工具和业务工具,如gis基础工具地图的漫游,面积距离量算,业务工具有兴趣点查询,添加兴趣点,路径分析等。这工具都需要在地图上进行相应的操作,才能完成,如鼠标按下、移动、抬起。sharpmap.ui类库中的MapBox地图控件采用的是if判断来完成这样的操作。参看其中的一个代码片段:
bool isStartDrag = _image != null && e.Location != _dragStartPoint && !_dragging &&
(e.Button == MouseButtons.Left || e.Button == MouseButtons.Middle) &&
//Left of middle button can start drag
!(_setActiveToolNoneDuringRedraw &&
(_activeTool == Tools.DrawLine || _activeTool == Tools.DrawPoint ||
_activeTool == Tools.DrawPolygon)); //It should not be any of these tools
//Pan can be if we have ActiveTool Pan and not doing a ShiftButtonZoom-Operation
bool isPanOperation = _activeTool == Tools.Pan &&
!(_shiftButtonDragRectangleZoom &&
(Control.ModifierKeys & Keys.Shift) != Keys.None);
按上面的代码组织方式,每加一个功能,都要写一系列的if判断,且扩展麻烦。
下面采用工具以及工具集来处理这个问题。
首先根据工具与地图的操作,定义基本交互接口
/// <summary>
/// 工具接口
/// </summary>
public interface ITool
{
/// <summary>
/// 工具名称
/// </summary>
string Name { get; }
/