FAQ
ArcObjects でシンボルのサイズやラインの太さを一括で変更する方法

ナレッジ番号:5578 | 登録日:2023/07/27 | 更新日:2024/11/21

概要

ArcGIS for Desktop のレイヤーで、すでに設定されているシンボルに対して、レンダラーやシンボルの種類に関係なくシンボルのサイズやラインの太さを一括で変更するためのサンプル コードをご紹介いたします。

詳細    

レイヤーに定義しているレンダラーによって、シンボルを取得する方法が異なります。
取得したレンダラー オブジェクトが、どのインターフェイスにキャストできるかを「is」演算子を使用して特定します。
単一シンボルであれば「ISimpleRenderer」、個別値分類であれば「IUniqueValueRenderer」 、 数値分類であれば「IClassBreaksRenderer」を設定し特定します。
また、シンボルの種類(ポイント、ライン、ポリゴン)によってサイズの変更方法が異なりますので、取得したシンボルの種類ごとにコードを書いていく必要があります。

・ポイントであれば IMarkerSymbol::Size プロパティで変更
・ポリラインであれば ILineSymbol::Width プロパティで変更
・ポリゴンであれば IFillSymbol::Outline プロパティに ILineSymbol オブジェクトを設定して変更

例えば、シンプル マーカー シンボルとピクチャー マーカー シンボルは IMarkerSymbol 型を継承しているので、各インターフェイス(SimpleMarkerSymbol や PictureMarkerSymbol)を取得しなくても、IMarkerSymbol::Size プロパティを使用するだけで、シンボルのサイズを変更することができます。

シンボルの種類の詳細に関しては下記ヘルプ ページをご参照ください。
ISymbol Interface

サンプル コード

レンダラーやシンボルの種類が異なる 4 つのシンボルのサイズやラインの太さを一括で変更します。

サンプルでサイズやラインの太さを変更するシンボルの詳細:

・単一シンボルのシンプル マーカー シンボル
・単一シンボルのピクチャー マーカー シンボル
・個別値分類のカート グラフィック シンボル
・数値分類のシンプル塗りつぶしシンボル

Image

//名前空間の設定
using ESRI.ArcGIS.ArcMapUI;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Display;

protected override void OnClick()
{        
   //マップ ドキュメントの取得
   IMxDocument pMxDocument = ArcMap.Document;
   //マップの取得        
   IMap pMap = pMxDocument.FocusMap;

   //空のレイヤー オブジェクトの作成
   ILayer pLayer = null;
   //マップに追加されているレイヤー群の取得
   IEnumLayer pEnumLayer = pMap.get_Layers();
   //最初のレイヤーにアクセス
   pLayer = pEnumLayer.Next();
        
   while(pLayer != null)
   {
      // フィーチャ レイヤー以外の場合
      if (!(pLayer is IFeatureLayer))
      {
         //次のレイヤーにアクセス
         pLayer = pEnumLayer.Next();
         continue;
      }

      //フィーチャ レイヤーの場合   
      else
      {
         //フィーチャ レイヤーからレンダラーを取得
         IFeatureLayer pFeatureLayer = (IFeatureLayer)pLayer;
         IGeoFeatureLayer pGeoFeatureLayer = (IGeoFeatureLayer)pFeatureLayer;
         IFeatureRenderer pFeatureRenderer = pGeoFeatureLayer.Renderer;

         //個別値分類の場合
         if (pFeatureRenderer is IUniqueValueRenderer)
         {
            IUniqueValueRenderer pUniqueValueRenderer = (IUniqueValueRenderer)pFeatureRenderer;

            //個別値の各値に以下の処理を実行
            for (int i = 0; i < pUniqueValueRenderer.ValueCount; i++)
            {
               //値を取得
               string value = pUniqueValueRenderer.get_Value(i);
               //シンボルを取得
               ISymbol pSymbol = pUniqueValueRenderer.get_Symbol(value);

               if (pSymbol is ILineSymbol)
               {
                  //ライン シンボルの幅を変更
                  ILineSymbol pLineSymbol = (ILineSymbol)pSymbol;
                  pLineSymbol.Width = 5;
               }
               //変更を設定
               pUniqueValueRenderer.set_Symbol(value, pSymbol);
            }
         } 
        
         //単一シンボルの場合
         else if (pFeatureRenderer is ISimpleRenderer)
         {
            //シンボルにアクセス
            ISimpleRenderer pSimpleRenderer = (ISimpleRenderer)pFeatureRenderer;
            ISymbol pSymbol = pSimpleRenderer.Symbol;

            if (pSymbol is IMarkerSymbol)
            {
               //サイズを変更
               IMarkerSymbol pMarkerSymbol = (IMarkerSymbol)pSymbol;
               pMarkerSymbol.Size = 25;
            }
         }

         //数値分類の場合
         else if (pFeatureRenderer is IClassBreaksRenderer)
         {
            IClassBreaksRenderer pClassBreaksRenderer = (IClassBreaksRenderer)pFeatureRenderer;

            //数値分類の各値に以下の処理を実行
            for (int i = 0; i < pClassBreaksRenderer.BreakCount; i++)
            {
               //シンボルを取得
               ISymbol pSymbol = pClassBreaksRenderer.get_Symbol(i);

               if (pSymbol is IFillSymbol)
               {
                  //塗りつぶしシンボルのアウトラインを変更
                  IFillSymbol pFillSymbol = (IFillSymbol)pSymbol;
                  ILineSymbol pLineSymbol = (ILineSymbol)pFillSymbol.Outline;
                  pLineSymbol.Width = 3;
                  pFillSymbol.Outline = pLineSymbol;
               }
               //変更を設定
               pClassBreaksRenderer.set_Symbol(i, pSymbol);
            }
         }
         //次のレイヤーにアクセス
         pLayer = pEnumLayer.Next();
      }
   }
   //アクティブ ビューを更新
   ArcMap.Document.ActiveView.Refresh();
   //コンテンツ ウィンドウを更新
   pMxDocument.UpdateContents();
}

メタデータ

機能

種類

製品