使用python从csv文件中的坐标计算不规则形状的面积

时间:2016-06-04 14:15:23

标签: python csv area

我使用Python导入带有坐标的csv文件,将其传递给列表并使用包含的数据计算每个不规则图形的面积。 csv文件中的数据如下所示。

import csv
import math

def main():
    try:
    # ask user to open a file with coordinates for 4 points
        my_file = raw_input('Enter the Irregular Differences file name and location: ')

        file_list = []

        with open(my_file, 'r') as my_csv_file:
            reader = csv.reader(my_csv_file)
            print 'my_csv_file: ', (my_csv_file)
            reader.next()

            for row in reader:
                print row
                file_list.append(row)

        all = calculate(file_list)
        save_write_file(all)

    except IOError:
        print 'File reading error, Goodbye!'
    except IndexError:
        print 'Index Error, Check Data'


# now do your calculations on the 'data' in the file.

def calculate(my_file):

return_list = []

    for row in my_file:

        de1 = float(row[2])
        dn1 = float(row[3])
        de2 = float(row[4])
        dn2 = float(row[5])
        de3 = float(row[6])
        dn3 = float(row[7])
        de4 = float(row[8])
        dn4 = float(row[9])
        de5 = float(row[10])
        dn5 = float(row[11])
        de6 = float(row[12])
        dn6 = float(row[13])
        de7 = float(row[14])
        dn7 = float(row[15])
        de8 = float(row[16])
        dn8 = float(row[17])
        de9 = float(row[18])
        dn9 = float(row[19])

        area_squared = abs((dn1 * de2) - (dn2 * de1)) + ((de3 * dn4) - (dn3 * de4)) + ((de5 * dn6) - (de6 * dn5)) + ((de7 * dn8) - (dn7 * de8)) + ((dn9 * de1) - (de9 * dn1))
        area = area_squared / 2

        row.append(area)
        return_list.append(row)
    return return_list


def save_write_file(all):

    with open('output_task4B.csv', 'w') as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(["ID", "Name", "de1", "dn1", "de2", "dn2", "de3", "dn3", "de4", "dn4", "de5", "dn5", "de6", "dn6", "de7", "dn7", "de8", "dn8", "de9", "dn9", "Area"])
        writer.writerows(all)

if __name__ == '__main__':
    main()

我正在使用的代码如下 - 但它会引发一个IndexError:因为第一行没有所有列中的数据。有没有办法编写csv文件,因此它只使用包含数据的colums?

SELECT * FROM your_table ORDER BY column_number LIMIT 4,1

任何建议

1 个答案:

答案 0 :(得分:0)

您的问题似乎出现在calculate函数中。

您试图访问row的各种索引,而不首先确认它们存在。一种天真的方法可能是将值视为零,如果它们不存在,除了:

+ ((dn9 * de1) - (de9 * dn1)

是一种环绕的尝试,这可能使你的数学无效,因为它们会变为零。

更好的方法可能是使用行的一部分,并使用序列迭代方法而不是尝试需要一定数量的点。这使您的代码适合数据。

coords = row[2:]   # skip id and name

assert len(coords) % 2 == 0, "Coordinates must come in pairs!"

prev_de = coords[-2]
prev_dn = coords[-1]
area_squared = 0.0

for de, dn in zip(coords[:-1:2], coords[1::2]):
    area_squared += (de * prev_dn) - (dn * prev_de)
    prev_de, prev_dn = de, dn

area = abs(area_squared) / 2

下一个问题是处理可变长度输出。我建议把这个区域放在坐标之前。这样你知道它总是第3列(或其他)。