1

我正在将 GMAP.Net 库用于映射 Windows 应用程序。我的 Sql Server 数据库上有大约 17000 个多边形。在表单加载事件中,我从数据库中选择所有多边形并填充数据表,然后从数据表中一一绘制多边形。我还有一个树视图,我将所有 17000 个多边形名称添加到该树视图中。现在,当我选中 treeview 上的全选复选框时,我在 Treeview node_AfterCheck 事件中调用一个函数,如下所示:

Private Sub node_AfterCheck(sender As Object, e As TreeViewEventArgs)     Handles TreeView1.AfterCheck

   If e.Action <> TreeViewAction.Unknown Then
      Task.Factory.StartNew(Sub()
                                  GetPolygons(e.Node)
                              End Sub, TaskCreationOptions.LongRunning)
   End If
End Sub



Private Sub GetPolygons(node As TreeNode)
            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
End sub

此代码需要大约 40 秒才能完全运行。有没有办法优化这段代码以在更短的时间内完成?

4

2 回答 2

1

我可以看到在代码方面昂贵的一件事是Split对多边形标签的调用。但这需要衡量。

为了规避Split你可以例如尝试使用:

If _polygon.Tag.StartsWith(node1.Name) Then

考虑这个问题,看看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();

现在没有机会试一试,但我想你可以继续尝试看看这是否会有所作为。

于 2016-01-14T10:02:30.090 回答
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()

结束子

但是代码比以前需要更多的时间来完成。

于 2016-01-14T14:11:23.327 回答