ArcMapのシンボル描画パフォーマンスが変化する現象

      2017/11/22

ArcMapの[データの追加]から追加したレイヤに設定されているデフォルトのシンボル表示速度が,一度[シンボル選択]ダイアログで別のシンボルを選択したり,[シンボル プロパティ エディタ]ダイアログを開いて[OK]を押すと(設定を変更しなくても)遅くなります。気になった人は50万点ぐらいのポイント フィーチャクラスを用意してArcMapに追加した標準の描画速度と,ダイアログでOKを押したときの描画速度を比べてみてください。

この現象は人から聞いた話なんですが,実際の設定を何も変更していないのに,[OK]を押しただけで描画速度が遅くなるとは何とも不可解です。その原因ですが,

[データの追加]で表示したレイヤのレンダラ(単一シンボル)にはSimpleMarkerSymbolが適用されているが,一度[シンボル選択]ダイアログで別のシンボルを変更したり,[シンボル プロパティ エディタ]ダイアログを開いて[OK]を押すとレンダラにMultiLayerMarkerSymbolが適用される

というものです。OMDで示すとレンダラに適用されるオブジェクトは図のように変化します。

SimpleMarkerSymbol
[データの追加]で表示した時点のレンダラに割り当てられるシンボル

MultiLayerMarkerSymbol
[シンボル選択]ダイアログで別シンボルを選択したり,[シンボル プロパティ エディタ]ダイアログで[OK]を押下した場合

MultiLayerMarkerSymbolは複数のマーカー シンボルを重ね合わせて表現できるのですが,より複雑に表現出来る分描画パフォーマンスは下がってしまうという訳です。ライン レイヤはMultiLayerLineSymbolに,ポリゴン レイヤはMultiLayerPolygonSymbolにそれぞれ変化します。

この現象は5年前にArcGIS Engineで汎用ビューワを作成してる最中に気づいたもので,よくこんな仕様を突き止めていたなと我ながら関心しました。でもパフォーマンスが下がるところまではその時気づかなかったので,気づいた人はすごいと思います。やっぱり実務で膨大なデータを使わないと気づかないことって多いですね。

さて,この下がった描画パフォーマンスを元に戻す方法,逆を言えばカスタマイズしたシンボルの描画速度を向上させる方法ですが,おそらくGUIでは不可能です。ただし,ArcObjectsを使えば直せます。

以下のコードをVBEditorに貼り付けてマクロを実行してください。

'マルチレイヤ シンボルをシングル レイヤのシンボルに変更するサンプル
'ポイント レイヤで,且つ対象のシンボルがマルチレイヤ マーカー シンボルでないことが前提
Public Sub ChangeMarkerSymbol()
    '現在のドキュメントを取得
    Dim pMxDocument As IMxDocument
    Set pMxDocument = ThisDocument

    'アクティブなデータフレームの取得
    Dim pMap As IMap
    Set pMap = pMxDocument.FocusMap

    '最上位レイヤをIGeoFeatureLayerとして取得
    Dim pGeoFeatureLayer As IGeoFeatureLayer
    Set pGeoFeatureLayer = pMap.Layer(0)

    'レンダラ(単一シンボル)
    Dim pSimpleRenderer As ISimpleRenderer
    Set pSimpleRenderer = pGeoFeatureLayer.Renderer

    If TypeOf pSimpleRenderer.Symbol Is IMultiLayerMarkerSymbol Then
        'レンダラのシンボルがマルチレイヤ マーカー シンボルの場合
        Dim pMultiLayerMarkerSymbol As IMultiLayerMarkerSymbol
        Set pMultiLayerMarkerSymbol = pSimpleRenderer.Symbol

        'レンダラにマルチレイヤ マーカー シンボルの最上位シンボルを適用
        Set pSimpleRenderer.Symbol = pMultiLayerMarkerSymbol.Layer(0)

        MsgBox "MultiLayerMarkerSymbolをシングル レイヤ シンボルに変更しました。"

    Else
        'レンダラのシンボルがマルチレイヤ マーカー シンボルではない場合
        MsgBox "このレイヤはMultiLayerMarkerSymbolではありません。"

    End If

End Sub

 - GIS, ArcGIS