マスク出力でラスターを抽出すると、マスクが完全にオーバーラップしませんか?


8

流域集積グリッドと集水域を含むシェープファイルがあります。次に、それらに対していくつかの計算を行いたいので、特定の集水域に隣接するラスター内のセルからデータを抽出する必要があります。

そのプロセスでは、集水域ポリゴンの1つをマスクとして使用して、ラスターで[マスクによる抽出]を使用しようとします(後でループしますが、今は1回だけ作業する必要があります)。

問題は、元のラスターとマスキングポリゴンの両方と比較して、抽出されたラスターがセルの半分だけ左にシフトすることです。ラスターをポイントに変換し、後で他のポリゴンと交差させようとするので、これは私のプロセスの残りを台無しにしています。そして、抽出されたラスターが元のラスターと重なっていない限り、正しいポリゴンが得られません。

ポリゴンはラスターから作成されるため、元のラスターとポリゴンは完全に整列しています。どういうわけか投影図になんらかの変化があったかどうかを確認しようとしましたが、見つけることができません。また、新しいArcMapドキュメントを試し、すべてを数回再起動し(これにより、驚くほど頻繁に問題が解決します)、スクリプトを呼び出すのではなく、Pythonプロンプトからツールを実行しました。ツールボックスからマスクによる抽出ツールを実行しようとしても、同じ結果になりました。

これは、ArcMapのpythonプロンプトで使用する(非常に単純な)コードです。

inpgs = r'C:\GIS\Catchm_ex.shp'
flowacc = r'C:\GIS\flowacc'
arcpy.MakeFeatureLayer_management(inpgs, 'currentMask', '"HydroID" = 269634')
outRaster = arcpy.sa.ExtractByMask(flowacc, 'currentMask')

ここにサンプルファイルがあります

Windows 7、ArcInfo 10.0、Python 2.6を使用しています。


私は今、Extract by Polygonを試しましたが、それはうまくいくようです。ExtractByMaskでマシンが誤動作しているだけですか?唯一の欠点は、マスキングポリゴンの座標を取得する方法がわからないため、スクリプトでその関数を使用するときに問題が発生することです(9つのセルのみをカバーし、中心にポイントがある場合)。


次のコードを使用して、ポリゴンによる抽出で動作するようになりました(Esriのサポートページから変更)。残念ながら、これは私の問題を解決しません。出力(このツールとマスクによる抽出)がセルの半分だけ左にシフトする場合とシフトしない場合があります。ほとんどの場合はそうですが、実際には本来あるべき場所にあることもあります。

だから今、私は本当に混乱しています。これは私のコンピューターで起こっているのですか?他の誰かが同じことを経験している場合は、コメントを書き込んでください。私だけではないことを私に知らせてください:)私にとって、この問題はバグとしては大きすぎる問題であり、これが問題となっています途中で自分自身を作成し​​たこと。

それを避ける方法に関するアイデアはありますか?

def ReadPoints(infc):
    try:
        import arcpy, numpy
    except ImportError:
        sys.exit('Unable to import arcpy')

    # Identify the geometry field
    desc = arcpy.Describe(infc)
    shapefieldname = desc.ShapeFieldName
    points = []

    # Create search cursor
    rows = arcpy.SearchCursor(infc)

    # Enter for loop for each feature/row
    for row in rows:
        # Create the geometry object
        feat = row.getValue(shapefieldname)
        partnum = 0

        # Step through each part of the feature
        for part in feat:
            # Step through each vertex in the feature
            for pnt in feat.getPart(partnum):
                if pnt:
                    points.append([int(pnt.X), int(pnt.Y)])

    pt = numpy.array(points)
    pts = []
    for i in range(len(pt)):
        t = pt[i]
        pts.append(arcpy.Point(t[0],t[1]))
    return pts

回答:



1

画像全体をポイントに変換し、ポリゴンレイヤーとポイントレイヤーの間の交差に基づいてポイントを選択することはできますか?私はこれがあなたが得ている奇妙な結果の洞察を与えないことを知っていますが、それは有用な「回避策」かもしれません


はい、できます。唯一の問題は、ラスターが大きすぎるため、計算にかなり時間がかかることです。とにかく、まったく機能しないのではなく、それを試してみるかもしれません。ご協力ありがとうございます。
マーティン

これで効果があるかどうかはわかりませんが、シンボルをインポートできるので、シンボルを1つ設定して、残りのすべてにインポートできます。画像分析ウィンドウをご覧になったことがあれば、役立つ可能性のある機能がたくさんあります。画像が大きい場合は、モザイクデータセットの作成も検討してください。モザイクを使用すると、視覚的表示を改善できる機能を追加できます。それがお役に立てば幸いです:)
dango

私はこれまで画像分析をあまり扱っていませんでしたが、今は試してみる必要があるかもしれません。これが私をどこかに連れて行くことができるなら私は戻って報告します:)
マーティン

1

ラスター環境で、スナップラスターを入力ラスター(抽出されるラスター)と同じになるように設定します。これにより、シフトが回避されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.