【问题标题】:performance at arcgis silverlight apiarcgis silverlight api 的性能
【发布时间】:2015-02-20 13:26:55
【问题描述】:

我使用GraphicsLayerSimpleLineSymbol 进行道路符号。 我的代码与下面的代码相同:

    for (int i = 0; i < 200000; i++)
    {
        myGraphicsLayer.Graphics[i].Symbol = mySimpleLineSymbol;
    }

此代码运行速度很快,但在地图上绘制线条符号非常慢。(大约 6 秒)。 请帮助我提高符号系统的性能。

【问题讨论】:

  • 在此循环之后,您是否在将其添加到地图之前设置了该图层的隐藏标志?我认为您可以在 refresh() 期间利用图层的更新结束事件,然后您可以在其中调用 show()。 { 注意:我的应用程序中没有足够的符号来研究这种方法,但你有 }。

标签: c# silverlight rendering silverlight-5.0 arcgis


【解决方案1】:

我将所有几何图形收集到一条折线上并为此创建一个图形。然后我创建符号并显示。在地图上渲染和显示需要一秒钟

        var myPolyline = new ESRI.ArcGIS.Client.Geometry.Polyline();

        for (int i = 0; i < 200000; i++)
        {
            myPolyline.Paths.Add(((ESRI.ArcGIS.Client.Geometry.Polyline)myGraphicsLayer.Graphics[i].Geometry).Paths[0]);
        }

        Graphic myGraph = new Graphic();

        myGraph.Geometry = myPolyline;

        ESRI.ArcGIS.Client.Symbols.SimpleLineSymbol sym = new ESRI.ArcGIS.Client.Symbols.SimpleLineSymbol();

        sym.Color = new SolidColorBrush(Colors.Red);

        sym.Width = 2;

        myGraph.Symbol = sym;

        myGraphicsLayer.Graphics.Add(myGraph);

【讨论】:

    【解决方案2】:

    这是很多行。一种想法是减少需要绘制的线条数量。您可以检查地图的缩放级别或比例,并使用它来确定要绘制的线。例如,可能在某些比例下您只绘制特定的道路,例如主要道路。您可以通过在循环中添加一个 if 语句来检查特定属性(假设存在)来做到这一点:

    if (myGraphicsLayer.Graphics[i].Attributes["Type"] == "major") { }
    

    【讨论】:

    • 事实上所有的行都是主要的。
    【解决方案3】:

    由于您拥有许多功能,因此性能总是会受到影响,尽管需要考虑一些事项。首先确保您拥有 Silverlight 和 Esri API 的最新版本,因为在较新的版本中通常会有性能改进。由于您在客户端上进行渲染,因此主机的规格会影响性能,如果您不能利用与比例相关的渲染或特征集群,而您只是使用基本特征符号,那么获得更好性能的唯一方法是使用 ArcGIS Server 在服务器上渲染要素并将其作为动态地图服务图层使用。这将意味着您将无法使用地图提示等,尽管有一些解决方法,例如在悬停时显示弹出窗口。您还可以轻松实现点击识别。

    【讨论】:

    • 由于我必须在客户端进行渲染,而且我有点受限。有没有办法让我知道代码执行完成渲染后的时间? GraphicsLayer 中是否有此事件?
    • 您可以尝试收听地图进度事件,但我不记得是否会触发图形图层。另外,您是否尝试过使用渲染器而不是在每个功能上设置符号?这样会更快。
    • Graphicslayers 不会触发地图进度事件,我测试渲染器属性而不是设置符号;它比设置的 Symbol Property 慢。我测试 SimpleRenderer 和 UniqueValueRenderer。
    【解决方案4】:

    您可以在线程之间划分任务以进行并行工作以获得更好的性能。

     new Thread(() =>
                {
                    Deployment.Current.Dispatcher.BeginInvoke(() =>
                    {
                        for (int j = 0; j < 50000; j++)
                        {
    
                            myGraphicsLayer.Graphics[j].Symbol = mySimpleLineSymbol;
                        }
                    });
    
                }
    ).Start();
    
    
                new Thread(() =>
                {
                    Deployment.Current.Dispatcher.BeginInvoke(() =>
                    {
                        for (int k = 50000; k < 100000; k++)
                        {
                            myGraphicsLayer.Graphics[k].Symbol = mySimpleLineSymbol;
                        }
                    });
    
                }
    ).Start();
    
    
                new Thread(() =>
                {
                    Deployment.Current.Dispatcher.BeginInvoke(() =>
                    {
                        for (int l = 100000; l < 150000; l++)
                        {
                            myGraphicsLayer.Graphics[l].Symbol = mySimpleLineSymbol;
                        }
                    });
    
                }
    ).Start();
    
    
                new Thread(() =>
                {
                    Deployment.Current.Dispatcher.BeginInvoke(() =>
                    {
                        for (int m = 150000; m < 200000; m++)
                        {
                            myGraphicsLayer.Graphics[m].Symbol = mySimpleLineSymbol;
                        }
                    });
    
                }
    ).Start();
    

    【讨论】:

      猜你喜欢
      • 2013-04-13
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 2010-12-09
      • 1970-01-01
      相关资源
      最近更新 更多