jeudi 10 novembre 2016

Ho do I calculate area using Run Length Encoding - PYTHON

I am trying to calculate the area of a file with RLE (run Length Encoding) format numbers using PYTHON. I am having trouble with my FOR and IF statements.

enter image description here

I am trying to calculate the area of cells containing the value 201.

My current error:

Traceback (most recent call last):
  File "D:\2016-2017\Fall2016\SpatialDataStructures\Labs\Lab4\Area_Calc_from_RLE.py", line 68, in <module>
    if cellValuesAsIntList[i] == 201:
IndexError: string index out of range

Here is the file I am working with:

ncols         40
nrows         40
xllcorner     -2.3036649208516
yllcorner     -1.1518324594945
cellsize      25
NODATA_value  -9999
13, 0, 1, 201, 26, 0, 1, 3, 12, 0, 1, 201, 39, 0, 1, 201, 39, 0, 1, 201, 39, 0, 2, 201, 33, 0, 4, 501, 2, 0, 2, 201, 32, 0, 4, 501, 3, 0, 3, 201, 29, 0, 5, 501, 5, 0, 2, 201, 26, 0, 7, 501, 6, 0, 1, 201, 25, 0, 8, 501, 6, 0, 1, 201, 25, 0, 7, 501, 7, 0, 1, 201, 25, 0, 6, 501, 8, 0, 1, 201, 25, 0, 6, 501, 8, 0, 1, 201, 6, 0, 4, 102, 15, 0, 7, 501, 7, 0, 1, 201, 6, 0, 6, 102, 14, 0, 7, 501, 5, 0, 2, 201, 6, 0, 6, 102, 15, 0, 6, 501, 5, 0, 1, 201, 7, 0, 5, 102, 16, 0, 6, 501, 5, 0, 1, 201, 7, 0, 4, 102, 18, 0, 8, 501, 2, 0, 5, 201, 3, 0, 3, 102, 19, 0, 9, 501, 5, 0, 2, 201, 25, 0, 8, 501, 6, 0, 1, 201, 29, 0, 4, 501, 6, 0, 1, 201, 29, 0, 4, 501, 6, 0, 1, 201, 9, 0, 1, 501, 5, 102, 15, 0, 2, 501, 7, 0, 1, 201, 9, 0, 6, 102, 23, 0, 2, 201, 8, 0, 1, 501, 6, 102, 3, 0, 4, 202, 15, 0, 2, 201, 4, 0, 6, 501, 6, 102, 2, 0, 2, 202, 2, 0, 8, 202, 5, 0, 4, 201, 4, 0, 8, 501, 4, 102, 3, 0, 1, 202, 5, 0, 2, 202, 3, 0, 6, 202, 1, 201, 7, 0, 8, 501, 2, 102, 1, 501, 21, 0, 1, 201, 6, 0, 11, 501, 22, 0, 1, 201, 6, 0, 8, 501, 25, 0, 1, 201, 6, 0, 8, 501, 25, 0, 1, 201, 1, 101, 5, 0, 8, 501, 25, 0, 1, 201, 1, 101, 5, 0, 8, 501, 14, 0, 3, 101, 8, 0, 1, 201, 1, 101, 5, 0, 11, 501, 12, 0, 4, 101, 6, 0, 2, 201, 1, 101, 4, 0, 12, 501, 11, 0, 4, 101, 6, 0, 1, 101, 1, 201, 1, 101, 4, 0, 12, 501, 21, 0, 1, 101, 1, 201, 5, 0, 11, 501, 23, 0, 1, 201, 5, 0, 8, 501, 26, 0, 1, 201, 5, 0, 8, 501, 26, 0, 1, 201, 5, 0, 7, 501, 27, 0, 1, 201, 5, 0, 8, 501, 8, 0

This is my code:

fi = open(r'D:\2016-2017\Fall2016\SpatialDataStructures\Labs\Lab4\Data\AsRLE.txt','r')
fileLines = fi.readlines()
fi.close
#---------------------------------------------------------------------

#---------------------------------------------------------------------
#Populated variables required for code from fileLines variable  
cellValuesAsString = []
lineNum = 0
for line in fileLines: # for each line the FileLines List
  # get number of cols, ncols, i.e. the 1st line in the file
  if lineNum == 0:
    ncols = int(line[14:])
  # get number of rows, nrows, i.e. the 2nd line in the file
  elif lineNum == 1:
    nrows = int(line[14:])
  # get cell size, cellsize, i.e. the 5th line in the file
  elif lineNum == 4:
    cellsize = int(line[14:])
  # get cell values in RLE format as String, , i.e. the 7th line in the file
  elif lineNum == 6:
    cellValuesAsString = line
  lineNum = lineNum + 1

# removes spaces
cellValuesAsString = cellValuesAsString.replace(" ", "")

# convert string into a list of strings split by comma
cellValuesAsStringList = cellValuesAsString.split(',')

# convert strings to integers
cellValuesAsIntList = cellValuesAsStringList
for index, item in enumerate(cellValuesAsStringList):
    cellValuesAsIntList[index] = int(cellValuesAsStringList[index])
#---------------------------------------------------------------------

#THIS IS WHERE YOU WRITE YOUR CODE

#---------------------------------------------------------------------
cellCode = 201
codeArea = 0

area = 0
npixels = 0
i = 1

for cellValuesAsIntList in line:
  if cellValuesAsIntList[i] == 201:
    b = cellValuesAsIntList[i-1]
    npixels = npixels + b
  else:
    i=i+2




print npixles
print "Area: " + npixels * cellSize

Aucun commentaire:

Enregistrer un commentaire