Python을 사용하여 ASCII 래스터 데이터 세트에서 최소값과 최대 값을 결정합니까?


12

ASCII 형식의 래스터 데이터 세트가 있습니다. 파이썬을 사용 하여 데이터 세트 내부의 minmax값 을 결정해야합니다 . 헤더 정보가 핵심이며 행 / 열 수, 셀 크기 등과 같은 것들이 포함되어 있다고 들었습니다.

단순히 헤더 정보를 건너 뛰고 전체 데이터 세트를 읽고 minmax값 을 결정할 수 없습니까?

이것이 내가하려는 일입니다. 헤더 정보가 들어있는 첫 번째 두 줄을 건너 뛰고 그 값을 결정하려고합니다. 다음은 내가 가진 것의 일종이지만 파이썬을 처음 접할 때 지침이 필요합니다.

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 스택을 사용하고 있습니까?
underdark

답변:


12

numpy를 사용할 수 있습니다. 아래 예를 참조하십시오. 데이터가없는 값을 고려하여 numpy masked array를 생성 할 수 있습니다. 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에서하고있는 일을 확인하십시오 (숙제).

그런 다음 파이썬 창 또는 스크립트를 사용할 수 있습니다 .

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()

이것은 내가 이전에 시도한 것의 일종이지만 split 메소드를 사용할 때 오류가 계속 발생합니다.AttributeError: 'list' object has no attribute 'split'
kaoscify

data = raster_file.readlines()[4:]범위를 지정할 때 실제로 라인 이 작동하지 않는 것 같습니다 . 이전 의견에서 내가 겪었던 오류를 수정했습니다. 이것은 num = data[7]세 번째 줄 을 추가하여 수행되었습니다 . 그런 다음 사용하여 분할 values = num.split()하고 최대 / 최소를 찾을 수 있었지만 해당 특정 라인에만 해당되었습니다. 전체 문서에서 최대 / 최소를 어떻게 찾을 수 있습니까?
kaoscify

오, 내 실수는 "data"는리스트이고 "lines"는 문자열이다. 코드를 편집했습니다 ... asc 파일로 테스트했습니다. 그냥 복사하여 붙여 넣고 들여 쓰기에주의하십시오.
Pablo

2
if check==True최소 / 최대 값을 초기화하여 블록을 삭제할 수 있습니다 . min을 sys.float_info.max로 초기화하고 max를 sys.float_info.min으로 초기화하려고합니다.
Sasa Ivetic

3
max를 sys.float_info.min으로 초기화하고 min을 sys.float_info.max로 초기화해야합니다. 당신이 당신의 초기 최소값이 가능한 가장 큰 값이되고, 당신이 비교하는 모든 값은 더 작아 질 것이므로 새로운 최소값이됩니다. 최대 값도 마찬가지입니다. 가능한 가장 작은 값이되며, 비교할 수있는 값이 더 커져서 새 최대 값이됩니다.
Sasa Ivetic

1

당신이 numpy를 사용하고 싶지 않다면 (그리고 정말로 이런 종류의 일에 완벽해야합니다), 다음을 수행해야합니다 :

  • 당신의 초기화 maximum매우 큰 음의 번호 변수와 minimum매우 큰 양수 변수를
  • 각 줄을 분할 하여 문자열 목록을 얻고 list comprehension 을 사용 하여 부동 목록으로 변환하십시오.
  • 마지막으로 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()간단는 / 더 빨리?
Mike T

1
@Chad, 이미 numpy 배열을 가지고 있다면 목록으로 변환 할 필요가 없으며 위의 스레드에서 min (), max () 등 함수를 사용하십시오. 참고로 Arcpy에 대한 암시 적 액세스는 표시되지 않았습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.