ArcPyを使用してラベルスタイル(フォント、色、サイズなど)を変更しますか?


9

さまざまなタイプのアパートメントに基づいて、レイヤー内のポイントにラベルを付けるプロセスを自動化するArcGIS 10.2用のPythonマクロを記述しようとしています。たとえば、1つのスタイルのアパートメントには、1つのラベルとして白い太字のテキストが付いた青い正方形があります。もう1つは、太字の黒いテキストが付いたピンク色の四角形です。もう1つは、白い太字のテキストが付いた赤い正方形などです。

これらのラベルのスタイルを変更するには、arcpyでどの式または関数を使用しますか?

現在、スクリプトはマップコードでアパートメントにラベルを付け、必要に応じてTOC内の名前をアパートメントに変更しています。

ここに画像の説明を入力してください

次に、ラベルのフォント、グラフィック、サイズを変更して、それぞれに固有のラベルを作成し、ボタンを作成して、これらのレイヤーのいずれかを実行する必要があるときにいつでもプロセスを自動化したいと思います。

フォント、ラベル、グラフィックをPythonスクリプト(ArcPy、IDLEなど)を使用して変更できる方法はありますか?


私はこの投稿を編集して、ここで何をしようとしているのかを最終的に説明することにしましたので、混乱はありません。基本的に、マップ上のポイントは、上の図のように見えるから、次のようになります。

ここに画像の説明を入力してください


lblClass.expression関数を使用してみましたが、使用しようとしているコードが機能しません。それはおそらく正しい方向への一歩だと思います。以下は、labelClass.expressionを取得してラベルのフォントを変更するためだけに使用したコードの一部です。

for lblClass in aptLayer.labelClasses:
lblClass.showClassLabels = True
def getLabel (Code, Type):
if Type == "MRR":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "TAX":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "MRT":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "GSS":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "TGS":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
else:
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"

lblClass.expression = getLabel( [Map_Code],[Type])

回答:


7

arcpy.mapping APIは、直接変更できる限られた数のレイヤープロパティへのアクセスのみを提供しますが、[レイヤープロパティ]ダイアログボックスにあるすべてのプロパティは、UpdateLayer関数を使用して変更できます。情報はソースレイヤーから抽出され、更新が必要なマップドキュメントのレイヤーに適用されます。source_layerは、レイヤー(.lyr)ファイルまたはマップドキュメント内のレイヤーのいずれかです。UpdateLayerは、さまざまな結果を生成するためにいくつかの異なる方法で使用できるため、堅牢な関数です。

必要に応じてシンボル/ラベルを作成し、レイヤーファイルに保存する必要があります。次に、arcpy.mapping.UpdateLayer()を使用してそのレイヤーファイルをロードします。

複数の人がpythonアドインを実行する必要がある場合は、パブリックネットワークドライブなど、誰でもレイヤーファイルにアクセスできるようにする必要があります。


最終的にカスタムのUpdate Layer Propertiesツールボックスを作成しました。ArcMap TOCでレイヤーを選択してから、入力レイヤーファイルを選択できます。次に、レイヤーファイル内のすべてのプロパティでレイヤーを更新し、元のフィーチャクラスに再ソースします。これは、gdb、mdb、shp、またはsdeにあるデータを処理します。

ソースコードを見る

ご不明な点がありましたらお知らせください。

ここに画像の説明を入力してください


すべてが設定された別のポイントベースのデータレイヤーから別のレイヤーファイルを作成しました(シンボロジーとラベル)、それは実行されますが、ラベル付けされていない、シンボル化されていないアパートメントファイル(追加する方を選択したもの)をsourceLayerアパートメントファイル。これは、「シンボルのみを更新」セクションのFalseが原因であると想定しています。これを実行してシンボルとラベルを適用するだけで、ポイントを別の場所に移動しない方法はありますか?
タイラースピアーズ

そのためにどんな機能を探しに行きますか?私はリソーシングにあまり慣れていません。ちなみに、ここまでのご協力に感謝いたします。
タイラースピアーズ

私は自分のコードに合うようにこれを調整してみました。UpdateLayer関数を介して機能しますが、35行目refocus_layer = arcpy.mapping.ListLayers(mxd, original_fc_name)[0]で、インデックスが範囲外であることを示すエラーをスローします。
タイラースピアーズ

これは、arcpy.mapping.ListLayersメソッドが現在のmxdで同じ名前のレイヤーを見つけていないことを意味しますinput_layer_file[0]範囲外のインデックスを返すインデックスは、リストにアイテムがないことを意味します)。
XIY 2014年

私は、これは非常に近いように私は感じるが、問題は、UpdateLayer部分が終了した後、それは次のようなエラーがスローされます: Traceback (most recent call last): File "E:\_Tyler Temp\Python\IanTest.py", line 30, in <module> refocus_layer = arcpy.mapping.ListLayers(mxd, original_fc_name)[0] IndexError: list index out of range
タイラー・スピアーズ

6

もう1つのオプションは、Pythonを使用してレイヤーにカスタムラベル式を設定することです(サイズや色などを変更します)。

例えば

def FindLabel ( [NAME], [POPULATION] ):
  if long([POPULATION]) >= 250000:
    return "<CLR red='255'><FNT size = '14'>" + [NAME] + "</FNT></CLR>"
  else:
    return [NAME]

ラベル式の作成

これらは次の方法で設定できます。

LabelClass(arcpy.mapping)

編集:

これを試して:

def FindLabel ([Code], [Type]):
  if [Type] == "MRR":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "TAX":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "MRT":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "GSS":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "TGS":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  else:
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"

他の行ステートメント(forループ、labClass、および関数の呼び出し)を削除できます。また、関数はFindLabelと呼ばれる必要があります。


このような機能に似たものを利用してみました。呼び出された定義を作成し、def getLabel (Code, Type)使用するさまざまなマップコードにif-elseステートメントを設定した後、 'lblClass.expression = getLabel( "[Map_Code]"、 "[Type]")'を設定します。エラーTypeError: unsupported operand type(s) for &: 'str' and 'str'は基本的にEsri Webサイトの例に従っています。フォントを変更できることを簡単に証明できる場合は、次に、さらに難しい要素(ラベルの形状、背景、色など)の調整に進みます。
タイラースピアーズ

@タイラースピアーズ、フィールド名を囲む二重引用符を削除してみてください。
アートワーク21 2014年

それを行うと、パラメーターが定義されていないと表示されます。
タイラースピアーズ

@タイラースピアーズ、あなたの質問にあなたのコードを投稿できますか?関数の括弧の外に単一引用符があります。
アートワーク21

確かに、私のコードを表示するように質問を更新しました。
タイラースピアーズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.