0

SQL Server Express テーブルに格納されている値を使用して、ラスター ファイル (植生と土地被覆のタイプを表す) を再分類しようとしています。テーブルには約 400 種のレコードのセットがあり、各行は異なる種を表し、列は各植生タイプを表しています。各植生タイプは、その種の生息地に適している場合は「1」、適していない場合は「0」としてコード化されます。次に、植生ラスターは、種の記録に関連付けられた値に基づいて、「1」または「0」の 2 つの値に再分類されます (これは種ごとにわずかに異なります)。

PythonWin では、pyodbc を使用して SQL Server Express データベース テーブルに接続し、select クエリ ステートメントを実行して、種レコード (行) の値を pyodbc カーソルに収集しています。次に、各列の値を remap ステートメントで出力ラスター値に割り当てたいと思います (添付のコードを参照)。残念ながら、次のエラーが発生し続けます。

TypeError: list indices must be integers, not tuple

カーソルには、選択クエリに基づく SQL Server Express テーブルのすべての値が含まれており、カーソル オブジェクトのrowパラメーターを介してデータにアクセスできます。したがって、row.BIOME_X 変数は確実に 1 または 0 の値を格納しています。それとも、Python 構文を使ってばかげたことをしているだけなのでしょうか。何か案は?

ありがとう!

# Load Python libraries          
import pyodbc
import arcpy
from arcpy import env
from arcpy.sa import *
import os
arcpy.env.overwriteOutput = 1

# Check out the ArcGIS Spatial Analyst extension license
arcpy.CheckOutExtension("Spatial")

# set variables
modelList = arcpy.ListFiles() # build list of species model names for loop
biome_Cur = ("xxxxxxx/xxxx/xxxxxx/1_Input.gdb/biome_current") # the original raster which will be reclassed

# connect to SQL Server Express database
cnxn = pyodbc.connect('DRIVER={SQL Server Native Client 10.0};SERVER=DESKTOP\SQLEXPRESS;DATABASE=Species;UID=sa;PWD=XXXXXX')
cursor = cnxn.cursor()

# main processing loop
for model in modelList:

    # reclassifies biome raster based on suitability code from SQL Server Species database
    # select query
    cursor.execute("""
                SELECT [BIOME_1],[BIOME_6],[BIOME_7],[BIOME_8],[BIOME_9],[BIOME_10],[BIOME_14],[BIOME_19],[BIOME_20],
                [BIOME_21],[BIOME_22],[BIOME_23],[BIOME_24],[BIOME_25],[BIOME_27],[BIOME_29],[BIOME_30],[BIOME_31],
                [BIOME_32],[BIOME_35],[BIOME_36],[BIOME_37],[BIOME_38],[BIOME_39],[BIOME_40],[BIOME_41],[BIOME_42],
                [BIOME_43],[BIOME_44],[BIOME_45],[BIOME_46],[BIOME_47],[BIOME_48],[BIOME_50],[BIOME_100],[BIOME_200]
                FROM Species.dbo.BiomesPerSpp_Rehfeldt
                WHERE ID = ?""", (model))

    # assign remap variable for reclassification
    remap_cur = arcpy.sa.RemapValue([7, row.BIOME_7][8, row.BIOME_8],[9, row.BIOME_9],[14, row.BIOME_14],[20, row.BIOME_20],
    [21, row.BIOME_21], [22, row.BIOME_22], [23, row.BIOME_23], [25, row.BIOME_25], [30, row.BIOME_30],       
    [31,row.BIOME_31],[32, row.BIOME_32], [36, row.BIOME_36], [38, row.BIOME_38], [41, row.BIOME_41], 
    [42, row.BIOME_42], [43, row.BIOME_43],[44, row.BIOME_44], [45, row.BIOME_45], [46, row.BIOME_46], 
    [47, row.BIOME_47], [50, row.BIOME_50], [100, row.BIOME_100],[200, row.BIOME_200])

    biomeReClass_cur = arcpy.sa.Reclassify(biome_Cur, "Value", remap_cur, "NODATA")
4

1 に答える 1

1

RemapValueの下にリストされているように、7項目と8項目の間にコンマを省略しました。また、リストのリスト全体を角かっこで囲む必要があります。

remap_cur = arcpy.sa.RemapValue([[7, row.BIOME_7],[8, row.BIOME_8]...[200, row.BIOME_200]])

詳細については、http://resources.arcgis.com/en/help/main/10.1/index.html#//005m0000007q000000を参照してください。

于 2012-10-15T17:18:17.880 に答える