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秒(。请帮助我提高符号系统性能。
我将所有几何图形收集到一条折线中,并为其创建一个图形。 然后我创建符号和显示。在地图上渲染和显示需要一秒钟。
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();