プロジェクトを開いてデータセットを確認

Python を使用してデータセットのリストを作成および記述する前に、プロジェクト データの .zip ファイルをダウンロードおよび展開し、ArcGIS Pro でデータセットを確認します。

  1. このチュートリアルのデータ」をダウンロードして、お使いのコンピューター上の場所にコンテンツを展開します。

    .zip ファイルには [PythonDesc] というフォルダーがあります。

    このチュートリアルでは、C:\Lessons\PythonDesc\ にデータが表示されます。 別のフォルダーを使用することもできますが、以下の手順およびコードでそのパスを必ず調整してください。

  2. ArcGIS Pro を起動します。
  3. ArcGIS Pro[新しいプロジェクト] の下にある [テンプレートを使用せずに開始] をクリックします。

    テンプレートを使用せずに開始します。

    Untitled という名前の新しいプロジェクトが開きます。 データを確認するためだけに ArcGIS Pro を使用するので、プロジェクト名を変更して作業を保存する必要はありません。

  4. [カタログ] ウィンドウがまだ表示されていない場合は、[表示] タブで [カタログ ウィンドウ] をクリックします。
  5. [カタログ] ウィンドウで [フォルダー] を右クリックしてから [フォルダー接続の追加] をクリックします。

    フォルダー接続を追加します。

  6. [フォルダー接続の追加] ウィンドウで PythonDesc.zip ファイルを抽出した場所 (C:\Lessons) を参照し、[PythonDesc] フォルダーをクリックして [OK] をクリックします。
  7. [カタログ] ウィンドウで、[フォルダー] を展開し、[PythonDesc] を展開します。

    PythonDesc フィルダーのコンテンツ

    フォルダーには、2 つのシェープファイル ([bike_routes.shp][watersheds.shp])、テキスト ファイル ([bike_racks.csv])、およびデータベース テーブル ([gardens.dbf]) が含まれています。 [DC.gdb] という名前のジオデータベースも含まれています。

  8. [DC.gdb] を展開します。

    が展開されました。

    ジオデータベースには、3 つのフィーチャクラス ([boundary][neighborhoods][public_schools])、1 つのテーブル ([car_share_locations])、および 1 つのフィーチャ データセット ([Transportation]) が含まれています。

  9. [Transportation] を展開します。

    Transportation データセットが展開されました。

    フィーチャ データセットには、4 つのフィーチャクラス ([roads][street_lights][traffic_analysis_zones][traffic_junctions]) と 1 つのネットワーク データセット ([traffic]) が含まれています。

    データセットは GIS プロジェクトの特色を示しており、さまざまな形式のフィーチャクラスおよびテーブル データのほか、このデータを構成するためのその他のエレメントが含まれています。 Python コードを使用し、タイプおよびその他のプロパティに基づいてこれらのデータセットを識別します。 これらのグループでは、プロジェクト データが複数のレベルで入れ子構造になっていることを意味します。

    Python コードを操作する前に、コンピューター上の実際のファイルを確認して、これらのデータセットを調査することもできます。

  10. Microsoft File Explorer を開き、C:\Lessons\PythonDesc\ フォルダー、または PythonDesc フォルダーを配置した他の場所を参照します。

    Windows ファイル エクスプローラー内のフォルダーのコンテンツ

    File Explorer にファイルが表示されます。 2 つのスタンドアロン テーブル ([bike_racks.csv][gardens.dbf]) は、それぞれ単一のファイルです。 [bike_routes] および [watersheds] シェープファイルは、それぞれ同名でファイル拡張子が異なる複数のファイルから構成されています。 [DC] ジオデータベースは、.gdb ファイル拡張子を含むフォルダーです。

  11. File Explorer で、[DC.gdb] フォルダーを展開します。

    ジオデータベースのコンテンツ

    このフォルダー内には多数のファイルがあります。 これらのファイルと、ArcGIS Pro[カタログ] ウィンドウでジオデータベースを表示した際に表示されるデータ エレメントとの間に、明確に認識できるリンクは存在しません。 たとえば、1 つの特定のフィーチャクラスを構成する 1 つ以上のファイルを識別することはできません。 このことは、Python コードで GIS データセットを使用する際、異なる形式のデータセットにアクセスして操作する方法に影響するため重要です。

  12. ArcGIS Pro と Windows ファイル エクスプローラーで、データの構成を調べました。 次に、Python ファイルを開き、Python を使用してこのデータのリストを作成および記述する作業を開始します。

Python スクリプト ファイルを開く

このチュートリアルでは、IDLE を使用して Python コードを記述します。 IDLE は Python に付属している基本的な ArcGIS Pro エディターです。

コードを実行する際に Python にインストールされている ArcGIS Pro の正しいバージョンを使用するには、IDLE を起動するショートカットを使用します。

ArcGIS Desktop (ArcMap) もインストールされている場合、ショートカット メニューに [Edit with IDLE] ショートカットも表示されます。 古いバージョンの Python が起動されるため、このショートカットは使用しないでください。

  1. File Explorer で、C:\Lessons\PythonDesc\ フォルダーまで 1 レベル分戻ります。
  2. [describe_data.py] ファイルを右クリックして、[Edit with IDLE (ArcGIS Pro)] をクリックします。

    Edit with IDLE (ArcGIS Pro)

    この方法で IDLE を開くと、Python のアクティブな ArcGIS Pro 環境を使用してスクリプトが開きます。 これにより、正しいバージョンの Python が使用されます。 このチュートリアルでは IDLE をコード エディターとして使用しますが、コードは PyCharm や Spyder などの他の Python エディターでも動作し、Python ウィンドウや ArcGIS Pro 内の [ノートブック] でも同様に動作します。

    注意:
    [Edit with IDLE (ArcGIS Pro)] がショートカット メニューに表示されない場合は、[スタート] をクリックして [ArcGIS] を展開し、[Python コマンド プロンプト] をクリックします。 [Python コマンド プロンプト] ウィンドウに「idle」と入力して Enter キーを押します。 IDLE (Python 3.7 Shell) が表示されます。 [File] をクリックして [Open] をクリックします。 [describe_data.py] ファイルを参照して開きます。

    スクリプトが開きます。

    IDLE で開いているスクリプト。

    このスクリプトには、最初に必要な 3 行のコードが含まれています。 1 行目の import arcpy は、ArcPy パッケージをインポートしています。 これにより、GIS データセットのリストおよび記述に使用する関数など、ArcPy の機能がスクリプトで使用できるようになります。

    2 行目は、データが存在するパスを指定しています。 この値は、mypath という名前の変数に割り当てられます。

    パスでは、単一のバックスラッシュ (/) ではなく、単一のスラッシュ (\) が使用されます。 Python では単一のバックスラッシュはエスケープ文字として使用されるため、パス内で使用すると予期しない結果が生じる可能性があります。 直後に他の特定の文字を指定すると、特別な振舞いがエンコードされます。 たとえば、\t はタブを意味するため、C:\Lessons\toronto.gdb などのパスでは内部にタブが追加され、エラーが発生します。

    単一のスラッシュの代わりに、文字列 (r) の前に文字 r"C:\Lessons\PythonDesc" (raw 文字列) を追加したり、2 つのバックスラッシュを使用したり ("C:\\Lessons\\PythonDesc") することもできます。 この 3 つの表記はいずれも正常に動作します。

    3 行目は、ワークスペースを設定しています。 ワークスペースは、入力データセットや出力データセットなど、操作するファイルのデフォルトの場所です。 ワークスペースは「mypath」変数に設定されます。 「mypath」変数を使用せずに直接ワークスペースを設定することもできますが、データが存在するパスに対して別の変数を使用することにはさまざまなメリットがあります。

  3. PythonDesc フォルダーを C:\Lessons\PythonDesc\ 以外の場所に保存した場合、スクリプト内のパスを編集して、フォルダーを保存した場所を指定します。

    たとえば、このチュートリアルのデータを C:\EsriLessons フォルダーに抽出した場合、2 行目を次のように編集する必要があります。

    mypath = "C:/EsriLessons/PythonDesc"

    パスが比較的長い場合は、ファイル エクスプローラーからパスをコピーし、スクリプトに貼り付けることができます。 この操作を行うには、フォルダーを右クリックするか (Windows 11)、Shift キーを押しながらフォルダーを右クリックし (Windows 10)、[パスのコピー] をクリックします。 その後、スクリプトから古いパスを選択して削除し、Ctrl + V キーを押して新しいパスを貼り付けます。

    パスを有効なワークスペースとして使用するには、Python 文字列である必要があります (パスを引用符で囲む必要があります)。 また、前述のパスの 3 つの正しいスタイルのうち、いずれかを使用する必要があります。 Windows パスをコピーすると、バックスラッシュが含まれます。 すべてのバックスラッシュを 2 つのバックスラッシュまたは単一のスラッシュで置き換えることができます。 長いパスの場合、文字列の前に r を追加して、raw 文字列にする方法が最も簡単です。 これにより、バックスラッシュがエスケープ文字として読み取られなくなります。

    次に、コードをテストします。

  4. [File] をクリックして、[Save] をクリックします。
  5. [Run] をクリックし、[Run Module] をクリックします。

    IDLE Shell ウィンドウが開き、スクリプトに対してシェルが再起動されたことを示すメッセージが表示されます。 スクリプトのパスとファイル名が表示されます。 数秒間一時停止した後、IDLE Shell プロンプト >>> が返されます。

    スクリプトの実行中に、

    スクリプトにはシェルにデータを出力する命令が含まれていないため、何も変化がないように見えるかもしれません。 後で、シェルに情報を返すため、コードに print 文を追加します。

    IDLE Shell では、コード行を入力してすぐに実行することもできます。

  6. IDLE Shell で、プロンプト >>> の後に「print(arcpy.env.workspace)」と入力し、Enter キーを押します。

    ワークスペースを出力します。

    スクリプトで設定したワークスペースのパスが IDLE Shell に出力されます。 スクリプトにより、arcpy モジュールがインポートされ、チュートリアル データへのパスを含む文字列に一致するように mypath 変数が設定され、arcpy のワークスペースがそのパスに設定されました。 シェルで arcpy.env.workspace の値を出力することで、スクリプトが機能していることを示しました。

  7. IDLE Shell ウィンドウを閉じます。

ワークスペースを設定すると、完全なパスではなくファイル名でデータセットを参照できます。

Python を使用したデータセットの記述

スクリプトでワークスペースを設定したので、Python を使用して、ワークスペース内のデータセットのプロパティを記述することができます。

これを行うには、da.Describe() 関数を使用します。

  1. IDLE エディター ウィンドウで、arcpy.env.workspace = mypath 行の後ろをクリックし、Enter キーを押して新しい行を追加します。
  2. 次のコードを入力して Enter キーを押します。

    desc = arcpy.da.Describe("bike_routes.shp")

    自転車ルートを記述します。

    da.Describe() 関数は arcpy.da モジュールの関数で、データ アクセス ワークフローに使用されます。 この関数は、Python辞書」を返します。 Python 辞書は、キーとキーに対応する値のペアで構成されています。 da.Describe() で返される辞書のキーは、データセットのプロパティです。

  3. desc = arcpy.da 行の後に新しい行を追加し、以下のコードを追加して Enter キーを押します。

    print(f'baseName: {desc["baseName"]}')

    スクリプトを実行すると、このコードはプロパティ baseName の値を出力します。 上記のコード行で、desc はプロパティの辞書であり、baseName は文字列のキーです。 式 desc["baseName"] は、辞書内でこのキーに関連付けられた値を返します。

    ここで使用されている出力形式のスタイルは、f 文字列として知られています。 f 文字列は「フォーマット済み文字列リテラル」とも呼ばれます。 f 文字列は、文字 f で始まる文字列で、中括弧で囲まれた変数が含まれています。 これらの変数は、実行時にその値で置き換えられます。 上記のコードの例で、二重引用符は値 baseName を囲み、文字列にするために使用されます。 引用符は f 文字列にも使用されるため、二重引用符と区別するために単一引用符を使用する必要があります。 これらの異なるタイプの引用符は、一貫して使用する場合に限り、Python 内で区別なく使用することができます。

    以下も同様に正しい表記です。

    print(f"baseName: {desc['baseName']}")

    ここまでの完全なコードは以下のとおりです。

    import arcpy
    mypath = "C:/Lessons/PythonDesc"
    arcpy.env.workspace = mypath
    desc = arcpy.da.Describe("bike_routes.shp")
    print(f'baseName: {desc["baseName"]}')

    データを別の場所に格納した場合、mypath 行は異なります。

  4. [File] をクリックしてから [Save] をクリックし、スクリプトを保存します。

    キーボード ショートカット Ctrl + S キーを使用することもできます。

  5. [Run] をクリックし、[Run Module] をクリックします。

    ベース名 bike_routes を報告します。

    IDLE Shell ウィンドウが結果とともに表示されます。

    baseName: bike_routes

    データのベース名は、ファイル拡張子を含まないファイル名です。

    コーディング方法を学習する際、エラーが発生することはよくあります。 このスクリプトを実行する際に発生する可能性のある一般的なエラーについては、次のステップをご参照ください。

  6. desc = arcpy.da.Describe("bike_routes.shp") からアンダースコア文字を削除して、bike_routes 行を変更します。

    desc = arcpy.da.Describe("bikeroutes.shp")

  7. スクリプトを保存して実行します。

    IDLE Shell でエラー メッセージが表示されます。

    ValueError: Object: Error in accessing describe

    値エラー メッセージ

    このエラーは、da.Describe() 関数で問題が発生したことを示しています。 このエラーの原因は、フィーチャクラス名のスペルが正しくないことです。そのため、フィーチャクラスを特定できません。 このエラーが発生した場合、名前が正しいことを再確認してください。 ワークスペースが正しく設定されていない可能性もあるため、ワークスペースに使用されているパスも確認してください。

    注意:
    GIS データセットのプロパティを調べるには、da.Describe() のほか、標準の ArcPy 関数 Describe() を使用することもできます。 構文は da.Describe() とはわずかに異なります。Describe() 関数は Describe オブジェクトを返し、このオブジェクトを使用してプロパティを確認できます。

  8. IDLE エディター ウィンドウで、行を変更してフィーチャクラス名を修正します。

    desc = arcpy.da.Describe("bike_routes.shp")

  9. print(f'baseName: 行の後に、次の行を追加します。

    print(f'extension: {desc["extension"]}')
    print(f'dataType: {desc["dataType"]}')
    print(f'shapeType: {desc["shapeType"]}')

  10. スクリプトを保存して実行します。

    その他のプロパティが出力された結果

    入力データセットのベース名、ファイル拡張子、データ タイプ、およびジオメトリ タイプが出力されます。 [カタログ] ウィンドウで [bike_routes.shp] がポリライン シェープファイルであることは簡単にわかりますが、Python スクリプトでそれらのプロパティにアクセスできるようになりました。

    他にも多くのプロパティが存在しますが、各データセットを理解する良いきっかけになります。 プロパティの完全なリストについては、ArcGIS Pro ヘルプ ページの「ArcPy ドキュメント」セクションをご参照ください。

    さまざまなプロパティが存在し、ヘルプ ページではプロパティ グループに編成されています。 上のリンクにある Describe プロパティ グループには、baseNameextensiondatatype など、すべてのデータセットに対応する一般プロパティが含まれています。 それから、データセットの特定のタイプに対応するプロパティ グループが存在します。 たとえば、FeatureClass プロパティ グループには、前のコード例で使用した shapeType プロパティが含まれています。 一部のデータセットにはジオメトリが含まれていないため、このプロパティは存在しません。 ヘルプ ページを移動する際に見つけるのが少し難しいプロパティもあります。 たとえば、extent プロパティは Dataset プロパティ グループ内に存在します。 プロパティ グループは、ヘルプ ページの編成のみに関連し、コードには何の影響もありません。

次に、データセットへの参照を置き換え、スクリプトを使用して、他のデータセットを探索します。

他のデータセットの記述

[bike_routes.shp] データセットを記述したスクリプトがあるため、このスクリプトを修正して他のデータを記述します。

  1. desc = arcpy.da.Describe("bike_routes.shp") 行を修正し、bike_routes.shpwatersheds.shp に置き換えます。

    desc = arcpy.da.Describe("watersheds.shp")

  2. スクリプトを保存して実行します。

    集水域シェープファイルの結果

  3. desc = arcpy.da.Describe("bike_routes.shp") 行を修正し、watersheds.shpbike_racks.csv に置き換えます。

    desc = arcpy.da.Describe("bike_racks.csv")

  4. スクリプトを保存して実行します。

    CSV ファイルでのキー エラー

    IDLE Shell でエラー メッセージが表示されます。

    KeyError: 'shapeType'

    このエラーは、辞書キー shapeType が存在しないため、辞書を使用する際にエラーが発生したことを意味します。 shapeType の意味を考慮すると、このエラーは理にかなっています。 テキスト ファイルにはジオメトリが含まれていないため、ポイント、ポリライン、またはポリゴンに分類することはできません。 CSV ファイルには関連しないため、このプロパティは辞書に存在しません。

    da.Describe() で返される辞書には、指定したデータ タイプに関連するキーと値のみが含まれます。

    チェックを実行することで、エラーを防ぐことができます。

  5. print(f'dataType: {desc["dataType"]}') 行の後のスクリプトをクリックし、Enter キーを押して新しい行を追加します。

    新しい行を追加します。

  6. print(f'dataType: 行の後に、次の行を追加します。

    if "shapeType" in desc:

    この行には if 文が含まれています。 If 文の行にはテストが含まれ、この場合、文字列 "shapeType" が辞書 desc に存在するかどうかを判断しています。 テストの後、if 文の後ろにはコロンが付いています。 次の行は、そのテストが true と評価された場合に、条件付きで実行されるコード ブロックの最初の行を示しています。 Python で、コード ブロック内の行が 1 つのブロックに属しており、テストが true の場合にのみ実行されることを示すには、これらの行をインデントする必要があります。

  7. 最後の行の先頭をクリックし、4 つのスペースを追加して行をインデントします。

    最後の行をインデントします。

    最後の 2 行のコードは以下のとおりです。

    if "shapeType" in desc:
        print(f'shapeType: {desc["shapeType"]}')

  8. スクリプトを保存して実行します。

    CSV ファイルの結果

    エラーが発生することなく、CSV ファイルの結果が出力されます。 最初の 3 つのプロパティが出力され、次に if 文で辞書に "shapeType" が含まれているかどうかがテストされます。この場合は含まれていないため、最後の行は実行されません。

    指定したデータセットで利用できるプロパティを確認するにはどうしたらよいでしょうか?

    辞書全体を出力することで、プロパティを確認できます。

    次に、プロパティを出力する方法について説明します。

データセットのすべてのプロパティを出力

これで、辞書の特定のキーと値を出力する方法と、特定のキーが辞書に存在するかどうかをテストする方法を学習しました。 ここで、辞書全体を出力する方法について説明します。

  1. スクリプトの最後の 5 行を選択します。

    これらの行には、最初の 3 つのプロパティを出力する行、if 文、および最後の print 行が含まれています。

  2. コード行を選択した状態で、[Format] をクリックし、[Comment Out Region] をクリックします。

    コメント アウト リージョン

    選択した行の前に 2 つのシャープ記号が表示されるようになりました。 先頭に # を付与するとその行が Python のコメントに変換されるため、コードが実行される際、これらの行は実行されません。

    各行の先頭にシャープ記号を入力することでもできますが、IDLE のメニュー オプションを使用すると、複数の行に対して一度にこの操作を実行できます。

    行を選択して、[Format] メニューから [Uncomment region] を選択すると、シャープ記号を外すことができます。

  3. スクリプトの一番下に新しいコード行を追加し、インデントを削除します。
  4. 次の行を追加します。

    for k, v in desc.items():
        print(f"{k}: {v}")

    ループして、すべてのプロパティを出力します。

    新しい 2 行のうち、最初の行は for ループを開始します。 For ループは入力のセットとインデントされたコードのブロックを受け取り、それぞれの入力に対してコード ブロックを実行します。 この場合、for ループは、items 辞書の desc メソッドを呼び出して返されたキーと値のペアを反復処理します。 「辞書のループ」の詳細については、Python ドキュメントをご参照ください。

    2 行目はインデントされています。 for ループのコード ブロックには、この行しか存在しません。 ループが実行されるたびに、この行は、コロンで区切られた k 変数と v 変数の値 (キーと値) を含む、フォーマット済み文字列を出力します。

  5. スクリプトを保存して実行します。

    CSV ファイルでキー値をリストするループを実行した結果

    このコードは、辞書のすべてのアイテムを反復処理し、キーと値を出力します。

    辞書を出力することで、指定したデータ タイプのプロパティを確認できます。

    次に、ジオデータベース内のエレメントをいくつか確認します。

ジオデータベース フィーチャクラスの記述

これまで、ファイルベースのシェープファイルや CSV テーブルのプロパティを調べる方法を学習しました。次は、Python を使用してジオデータベース内のアイテムのプロパティを調べます。 すべてのプロパティをリストするのではなく、以前に使用した一連の print 文を使用します。

  1. 以前コメント アウトした 5 行のコードを選択し、[Format] をクリックして、[Uncomment region] をクリックします。
  2. 辞書を反復処理する際に使用した最後の 2 行のコードをコメント アウトします。
  3. mypath = "C:/Lessons/PythonDesc" 行を修正し、/DC.gdb を追加します。

    mypath = "C:/Lessons/PythonDesc/DC.gdb"

  4. desc = arcpy.da.Describe("bike_racks.csv") 行を修正し、boundary フィーチャクラスを記述します。

    desc = arcpy.da.Describe("boundary")

    ジオデータベース内のエレメントにはファイル拡張子がないため、データ タイプに基づいてのみ区別されます。

    境界フィーチャクラスを記述します。

  5. スクリプトを保存して実行します。

    境界スクリプトの結果を記述します。

    2 つ目のプロパティはファイル拡張子です。 このプロパティは辞書内の有効なキーですが、値は空です。 空のファイル拡張子はジオデータベース エレメントでは一般的であるため、別の if 文を追加して、拡張子が存在する場合にのみ、その行を出力します。

  6. print(f'extension: {desc["extension"]}') 行を次の 2 行に置き換えます。

    if desc["extension"] != "":
        print(f'extension: {desc["extension"]}')

    条件付きで拡張子を表示する行

    比較演算子 != は「等しくない」ことを意味します。 Python で有効な比較演算子は、== (等しい)、!= (等しくない)、< (より小さい)、<= (以下)、> (より大きい)、および >= (以上) です。 =!<> も動作するように見えますが、これらは有効な比較演算子ではないため、構文エラーが発生します。

    この 2 行のうち最初の行は、"extension" キーに関連付けられた値が空の文字列 (その間に何も含まれていない 2 つの引用符) と等しくないかどうかを確認します。 これが true と評価されると、拡張子キー名とそのキーに関連付けられた値を含む、フォーマット済み文字列を出力する行が実行されます。

  7. スクリプトを保存して実行します。

    条件付き拡張子コードの結果

    コードが実行され、拡張子キーに空の値が含まれていないかどうかを確認します。 拡張子キーに空の値が含まれるため、テストは false と評価され、インデントされたコード ブロック行は実行されず、コードでその行は出力されません。 コードはコード ブロックの外側にある次の行に進み、dataType と shapeType が出力されます。

    da.Describe() 関数でアイテム名を変更することにより、同様の方法でジオデータベース内の他のエレメントを調べることができます。

  8. desc = arcpy.da.Describe("boundary") 行を修正し、boundarycar_share_locations に置き換えます。

    desc = arcpy.da.Describe("car_share_locations")

  9. スクリプトを保存して実行します。

    カー シェア位置テーブルの記述

    car_share_locations アイテムはジオデータベース テーブルです。 拡張子が含まれず、shapeType のエントリも存在しないため、これらの行は出力されません。

  10. desc = arcpy.da.Describe("car_share_locations") 行を修正し、[Transportation] アイテムを記述します。

    desc = arcpy.da.Describe("Transportation")

  11. スクリプトを保存して実行します。

    Transportation の記述結果

    [Transportation] は、ジオデータベース内のフィーチャ データセットです。 フィーチャ データセットには、共通の座標系を共有するデータ エレメントが含まれています。 フィーチャ データセットは、ワークスペースとして使用できます。

  12. mypath = "C:/Lessons/PythonDesc/DC.gdb" 行を修正し、/Transportation を追加します。

    mypath = "C:/Lessons/PythonDesc/DC.gdb/Transportation"

    これで、フィーチャ データセット内に存在するフィーチャクラスやエレメントを記述できるようになりました。

  13. desc = arcpy.da.Describe("Transportation") 行を修正し、[Traffic] アイテムを記述します。

    desc = arcpy.da.Describe("Traffic")

    ネットワークを記述するコード。

  14. スクリプトを保存して実行します。

    Traffic ネットワークの記述

    [Traffic] は「ネットワーク データセット」です。 ネットワーク データセットは、交通ネットワークのモデリングに使用されます。 ネットワーク データセットは、シンプル フィーチャ (ラインとポイント) およびターンを含めることができるソース フィーチャから作成され、ソース フィーチャの接続性を格納します。 ネットワークを解析する場合、解析は常にネットワーク データセットで行われます。

    da.Describe() で使用できるデータ タイプは他にも存在しますが、記述したアイテムは最も標準的な GIS データセットの一部をカバーしています。 ただし、各データセットを 1 つずつ記述するのは面倒な作業です。 ワークスペースで利用できるさまざまなデータセットのリストを、個々の名前を入力することなく作成できると便利です。

ワークスペース内のファイルのリスト

Python スクリプトでは、一般的に複数のデータセットを操作します。 個々のデータセットの名前を入力するのは面倒で時間がかかります。 ArcPy には、データセットのインベントリを作成する関数が複数用意されています。 これらの関数は通常、データセットを Python リストとして返し、今後の処理に使用できます。

  1. 新しいスクリプトから開始します。
  2. IDLE エディター ウィンドウで、[File] をクリックし、[Save As] をクリックします。

    現在のスクリプト ファイル名は describe_data.py です。 [Save As] を使用して新しいスクリプトを作成し、作業を続行します。一方、これまでの作業内容を describe_data.py ファイルに保存することで、後で参照できます。

  3. [Save As] ダイアログ ボックスで「list_data.py」と入力し、[Save] をクリックします。
  4. describe_data スクリプト ウィンドウで、最初の 3 行を除くすべての行を選択し、Delete キーを押します。

    最初の 3 行を除くすべての行を削除します。

  5. mypath = 行を編集し、/DC.gdb/Transportation をパスから削除します。

    mypath = "C:/Lessons/PythonDesc"

    これにより、チュートリアル データのベース フォルダーへのパスが残ります。

  6. arcpy.env.workspace 行の後に、次の 2 行を追加します。

    files = arcpy.ListFiles()
    print(files)

    これらの行のうち、最初の行は、新しい変数 files を作成し、ListFiles 関数を呼び出した結果と等しくなるように変数を設定します。 関数の後ろに、括弧で囲まれたパラメーターのリストが表示されます。 この場合、ListFiles() 関数に入力パラメーターは不要なため、括弧は空です。

    2 行目は、そのリストを出力します。

    ファイルのリストを作成し、出力します。

    コードは次のようになります。

    import arcpy
    mypath = "C:/Lessons/PythonDesc"
    arcpy.env.workspace = mypath
    files = arcpy.ListFiles()
    print(files)

  7. スクリプトを保存して実行します。

    データをリストする ListFiles の最初の結果

    これは、PythonDesc フォルダー内のファイルのリストです。 Python リストは角括弧で囲まれています。

    ListFiles 関数は、現在のワークスペースにあるファイルを返します。 このため、arcpy.env.workspace を使用してワークスペースが設定されていない場合、結果は空のリストとなり、スクリプトは None を出力します。

    この関数には必須のパラメーターが存在しないため、自動的に現在のワークスペースを使用します。 リストされたファイルは、ファイル エクスプローラーで表示されるファイルとよく似ています。 例外が 1 つあります。 ジオデータベースはファイル エクスプローラーではフォルダーですが、ListFiles() の結果に含まれます。 その結果、DC.gdb は厳密にはファイルを含むフォルダーにもかかわらず、ここではファイルとして表示されます。

    検索を制限して、特定のファイル タイプのみを返すようにします。

  8. files = arcpy.ListFiles() 行を編集し、括弧の中に "*.csv" を追加します。

    files = arcpy.ListFiles("*.csv")

    ListFiles 関数に wildcard と呼ばれるオプションのパラメーターを指定でき、検索結果に含める必要がある文字列を指定することができます。 アスタリスクはゼロ個以上の不特定の文字を表すため、このワイルドカード検索は .csv 拡張子を含むすべてのファイル名を返します。

  9. スクリプトを保存して実行します。

    スクリプトは、一致する結果のリストを出力します。 この場合、1 つのアイテムのリストになります。

    ['bike_racks.csv']

    この方法は、ファイル数に関係なく動作するため、同じファイル タイプのすべてのファイルをリストとして取得し、各ファイルに対して同じタスクを実行するのに適しています。

    他のファイル タイプ (.xlsx.dbf など) をリストしたり、名前の文字列の他の部分に一致させたりすることもできます。 たとえば、ワイルドカード文字列 "*bike*" を使用すると、bike: ['bike_racks.csv', 'bike_routes.dbf', 'bike_routes.prj', 'bike_routes.sbn', 'bike_routes.sbx', 'bike_routes.shp', 'bike_routes.shx'] を含むすべてのファイル名のリストが返されます。

  10. mypath = "C:/Lessons/PythonDesc" 行を修正し、DC.gdb を含めます。

    mypath = "C:/Lessons/PythonDesc/DC.gdb"

  11. "*.csv" 関数から ListFiles パラメーターを削除します。

    files = arcpy.ListFiles()

  12. スクリプトを保存して実行します。

    リスト結果が表示されます。

    これらのファイルは、ファイル エクスプローラーを使用した際に DC.gdb フォルダーに表示されるファイルと同じです。 データセットが個々のファイルに対応していないため、ListFiles() 関数はジオデータベースのコンテンツを調べるのに有用な方法ではありません。 しかし、フィーチャクラスをリストする関数が存在するため問題ありません。

ワークスペース内のフィーチャクラスのリスト

フィーチャクラスは、最もよく使用される GIS データセット タイプの 1 つです。 ListFeatureClasses() 関数は、現在のワークスペースに含まれているフィーチャクラスのリストを返します。

  1. mypath = 行を編集し、/DC.gdb をパスから削除します。

    mypath = "C:/Lessons/PythonDesc"

    これにより、チュートリアル データのベース フォルダーへのパスが残ります。

  2. files = arcpy.ListFiles() 行を編集して、ListFeatureClasses を使用するようにします。

    files = arcpy.ListFeatureClasses()

    コードは次のようになります。

    import arcpy
    mypath = "C:/Lessons/PythonDesc"
    arcpy.env.workspace = mypath
    files = arcpy.ListFeatureClasses()
    print(files)

  3. スクリプトを保存して実行します。

    スクリプトは 2 つのフィーチャクラスを含むリストを出力します。

    ['bike_routes.shp', 'watersheds.shp']

    この場合、フィーチャクラスはシェープファイルです。 これにより、混乱が生じる可能性があります。 「フィーチャクラス」という用語は、それぞれのフィーチャに同じ空間表現 (ポイント、ライン、ポリゴンなど) と一連の共通の属性セットが設定されている、同種のフィーチャのコレクションを表す際に使用されます。 ArcGIS Pro で最も一般的な 2 つのフィーチャクラス タイプは、シェープファイルとジオデータベース フィーチャクラスです。

    ListFeatureClasses() 関数はシェープファイルとジオデータベース フィーチャクラスの両方に対して動作しますが、指定したワークスペースに対しては、どちらか一方のフィーチャクラスしか返しません。 ワークスペースがフォルダーの場合、この関数はシェープファイルをリストします。 ワークスペースがジオデータベースの場合、この関数はジオデータベース フィーチャクラスをリストします。

  4. mypath = 行を編集し、パスに /DC.gdb を追加します。

    mypath = "C:/Lessons/PythonDesc/DC.gdb"

    これはファイル ジオデータベースへのパスです。

    ジオデータベース内のフィーチャクラスをリストします。

  5. スクリプトを保存して実行します。

    スクリプトは 3 つのフィーチャクラスを含むリストを出力します。

    ['neighborhoods', 'boundary', 'public_schools']

    リストには、Transportation フィーチャ データセット内のフィーチャクラスは含まれません。このフィーチャ データセットは別のワークスペースであるためです。

    ワイルドカードを使用して、ListFeatureClasses() の結果をフィルター処理することができます。 たとえば、特定の文字で始まるフィーチャクラスをすべて取得することができます。 この関数では、フィーチャ タイプでフィルター処理することもできます。 ListFeatureClasses() 関数の構文は次のとおりです。

    ListFeatureClasses ({wild_card}, {feature_type}, {feature_dataset})

    この関数の feature_type パラメーターを使用すると、「フィーチャクラス タイプ」に基づいて結果を制限できます。

  6. files = arcpy.ListFeatureClasses() 行を編集して、2 つのパラメーター (("", "POINT")) を使用するようにします。

    files = arcpy.ListFeatureClasses("", "POINT")

    最初のパラメーター wild_card は使用されていません。パラメーターには所定の順序があり、このパラメーターをスキップする必要があるためです。 空の文字列 "" はプレースホルダーとして機能し、パラメーターが使用されていないことを示します。 Python キーワードの None を使用することもできます。

    名前で参照されるパラメーターを指定することもできます。その場合、元の順序に従う必要はありません。 これらの 2 つの方法も、行を記述する際に有効です。

    files = arcpy.ListFeatureClasses(None, "POINT")

    files = arcpy.ListFeatureClasses(feature_type="POINT")

    ナンバー サインを文字列 ("#") として使用し、ツール パラメーターをスキップすることもできます。 ただし、これは ArcPy のツールでない関数では動作しません。

    ほとんどの場合、Python では大文字と小文字が区別されますが、通常 ArcPy 関数で使用される文字列では大文字と小文字が区別されません。 このため、パラメーターに "Point""point" を使用することもできます。

    関数に指定できる 3 つ目のパラメーター feature_dataset は使用されておらず、パラメーター シーケンスの末尾であるため、完全に省略することができます。

  7. スクリプトを保存して実行します。

    スクリプトは、ワークスペースに 1 つのポイント フィーチャクラスを出力します。

    ['public_schools']

テーブルとデータセットのリスト

ファイルとフィーチャクラスをリストしました。 次に、テーブルとフィーチャ データセットをリストします。

  1. mypath = 行を編集し、/DC.gdb をパスから削除します。

    mypath = "C:/Lessons/PythonDesc"

    これにより、チュートリアル データのベース フォルダーへのパスが残ります。

  2. files = arcpy.ListFeatureClasses(feature_type="POINT") 行を編集して ListTables() にします。

    files = arcpy.ListTables()

    コードは次のようになります。

    import arcpy
    mypath = "C:/Lessons/PythonDesc"
    arcpy.env.workspace = mypath
    files = arcpy.ListTables()
    print(files)

    フォルダー内のテーブルをリストします。

  3. スクリプトを保存して実行します。

    スクリプトは、ワークスペースに 2 つのテーブルのリストを出力します。

    ['gardens.dbf', 'bike_racks.csv']

  4. mypath = 行を編集し、パスに /DC.gdb を追加します。

    mypath = "C:/Lessons/PythonDesc/DC.gdb"

    これにより、ジオデータベースへのパスが設定されます。

    import arcpy
    mypath = "C:/Lessons/PythonDesc/DC.gdb"
    arcpy.env.workspace = mypath
    files = arcpy.ListTables()
    print(files)

  5. スクリプトを保存して実行します。

    スクリプトは、ジオデータベースに 1 つのテーブルを含むリストを出力します。

    ['car_share_locations']

  6. files = arcpy.ListTables() 行を編集して ListDatasets() にします。

    files = arcpy.ListDatasets()

    import arcpy
    mypath = "C:/Lessons/PythonDesc/DC.gdb"
    arcpy.env.workspace = mypath
    files = arcpy.ListDatasets()
    print(files)

  7. スクリプトを保存して実行します。

    スクリプトは、ジオデータベースに 1 つのフィーチャ データセットを含むリストを出力します。

    ['Transportation']

  8. mypath = 行を編集し、パスに /Transportation を追加します。

    mypath = "C:/Lessons/PythonDesc/DC.gdb/Transportation"

    これにより、Transportation フィーチャ データセットへのパスが設定されます。

    import arcpy
    mypath = "C:/Lessons/PythonDesc/DC.gdb/Transportation"
    arcpy.env.workspace = mypath
    files = arcpy.ListDatasets()
    print(files)

  9. スクリプトを保存して実行します。

    スクリプトは、Transportation データセットに 1 つのネットワーク データセットを含むリストを出力します。

    ['traffic']

    ListDatasets() 関数は、さまざまなデータ エレメントで動作します。 これには、フィーチャ データセット、ジオメトリック ネットワーク、ネットワーク、パーセル ファブリック、ラスター カタログ、トポロジなどが含まれます。

これで、リスト関数を使用してデータのインベントリを作成する方法を確認できたため、生成されたリストを使用してリストの各エレメントを記述します。

リストの反復処理

通常、データ リストの作成は、大規模なワークフローの最初のステップです。 ほとんどの場合、各データセットに対して何らかのタスクを実行します。 Pythonfor ループを使用して、リストを反復処理します。

新しいスクリプトから開始します。

  1. [File] をクリックし、[Save As] をクリックします。
  2. 新しいファイルに「iterate_data.py」という名前を付けます。
  3. mypath = 行を編集し、/Transportation をパスから削除します。

    mypath = "C:/Lessons/PythonDesc/DC.gdb"

  4. files = arcpy.ListDatasets() 行を編集して、ListFeatureClasses 関数を使用するようにします。

    files = arcpy.ListFeatureClasses()

  5. print(files) 行を for file in files: に置き換えて、Enter キーを押します。

    行末のコロンは、コード ブロックの開始を示します。 for ループはリスト内のエレメントを反復処理し、コード ブロック内のインデントされたコードがエレメントごとに実行されます。 末尾がコロンのコード行の後で Enter キーを押すと、次のコード行が自動的にインデントされます。

    各サイクルで、一時変数 file には、files 変数内のファイルのリストから 1 つの名前が割り当てられます。

  6. インデントされた新しい行に、以下を追加します。

    desc = arcpy.da.Describe(file)

    da.Describe() 関数は、フィーチャクラスのプロパティを含む辞書を返します。 このコードの行は、フィーチャクラスのリスト内のすべてのフィーチャクラスに対して実行されます。

  7. Enter キーを押して、以下を追加します。

    print(desc["baseName"])

    この行は、前の行と一致するように 4 つのスペースでインデントする必要があります。 for ループのコード ブロックに含まれ、リスト内の各フィーチャクラスに対して実行されます。

    この行は、desc キーを使用して baseName 辞書に格納されている値を取得して出力します。

    完全なコードは以下のとおりです。

    import arcpy
    mypath = "C:/Lessons/PythonDesc/DC.gdb"
    arcpy.env.workspace = mypath
    files = arcpy.ListFeatureClasses()
    for file in files:
        desc = arcpy.da.Describe(file)
        print(desc["baseName"])

    説明を印刷します。

  8. スクリプトを保存して実行します。

    スクリプトは、3 つのフィーチャクラスの名前を 3 つの新しい行に出力します。

    neighborhoods
    boundary
    public_schools

    コードを修正し、結果が伝わりやすくします。

  9. print(desc["baseName"]) 行を編集して name = desc["baseName"] にします。

    この行は名前を出力するのではなく、name 変数に格納します。

    この行をコード ブロックの前の行と一致するようにインデントし、ループの各サイクルに対して実行されるようにします。

  10. 次の 3 行を追加します。

        data = desc["dataType"]
        shape = desc["shapeType"]
        print(f"{name} is a {data} with {shape} geometry")

    このコードは、データ タイプとジオメトリ値を data 変数および shape 変数に格納します。

    最後の行は、3 つの変数のコンテンツが代入され、フォーマット済み文字列を作成、出力します。

  11. スクリプトを保存して実行します。

    スクリプトは、3 つのフォーマット済み文字列を出力します。

    neighborhoods is a FeatureClass with Polygon geometry
    boundary is a FeatureClass with Polygon geometry
    public_schools is a FeatureClass with Point geometry

これまでに、ジオデータベース内のフィーチャクラスをリストし、リストを反復処理して、それぞれの情報を出力しました。 次に、各タイプのフィーチャクラス数を追跡するコードを追加します。

フィーチャクラス タイプ数の追跡

各フィーチャクラスのプロパティを確認し、条件付き論理を使用して、動作を決定することができます。 このセクションでは、if 文を使用して、ジオメトリ タイプごとにフィーチャクラスをカウントします。

  1. for file in files: 行の前に新しい行を挿入します。
  2. for ループの前に次の 3 行を追加します。

    count_point = 0
    count_line = 0
    count_poly = 0

    これらの行により、3 つの新しい変数がゼロに設定されます。 これらの変数を使用して、各フィーチャクラス数を追跡します。

    これらは for ループの前にゼロに設定され、for ループでフィーチャクラスのタイプに応じて追加できます。 for ループ内で変数を定義してゼロに設定すると、ループが実行されるたびに、前のサイクルのデータが失われてしまいます。

  3. for ループ内で、最後の 4 行を削除します。

    for ループ内でカウンターを設定し、行を切り取ります。

  4. for ループ内で、desc = arcpy.da.Describe(file) の後に、次の行を追加します。

    if desc["shapeType"] == "Point":
        count_point += 1

    ポイントのカウンターの増加

    if 行は desc 行と同じレベルにインデントされる必要があります。

    if 行は、desc キーに格納されている shapeType 辞書内の値が文字列 Point と等しいかどうかを確認します。

    Python で、二重等号 == は等価かどうかをチェックするために使用され、単一等号は変数に値を割り当てるために使用されます。

    この行の後にコロンがあり、次の行は新しいコード ブロックであるためインデントされています。

    文が false の場合、何も起こりません。 文が true の場合、if 文に続くコード ブロックが実行されます。

    コード ブロックは、count_point 変数に格納されている値に 1 を追加します。 ループが実行されると、フィーチャクラスのリストの各アイテムをチェックし、ポイント フィーチャクラスであるかどうかを判断し、ポイント フィーチャクラスであれば 1 を追加します。 ループの実行が完了すると、カウンター変数にポイント フィーチャクラス数のカウントが格納されます。

    さらに 2 つの if 文を追加し、他のジオメトリ タイプをチェックします。

  5. 最後のコード行の末尾で、Enter キーを押します。

    新しい行は、現在のコード ブロックの既存のインデントの位置に揃えられます。 ただし、次の if 文を前の if 文と同じレベルのインデントに揃える必要があります。

  6. Backspace キーを押します。

    これにより、新しい行が前の if 文の位置に揃うようにインデントが調整されます。

  7. 次のコード行を追加します。

    if desc["shapeType"] == "Polyline":
        count_line += 1
    if desc["shapeType"] == "Polygon":
        count_poly += 1

    3 つの if 文が揃えられます。

    Backspace キーを使用してインデントを削除し、インデントを調整するか、スペースを 4 つ追加してインデントを追加することができます。

    これで、ファイル リストの各アイテムが記述され、記述の結果の辞書が desc 変数に格納され、shapeType キーに格納されたデータが文字列 PointPolyline、または Polygon に一致するかどうかがチェックされます。 一致すると、その形状のカウンター変数に 1 が追加されます。

    次に、情報を出力する行をいくつか追加します。

  8. スクリプトの末尾にコード行を追加し、Backspace を押して、インデントをすべて削除します。
  9. 次のコード行を追加します。

    print(f"Count of Point feature classes: {count_point}")
    print(f"Count of Polyline feature classes: {count_line}")
    print(f"Count of Polygon feature classes: {count_poly}")

    ジオメトリをカウントして結果を出力する、完成したスクリプト

    最後の 3 行はインデントされていないため、for ループ コード ブロックに含まれておらず、ループが完了し、各シェープ タイプの数が記録された後にのみ実行されます。

  10. スクリプトを保存して実行します。

    スクリプトは次の 3 行を出力します。

    Count of Point feature classes: 1
    Count of Polyline feature classes: 0
    Count of Polygon feature classes: 2

    これは、Python を使用してデータを処理する方法の一例を示しています。 まず、データのリストを取得し、その情報を使用してデータに対する処理を実行します。 この例では、単純にフィーチャクラスをカウントしていますが、同様のスクリプトを使用して、他のタスク (例: すべてのポリゴン フィーチャクラスのコピー、すべてのポイント フィーチャクラスの属性のチェック) を実行することもできます。

これで、3 つのジオメトリのフィーチャクラス数が出力されました。 次に、同じ作業をよりコンパクトに実行する方法について説明します。

フィーチャ タイプ フィルターを使用したカウントの取得

フィーチャ タイプによるフィルターとともに ListFeatureClasses() 関数を使用して、ワークスペース内のフィーチャクラスのカウントを取得することもできます。

  1. [File] をクリックし、[Save As] をクリックします。
  2. 新しいファイルに「filter_by_type.py」という名前を付けます。
  3. スクリプトの最初の 3 行と最後の 3 行の間の行を選択し、[Format] をクリックして、[Comment Out Region] をクリックします。

    スクリプトの中間セクションがコメント アウトされます。

  4. コメント アウトされたセクションの後、かつ print 行の前に新しい行を追加します。
  5. 次のコード行を追加します。

    count_point = len(arcpy.ListFeatureClasses(feature_type="POINT"))
    count_line = len(arcpy.ListFeatureClasses(feature_type="POLYLINE"))
    count_poly = len(arcpy.ListFeatureClasses(feature_type="POLYGON"))

    feature_type フィルターを使用してカウントする行を追加

    これらの 3 行により、count_point 変数、count_line 変数、count_poly 変数が新しい方法で設定されます。

    変数をゼロに設定して値を増やすのではなく、ここでは各行が ListFeatureClasses() 関数とオプションの feature_type パラメーターを使用します。 この関数は、フィルター パラメーターに一致するフィーチャクラスのリストを作成します。 len 関数は、生成されるリストの長さを決定し、これが対象タイプのフィーチャクラスのカウントになります。

  6. スクリプトを保存して実行します。

    スクリプトは次の 3 行を出力します。

    Count of Point feature classes: 1
    Count of Polyline feature classes: 0
    Count of Polygon feature classes: 2

    このコード ソリューションは、コメント アウトされた行を除き、da.Describe() を使用してジオメトリ タイプを決定する以前の方法よりも短い行数で済みます。 ただし、da.Describe() を使用すると、ジオメトリ タイプ以外のプロパティ (フィールドの数、空間範囲、座標系など) を調べることができます。

  7. スクリプトと IDLE Shell ウィンドウを閉じます。

これで、さまざまなタイプのフィーチャクラスのカウントを取得し、その情報を IDLE Shell に出力する 2 つの方法を学習しました。 次に、ワークスペースのコンテンツをリストおよび記述し、その結果をテキスト ファイルに書き込むスクリプトにおいて、これら 2 つの方法を使用する例について説明します。

インベントリ情報のテキスト ファイルへの書き込み

対話型のウィンドウへの出力のフィードバックはすぐに返されますが、結果をテキスト ファイルに書き込むほうが便利な場合があります。 この方法の完成したスクリプトは、PythonDesc フォルダーにあります。

  1. File Explorer で、データを展開した PythonDesc フォルダーに移動します。
  2. [write_inventory.py] ファイルを右クリックして、[Edit with IDLE (ArcGIS Pro)] をクリックします。

    スクリプトを確認し、必要に応じてパスを調整して実行し、動作を確認します。 スクリプトには、読みやすくするためにコメントや空白の行が含まれていますが、これらはコードの動作に影響を与えません。

    スクリプトは、作成者、日付、目的を含むコメントから始まります。 スクリプトの目的と作成日を思い出せるように、スクリプトにこのような備考を追加することをお勧めします。 スクリプトを共有する場合、この情報は他のユーザーがスクリプトを理解するのに役立ち、質問がある場合の連絡先を知らせることができます。

    スクリプトで実行されるコードの最初の行では、arcpy モジュールと os モジュールをインポートします。

    import arcpy
    import os

    os モジュール」を使用すると、Python 経由でオペレーティング システム レベルの関数にアクセスできます。

    次のセクションでは、パスとワークスペースを示す変数を設定します。

    #Variables for paths and workspace
    root = "C:/Lessons/PythonDesc"
    gdb = "DC.gdb"
    textfile = "inventory.txt"
    arcpy.env.workspace = os.path.join (root, gdb)
    output = os.path.join(root, textfile)

    このセクションは、このコード部分が実行する内容を示すコメントから始まります。 これも、Python コードの記述の練習に役立ちます。

  3. PythonDescC:/Lessons/PythonDesc とは異なる場所に展開した場合、root = "C:/Lessons/PythonDesc" 行内のパスを編集して、コンピューター上のフォルダーの場所を指定します。

    ルート フォルダーに関係なく、ファイル ジオデータベースの名前とテキスト ファイルの名前は、arcpy.env.workspace を設定するコード行と同様に、変更する必要はありません。 ルート フォルダーのパスに変数を使用することで、スクリプト内の 1 か所を更新するだけで済みます。 os.path.join() 関数を使用して、root 変数と gdb および textfile 変数から完全なパスを作成します。

    次に、open() 関数を使用し、"w" で書き込みモードを指定して、新しい空のテキスト ファイルを作成します。 この名前のファイルがすでに存在する場合は、上書きされます。

    #Create new textfile to write results                  
    f = open(output, "w")

    スクリプトの次のセクションでは、ListFeatureClasses() 関数を使用して、3 つのジオメトリ タイプのリストを取得します。

    #Create list of feature classes by geometry type
    points = arcpy.ListFeatureClasses("", "POINT")
    lines = arcpy.ListFeatureClasses("", "POLYLINE")
    polygons = arcpy.ListFeatureClasses("", "POLYGON")

    スクリプトの次のセクションでは、フォーマット済み文字列を使用して、コンテキスト情報をテキスト ファイルに書き込みます。 各行の末尾にある \n は、改行をエンコードするエスケープ文字を追加し、情報がテキスト ファイル内に 3 行に表示されるようにします。

    f.write(f"Workspace of interest: {arcpy.env.workspace}\n")
    f.write(f"This workspace contains the following feature classes:\n")
    f.write(f"Count of Point feature classes: {len(points)}\n")

    これらの行の 3 行目は、len(points) を使用して、ポイント リストの長さ、ワークスペース内のポイント フィーチャクラスの数を文字列に挿入しています。

    次の行には、if 文が含まれ、ポイント フィーチャクラス リストにアイテムが存在するかどうかをチェックしています。 ポイントが存在しない場合、次の f.write 行まで何も起きません。 ただし、ポイント フィーチャクラスが存在する場合、その行の後のコード ブロックが実行され、スクリプトは新しいフォーマット済み文字列をテキスト ファイルに書き込みます。

    if len(points) != 0:
        f.write(f"The names of the Point feature classes are:\n")
        for point in points:
            desc = arcpy.da.Describe(point)
            f.write(f'\t{desc["baseName"]}\n')
    f.write(f"Count of Polyline feature classes: {len(lines)}\n")

    次に、for ループでリスト内の各ポイント フィーチャクラスが処理されます。

    ループ内で、フィーチャクラスの desc 記述の辞書が含まれるように arcpy.da.Describe 変数が設定されます。

    次の行は、baseName キーを使用して辞書から取得したフィーチャクラス名を含む、フォーマット済み文字列を書き込みます。 この行は \t エスケープ文字を使用してタブ 1 つ分インデントされ、\n で新しい行が追加されます。 その後、他のポイント フィーチャクラスに対してループが繰り返されます。 処理するポイント フィーチャクラスがなくなると、f.write 行が実行され、ポリライン フィーチャクラスの数を記述するテキストがテキスト ファイルに追加され、\n で改行されます。

    このセクションの残りの部分で、ポリライン フィーチャクラスとポリゴン フィーチャクラスについても同様に報告されます。

    
    if len(lines) != 0:
        f.write(f"The names of the Polyline feature classes are:\n")
        for line in lines:
            desc = arcpy.da.Describe(line)
            f.write(f'\t{desc["baseName"]}\n')
    f.write(f"Count of Polygon feature classes: {len(polygons)}\n")
    if len(polygons) != 0:
        f.write(f"The names of the Polygon feature classes are:\n")
        for polygon in polygons:
            desc = arcpy.da.Describe(polygon)
            f.write(f'\t{desc["baseName"]}\n')

    ポリゴン フィーチャクラスを処理するループが終了すると、次の行でテキスト ファイルが閉じられます。

    f.close()

    最後のセクションでは、os モジュールの startfile 関数を使用して、レポートのテキスト ファイルを開きます。

    #Open the resulting output file
    os.startfile(output)

  4. スクリプトを保存して実行します。

    テキスト ファイルがメモ帳で開きます。

    結果を含むテキスト ファイルがメモ帳で開きます。

    ファイルの write() メソッドを使用して、結果がテキスト ファイルに書き込まれます。 改行文字 \n を使用することで、新しい行で各結果が適切にフォーマットされます。 タブ文字 \t を使用して、フィーチャクラス名をインデントすることで読みやすくなります。 バックスラッシュは、これらの特殊文字に使用されます。

    テキスト ファイルに書き込む代わりに、f.write のすべてのインスタンスを print に置き換えることで、対話型のウィンドウに結果を出力することができます。 ArcGIS Pro 内のスクリプトをスクリプト ツールとして実行する場合は、f.writearcpy.AddMessage に置き換えることで、情報をジオプロセシング ツールのメッセージに書き込むことができます。

確認

  • Python コードを使用して、データ タイプ、ファイル拡張子、ジオメトリなどの GIS データセットのプロパティを記述できます。
  • ArcPy には、データセットのリストを作成する関数が複数用意されています。 ファイル、データセット、テーブル、およびフィーチャクラスのリストを作成するための特定の関数が用意されています。
  • Python コードを使用してデータセットをリストおよび記述することで、ワークスペース内の GIS データセットの詳細なインベントリを作成することができます。 その後、各データセットの特性に基づいてさまざまな処理を実行することができます。
  • Python コードを使用して、テキスト ファイルに情報を書き込むことができます。 これはレポートとエラー ログの記録に便利です。

また、「Esri Press」から出版されている Paul A. Zandbergen 博士による『Python Scripting for ArcGIS Pro』、『Advanced Python Scripting for ArcGIS Pro』についても、ぜひお読みください。