Python kullanarak ASCII tarama veri kümesindeki min ve maks değerlerin belirlenmesi?


12

ASCII biçiminde bir raster veri kümem var. Python kullanarak , veri kümesinin içindeki minve maxdeğerlerini belirlemem gerekir . Üstbilgi bilgilerinin, satır / sütun sayısı, hücre boyutu vb. Gibi şeyleri içeren anahtar olduğu söylendi.

minVe maxdeğerlerini belirlemek için başlık bilgisini atlayıp veri kümesinin tamamını okuyamaz mısınız?

Bunu yapmaya çalışıyorum. Üstbilgi bilgilerini içeren ilk satırları atlıyorum ve oradan değerleri belirlemeye çalışıyorum. Aşağıdakiler elimde olan bir şey, ama Python'da yeni olduğum için bazı rehberliğe ihtiyacım var.

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

Herhangi bir öneri?


2
Açık kaynak veya ESRI yığını mı kullanıyorsunuz?
underdark

Yanıtlar:


12

Numpy kullanabilirsiniz. Aşağıdaki örneğe bakın. Veri değeri olmayan değerler için bir maskeli maskelenmiş dizi oluşturulabilir. Mafromtxt ve genfromtxt için numpy yardım konusuna bakın

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]]

>>>

oradan sadece istediğiniz istatistikleri belirlemek önemlidir

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

Teşekkürler Dan. Bunu bir deneyeceğim. Alternatif bir yol var mı ... belki numpy modülü olmadan?
6'da kaoscify

6

Raster veri istatistikleri istiyorsunuz.
Önce GUI'de ne yaptığınızı görün (ödev için).

Sonra bir python penceresi veya komut dosyası kullanabilirsiniz .

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

İstatistikleri hesapladıktan sonra, istatistiklere her zaman raster nesnesi özelliği üzerinden de erişebilirsiniz. örneğin r = arcpy.Raster ("c: /data/image.tif"), r.mean, r.minimum, r.maximum
blord-castillo 23:11

@ blord-castillo Havalı! Bunu bilmiyordum.
Tavsiye

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

Bu, daha önce denediğim bir çeşit, ama split yöntemini kullandığımda hata almaya devam ediyorum:AttributeError: 'list' object has no attribute 'split'
19'da kaoscify

data = raster_file.readlines()[4:]Aralığı belirlemek söz konusu olduğunda çizginin gerçekten çalışmadığını hissediyorum . Önceki yorumda olan hatayı düzelttim. Bu, num = data[7]3. satıra eklenerek yapıldı . Daha sonra kullanılarak bölündü values = num.split()ve maks / dak'ı bulabildi, ancak sadece bu hat için. Belgenin tamamından maksimum / dak değerini nasıl bulabilirim?
0'da kaoscify

oh, benim hatam, "veri" bir liste, "satır" dize. Kodu düzenledim ... Bir asc dosyasıyla test ettim. Sadece kopyalayıp yapıştırın, girintiye dikkat edin.
Pablo

2
if check==TrueMin / maks değerlerinizi başlatarak bloğu bırakabilirsiniz . Min'i sys.float_info.max'a ve max'i sys.float_info.min olarak başlatmak isteyeceksiniz.
Sasa Ivetic

3
Max değerini sys.float_info.min olarak ve min değerini sys.float_info.max olarak başlatmanız gerekir. İlk dakikanızın mümkün olan en büyük değer olacağı ve onunla karşılaştırdığınız herhangi bir değer daha küçük olacak ve böylece yeni min olacaktır. Maksimum değerinizle aynı şey geçerli, mümkün olan en küçük değer olacak ve onunla karşılaştırdığınız herhangi bir değer daha büyük olacak ve dolayısıyla yeni maks.
Sasa Ivetic

1

Numpy kullanmak istemiyorsanız (ve gerçekten yapmalısınız, bu tür bir şey için mükemmeldir), o zaman şunları yapmanız gerekir:

  • maximumdeğişkeninizi çok büyük bir negatif sayıya ve minimumdeğişkeninizi çok büyük bir pozitif sayıya ilklendirin
  • dizelerin bir listesini almak için her satırı böl ve bir kayanlar listesine dönüştürmek için liste kavrama özelliğini kullan
  • nihayet maximum = max(maximum, max(myfloatlist))asgari değer için ve buna eşdeğer bir şey kullanın .

0

Bunu geçen gün yaptım. Kullandım arcpy.RasterToNumPyArray, numpy dizisini bir listeye dönüştürdüm, daha sonra min ve max değerlerini bulmak için bir liste kavrama yoluyla listemle yineledim.

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

değil myArray.min()/ myArray.max()basit / hızlı?
Mike T

1
@Chad, zaten numpy diziniz varsa, o zaman bir listeye dönüştürmeye gerek yoktur, sadece yukarıdaki iş parçacığımdaki min (), max () vb işlevlerini kullanın. Ayrıca belirttiğiniz gibi, Arcpy'ye zımni bir erişim belirtilmedi.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.