序文
arcpy を使用して arcgis スクリプト ツールを作成した場合の記録は次のとおりです。
まずはスクリプトツールの作成
スクリプト ツールの作成は、次の 2 段階のプロセスです。
1. まず該当関数のPythonステップを記述する
2. 該当関数のスクリプトを入出力データを手動で選択できるスクリプトに修正する
3. 修正したスクリプトをツールボックスに追加する
1. コードを書く
私の例は、特定の標高の等高線を抽出するために使用されます。ソース コードは次のとおりです。
# -*- coding: UTF-8 -*-
"""
@Date :2023/6/25
"""
import time
"""
1、先写一段脚本
2、对脚本进行改写
"""
import os
import arcpy
print '程序开始:' + str(time.ctime())
# 设置工作空间
arcpy.env.workspace = r'E:\arcpy_study\Arcpy实例教程(数据)_小景空间_原始\6Arcpy脚本工具的制作-提取特殊等高线'
# 输入要素
inFeatures = 'coutour.shp'
# 添加一个字段,用来标记高程是否可以整除10
filedName = "Mark" # 字段名称
filedPrecision = 2 # 字段长度
filedAlias = "整除50标记" # 字段别名 能整除50标记为1,不能整除50标记为0
# 列出所有字段
filedObject = arcpy.ListFields(inFeatures)
# 得到所有字段名,如果mark字段存在的话,就删除该字段
filedNameList = []
for filed in filedObject:
# filed.required:字段为必填项时为ture
if not filed.required:
filedNameList.append(filed.name)
print filedNameList
if filedName in filedNameList:
arcpy.DeleteField_management(inFeatures, filedName)
print '删除已有的mark字段'
# 添加字段
arcpy.AddField_management(inFeatures, filedName, "LONG", filedPrecision, "", "", filedAlias, "NULLABLE")
filed1 = "Elev"
filed2 = "Mark"
# 更新查询(为每一条记录做标记)
cursor = arcpy.UpdateCursor(inFeatures)
for row in cursor:
if((int)(row.getValue(filed1))%50 == 0):
row.setValue(filed2, 1)
else:
row.setValue(filed2, 0)
cursor.updateRow(row)
print '程序结束:' + str(time.ctime())
元のフィールドに基づいて、Mark
等高線が 50 で割り切れるかどうかを識別するフィールドを追加します。50 で割り切れる場合は 1 とマークされ、そうでない場合は 0 になります。
この例には、操作対象の機能名を識別する入力機能があります。
2. スクリプトを変更する
ソースコードでは、変更する要素の名前をハードコーディングしましたが、実際の状況は明らかに良くないので、要素を手動で選択できるように変更し、ワークスペースが不要になるようにしたいと思います。変更されたコードは次のとおりです。
# -*- coding: UTF-8 -*-
"""
@Date :2023/6/26
"""
import time
import os
import arcpy
print '程序开始:' + str(time.ctime())
# 设置工作空间
# arcpy.env.workspace = r'E:\arcpy_study\Arcpy实例教程(数据)_小景空间_原始\6Arcpy脚本工具的制作-提取特殊等高线'
# 输入要素
# inFeatures = 'coutour.shp'
# 自己选择输入要素
inFeatures = arcpy.GetParameterAsText(0) # 获取第一个输入要素的文本
# 添加一个字段,用来标记高程是否可以整除10
filedName = "Mark" # 字段名称
filedPrecision = 2 # 字段长度
filedAlias = "整除50标记" # 字段别名 能整除50标记为1,不能整除50标记为0
# 列出所有字段
filedObject = arcpy.ListFields(inFeatures)
# 得到所有字段名,如果mark字段存在的话,就删除该字段
filedNameList = []
for filed in filedObject:
# filed.required:字段为必填项时为ture
if not filed.required:
filedNameList.append(filed.name)
print filedNameList
if filedName in filedNameList:
arcpy.DeleteField_management(inFeatures, filedName)
print '删除已有的mark字段'
# 添加字段
arcpy.AddField_management(inFeatures, filedName, "LONG", filedPrecision, "", "", filedAlias, "NULLABLE")
filed1 = "Elev"
filed2 = "Mark"
# 更新查询(为每一条记录做标记)
cursor = arcpy.UpdateCursor(inFeatures)
for row in cursor:
if ((int)(row.getValue(filed1)) % 50 == 0):
row.setValue(filed2, 1)
else:
row.setValue(filed2, 0)
cursor.updateRow(row)
print '程序结束:' + str(time.ctime())
入力パラメータが 1 つしかないため、最初の入力パラメータの名前を取得し、添字を 0 として削除するだけです。
3. スクリプトをツールボックスに追加します
フォルダー ディレクトリに新しいツールボックスを作成し、新しいスクリプトを作成し、スクリプト名、ラベル、説明を入力し、スタイル シートを空白のままにし、ストアの相対パス名を確認し、常にフォアグラウンドで実行することを確認して、「次へ」をクリックします。図に示すように:
図に示すように、作成したスクリプト ツールを選択し、次のページをクリックします。
input 要素があるため、ここでは入力データと出力データを設定する必要があります。したがって、入力データを設定する必要があります。表示名を入力し、入力データのデータ タイプを選択します。ここでのデータ タイプはフィーチャクラスであり、パラメーター属性は無視できます。私のものと同じにして、[完了] をクリックします。図に示すように:
4. 注意すべき事項
実行時にエラー「SyntaxError: EOL while scan string literal」が報告される場合は、コードに中国語の文字が含まれていることが原因です。解決策は大きなブログに従っています:
https://zhuanlan.zhihu.com/p/371214194?utm_id= 0
https://www.cnblogs.com/wodewei/p/14476061.html
どちらの方法でも機能します。
2. スクリプトツールのメッセージプロンプト
スクリプト ツールのメッセージ プロンプトには、主に 3 つのタイプがあります。
1. arcpy.AddMessage(str) 一般メッセージ
ランニング効果は以下の通りです。
2. arcpy.AddWarning(str) 警告メッセージ
ランニング効果は以下の通りです。
3. arcpy.AddError(str) エラー メッセージ
ランニング効果は以下の通りです。
ここで、プログラム内で arcpy.AddError(str) が実行されている限り、コードが正しいか間違っているかに関係なく、スクリプト実行失敗のプロンプトが最後に自動的に追加されることに注意してください。
3. arcpy ツールはデータを自動的に取得します
システムのセグメンテーション ツールを使用する場合、入力フィーチャ列の逆三角形をクリックすると、現在のレイヤー内のすべてのフィーチャクラスが自動的に読み込まれます。これは、図に示すように、選択に便利です。
これからやろうとしているのはこのエフェクトです。
1. レイヤーを自動取得する
この手順は非常に簡単で、入力パラメーターを設定するときにフィーチャクラスをフィーチャ レイヤーに変更するだけです。
このようにして、レイヤー上のフィーチャクラスを自動的に取得できます。入力がラスター データの場合は、ラスター レイヤーなどを選択する必要があります。1 つずつ列挙するつもりはありません。
スクリプト ツールが追加されている場合でも、心配する必要はありません。スクリプト ツールを右クリックし、[プロパティ] -> [パラメーター] をクリックして変更します。
2. レイヤー内のフィールドを自動的に取得します
これも比較的単純です。新しい入力データを作成し、データ型を として選択し、字段
ここ获取自
で最初の入力データを選択します。このようにして、最初の入力データを選択すると、2 番目のデータ フレームに最初の A フィールドが表示されます。選択するデータを入力するため:
効果は次のとおりです。