回答:
以下は、現在の選択を無視して、パーセントに基づいてレイヤー内のランダムフィーチャを選択するpython関数です。
def SelectRandomByPercent (layer, percent):
#layer variable is the layer name in TOC
#percent is percent as whole number (0-100)
if percent > 100:
print "percent is greater than 100"
return
if percent < 0:
print "percent is less than zero"
return
import random
fc = arcpy.Describe (layer).catalogPath
featureCount = float (arcpy.GetCount_management (fc).getOutput (0))
count = int (featureCount * float (percent) / float (100))
if not count:
arcpy.SelectLayerByAttribute_management (layer, "CLEAR_SELECTION")
return
oids = [oid for oid, in arcpy.da.SearchCursor (fc, "OID@")]
oidFldName = arcpy.Describe (layer).OIDFieldName
path = arcpy.Describe (layer).path
delimOidFld = arcpy.AddFieldDelimiters (path, oidFldName)
randOids = random.sample (oids, count)
oidsStr = ", ".join (map (str, randOids))
sql = "{0} IN ({1})".format (delimOidFld, oidsStr)
arcpy.SelectLayerByAttribute_management (layer, "", sql)
これをコピーして、ArcMapのPythonシェルに貼り付けます。
次に、シェルタイプSelectRandomByPercent ("layer", num)
で、layer
はレイヤーの名前でnum
あり、パーセントの整数です。
要求されたサブセット選択を見つけるためのバリエーション:
def SelectRandomByPercent (layer, percent):
#layer variable is the layer name in TOC
#percent is percent as whole number (0-100)
if percent > 100:
print "percent is greater than 100"
return
if percent < 0:
print "percent is less than zero"
return
import random
featureCount = float (arcpy.GetCount_management (layer).getOutput (0))
count = int (featureCount * float (percent) / float (100))
if not count:
arcpy.SelectLayerByAttribute_management (layer, "CLEAR_SELECTION")
return
oids = [oid for oid, in arcpy.da.SearchCursor (layer, "OID@")]
oidFldName = arcpy.Describe (layer).OIDFieldName
path = arcpy.Describe (layer).path
delimOidFld = arcpy.AddFieldDelimiters (path, oidFldName)
randOids = random.sample (oids, count)
oidsStr = ", ".join (map (str, randOids))
sql = "{0} IN ({1})".format (delimOidFld, oidsStr)
arcpy.SelectLayerByAttribute_management (layer, "", sql)
最後に、パーセントではなくカウントでレイヤーを選択するもう1つのバリエーション:
def SelectRandomByCount (layer, count):
import random
layerCount = int (arcpy.GetCount_management (layer).getOutput (0))
if layerCount < count:
print "input count is greater than layer count"
return
oids = [oid for oid, in arcpy.da.SearchCursor (layer, "OID@")]
oidFldName = arcpy.Describe (layer).OIDFieldName
path = arcpy.Describe (layer).path
delimOidFld = arcpy.AddFieldDelimiters (path, oidFldName)
randOids = random.sample (oids, count)
oidsStr = ", ".join (map (str, randOids))
sql = "{0} IN ({1})".format (delimOidFld, oidsStr)
arcpy.SelectLayerByAttribute_management (layer, "", sql)
random.sample()
。
sql
パラメーターの文字列の長さに既知の制限はありますか?
通常、blah238で説明されている空間エコロジーツールの使用もお勧めします。
ただし、試すことができる別の方法は、Randomという属性を追加して乱数を保存することです。
次に、Pythonパーサーでその属性のフィールド計算機を使用して、次のコードブロックを使用します。
import random
def rand():
return random.random()
下の画像をご覧ください:
これにより、0〜1のランダムな値が作成されます。その後、フィーチャの20%を選択する場合、ランダム値が0.2未満のフィーチャを選択できます。もちろん、これは多くの機能でうまく機能します。テストとして7つのフィーチャのみを含むフィーチャクラスを作成しましたが、0.2未満の値はありませんでした。ただし、多くの機能があるように見えるので、それは問題ではありません。
Hawthのツールを試すことができます:http : //www.spatialecology.com/htools/rndsel.php
既存の選択は尊重されないため、最初に既存の選択からフィーチャレイヤーを作成する必要があることに注意してください。
ArcGIS 10の別のランダム選択アドイン、サンプリングデザインツールを次に示します。データセット内のフィーチャの20%を選択できます。ただし、これは、blah238で言及されているHawth's Toolsの制限と同様に、選択セットを使用してランダムに選択することはありません。