我使用GMAP.Net库作为映射窗口应用程序。 我的Sql Server数据库上有大约17000个多边形。在表单加载事件中,我从数据库中选择所有多边形并填充数据表,然后从数据表中逐个绘制多边形。 我还有一个树视图,我将所有17000个多边形名称添加到该树视图中。 现在,当我选中treeview上的select all复选框时,我在Treeview中调用一个函数node_AfterCheck事件,如下所示:
a -> Bool
此代码大约需要40秒才能完全运行。有没有办法优化此代码以在更短的时间内完成?
答案 0 :(得分:1)
我可以看到代码昂贵的一件事就是在多边形的标签上调用Split
。但这将受到衡量。
要绕过Split
,例如尝试使用:
If _polygon.Tag.StartsWith(node1.Name) Then
考虑this question,了解IsPrefix
是否更快。
然而,我假设主要的麻烦是在设置每个多边形的可见性时不断刷新/重绘地图(“自动刷新”)。我在消息来源中发现的一件事是将Invalidation
置于保持状态:
// docs: stops immediate markers/route/polygon invalidations; call Refresh to perform single refresh and reset incalidation state
gmap2.HoldInvalidation = true;
// do your update loop within here
// docs: call this to stop HoldInvalidation and perform single forced instant refresh
gmap2.Refresh();
现在没有机会尝试一下,但我想你可以继续尝试,看看是否有所作为。
答案 1 :(得分:0)
感谢您的快速回复,我改变了我的代码:
Private Sub GetPolygons(node As TreeNode)
myMap.HoldInvalidation = True
Dim objectId As String
Dim _polygon As GMapPolygon
For Each node1 As TreeNode In node.Nodes
objectId = node1.Name
For Each _polygon In polyOverlay.Polygons.AsParallel
itemTag = _polygon.Tag.ToString.Split("|")
If itemTag (0) = node1.Name Then
_polygon.IsVisible = node.Checked
Exit For
End If
Next
Next
myMap.Refresh()
结束子
但是代码比以前需要更长的时间才能完成。