簡體   English   中英

arcgis silverlight api的表現

[英]performance at arcgis silverlight api

我正在使用GraphicsLayerSimpleLineSymbol進行道路符號系統。 我的代碼與以下代碼相同:

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

這段代碼運行速度很快,但在地圖上繪制linesymbol非常慢。(大約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在服務器上呈現要素並將其作為動態地圖服務圖層使用。 這意味着你將無法使用maptips等,雖然有一些解決方法,例如在懸停時顯示彈出窗口。 您還可以輕松實現點擊識別。

您可以在線程之間划分任務以進行並行工作以獲得更好的性能。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM