Pythonを使用してASCIIラスターデータセットの最小値と最大値を決定しますか?


12

ASCII形式のラスターデータセットがあります。Pythonを使用して、データセット内の値minmax値を決定する必要があります。ヘッダー情報はキーであり、行/列の数、セルサイズなどが含まれていると言われています。

ヘッダー情報をスキップして、データセット全体を読み取って値minmax値を決定することはできませんか?

これが私がやろうとしていることです。ヘッダー情報を含む最初の数行をスキップして、そこから値を決定しようとしています。以下は私が持っているものの一種ですが、Pythonが初めてなのでいくつかのガイダンスが必要です。

raster_file = open('data.asc', 'r') # Open the file
data = raster_file.readlines()[4:] # Read the lines in the file, and skip the first six lines

for lines in data:
    print max(data) # Find the max value in data
    print min(data) # Find hte min value in data

助言がありますか?


2
オープンソースまたはESRIスタックを使用していますか?
暗闇

回答:


12

numpyを使用できます。以下の例を参照してください。データなしの値を考慮して、numpyマスク配列を生成できます。mafromtxtおよびgenfromtxtのnumpyヘルプトピックを参照してください。

Below is a small ascii file with a nodata value of -999

ncols          3
nrows          3
xllcorner      0
yllcorner      0
cellsize       1
NODATA_value   -999
0 1 2
-999 4 5 
6 7 8

>>> import numpy as np
>>> ascii_file = "c:/temp/Ascii_3x3_1nodata.asc"
>>> an_array = np.mafromtxt(ascii_file, 'float', '#', None, 6, None, '-999')

>>> print an_array

[[0.0 1.0 2.0]
 [-- 4.0 5.0]  
 [6.0 7.0 8.0]]

>>>

そこから、それは単にあなたが望む統計を決定する問題です

>>> print an_array.min()
0.0
>>> print an_array.max()
8.0
>>> print an_array.mean()
4.125
>>> 

ダンありがとうございます。これを試してみます。別の方法があります...おそらくnumpyモジュールなしで?
kaoscify

6

ラスタデータの統計が必要です。
最初にGUIで何をしているかを確認します(宿題用)。

次に、Pythonウィンドウまたはスクリプトを使用できます。

import arcpy
arcpy.CalculateStatistics_management("c:/data/image.tif", "4", "6", "0;255;21")

統計を計算すると、ラスターオブジェクトプロパティからも常に統計にアクセスできます。例r = arcpy.Raster( "c:/data/image.tif")、r.mean、r.minimum、r.maximum
blord-castillo

@ blord-castilloかっこいい!知らなかった。ヒントをありがとう:)
kaoscify

3
import sys

class Ascii_file(object):
    def __init__(self,file):
        self.raster_file = open(file, 'r') # Open the file
        self.max=sys.float_info.min
        self.min=sys.float_info.max
    def __minmax(self,value):
        if value>self.max:self.max=value
        if value<self.min:self.min=value
    def getMinMax(self):
        data = self.raster_file.readlines()
        data_values=data[6:]
        nodata=float(data[5].split()[1])
        for line in data_values:
            values=line.split(" ")
            for value in values:
                value=float(value)
                if value==nodata:continue
                else: self.__minmax(value)
        return self.min, self.max

if __name__=="__main__":
    myfile = Ascii_file('data.asc')
    print myfile.getMinMax()

これは私が以前試みていたようなものですが、分割メソッドを使用するとエラーが発生し続けますAttributeError: 'list' object has no attribute 'split'
。– kaoscify

data = raster_file.readlines()[4:]範囲を指定することになると、行は実際には機能しないように感じます。前のコメントで持っていたエラーを修正しました。これはnum = data[7]、3行目を追加することで行われました。次に、それを使用values = num.split()して分割し、最大/最小値を見つけることができましたが、その特定の行のみです。ドキュメント全体から最大/最小を見つけるにはどうすればよいですか?
kaoscify

ああ、私の間違い、「データ」はリスト、「行」は文字列です。コードを編集しました... ascファイルでテストしました。コピーして貼り付け、インデントに注意してください。
パブロ

2
if check==True最小/最大値を初期化することでブロックをドロップできます。minをsys.float_info.maxに、maxをsys.float_info.minに初期化します。
ササイヴェティック

3
maxはsys.float_info.minに、minはsys.float_info.maxに初期化する必要があります。最初の最小値が可能な最大値になり、それと比較する値が小さくなるため、新しい最小値になります。最大値についても同様です。可能な最小の値になり、比較する値が大きくなるため、新しい最大値になります。
ササイヴェティック

1

numpyを使用したくない場合(そして、本当にそうすべきで、この種のものに最適です)、次のことが必要になります。

  • maximum変数を非常に大きな負の数に初期化し、変数をminimum非常に大きな正の数に初期化する
  • 各行を分割して文字列のリストを取得し、リスト内包表記を使用してフロートのリストに変換します
  • 最後maximum = max(maximum, max(myfloatlist))に、最小値に相当するものを使用します。

0

先日これをやったばかりです。を使用しarcpy.RasterToNumPyArrayてnumpy配列をリストに変換し、リスト内包表記を使用してリストを反復処理して最小値と最大値を見つけました。

import arcpy
import numpy
myArray = arcpy.RasterToNumPyArray(r"D:\NED_93512417\NED_93512417_3DEM_RPRJ.TIF")
p = myArray.tolist()

max_elev = max([item for sublist in p for item in sublist])
min_elev = min([item for sublist in p for item in sublist])

myArray.min()/ myArray.max()シンプル/高速ではありませんか?
マイクT

1
@Chad、既にnumpy配列がある場合は、リストに変換する必要はありません。上記のスレッドでmin()、max()などの関数を使用するだけです。お気づきのとおり、Arcpyへの暗黙のアクセスは示されていません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.