performance at arcgis silverlight api

本文关键字:api silverlight arcgis at performance | 更新日期: 2023-09-27 18:35:02

我正在使用GraphicsLayer进行带有SimpleLineSymbol的道路符号系统。我的代码与以下代码相同:

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

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

performance at arcgis silverlight api

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

        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);

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

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

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

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

 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();