精良的架构设计,健壮的代码使DotSpatial十分强大。近日某人说DotSpatial有闪烁问题,我半信半疑,决定亲自试验一下。首先新建一个地图函数,取名为MultithreadFunction,声明一些变量,代码如下:
using DotSpatial.Controls;
using DotSpatial.Data;
using DotSpatial.Symbology;
using DotSpatial.Topology;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace CustomLayer
{
class MultithreadFunction : MapFunction
{
MapGroup layerGroup;
List<Thread> threads;
bool bRunning;
private const double COORDINATE_STARTX = 880468.25;
private const double COORDINATE_STARTY = 3828144.59;
private Random random;
private Extent orignalExtent;
public MultithreadFunction(IMap mapCtrl, MapGroup layerGroup)
: base(mapCtrl)
{
this.layerGroup = layerGroup;
threads = new List<Thread>();
random = new Random();
bRunning = false;
}
}
}
一、重载地图函数激活事件,初始化图层、线程列表等 等,代码如下:
protected override void OnActivate()
{
base.OnActivate();
layerGroup.Layers.Clear();
orignalExtent = Map.ViewExtents;
Map.ViewExtents = new Extent(COORDINATE_STARTX + 5000, COORDINATE_STARTY, COORDINATE_STARTX + 105000, COORDINATE_STARTY + 100000);
for (var i = 1; i <= 200; i++)
{
var layer = new MapLineLayer();
var coord = new Coordinate(COORDINATE_STARTX, COORDINATE_STARTY + i * 5000);
layer.Symbolizer = new LineSymbolizer(Color.Red, 2.5);
layer.FeatureSet.AddFeature(new Feature(FeatureType.Line, new List<Coordinate>() { coord, coord }));
layerGroup.Layers.Add(layer);
}
for (var i = 0; i < 10; i++)
threads.Add(new Thread(DoThread) { });
bRunning = true;
foreach (var t in threads)
t.Start();
}
private void DoThread(object obj)
{
while (bRunning)
{
lock (layerGroup)
{
for (var i = 0; i < layerGroup.Layers.Count; i++)
{
var line = layerGroup.Layers[i] as MapLineLayer;
var coords = line.FeatureSet.Features[0].Coordinates;
var coord = new Coordinate(coords.Last().X + random.Next(1000, 5000), COORDINATE_STARTY + i * 5000 + random.Next(1000, 5000));
coords.Add(coord);
line.FeatureSet.InitializeVertices();
}
}
Map.ViewExtents = Map.ViewExtents;
Thread.Sleep(random.Next(2000, 5000));
}
}
三、重载地图函数失效事件,结束并清理线程,代码如下:
protected override void OnDeactivate()
{
base.OnDeactivate();
bRunning = true;
foreach (var thread in threads)
thread.Abort();
threads.Clear();
Map.ViewExtents = orignalExtent;
}
实验证明,在保证1000的并发量下,地图偶尔会闪烁一下。其它情况下,地图运行非常流程。这一点DotSpatial不比ArcGIS逊色,一次为DotSpatial点赞。下面是运行效果截图: