在我用QGIS 2.8开发的应用程序中,我有一个CSV与一系列点和线直接通信。然而,CSV有点问题。提供CSV数据的硬件每隔几行只提供位置数据。也就是说,有一个具有指定X和Y列的属性表,其字段仅在关键时间才被填充。其余的是其他仍然有用的数据,但位置只是间歇性地更新。
我有我的点特性的结构,所以只使用底部的(最近的)属性行来显示一个点。当然,我需要的位置数据,最底层的行,否则点消失。目前,我没有得到它,但偶尔。我的CSV ->点代码目前看起来如下(使用了pyshp
库):
cur_dir = os.path.dirname(os.path.realpath(__file__))
file_location = os.path.join(cur_dir, "data", "mycsv.csv")
out_file = os.path.join(cur_dir, "data", "mypoint.shp")
idd, az, y, x = [], [], [], []
with open(file_location, 'rb') as csvfile:
r = list(csv.reader(csvfile, delimiter=','))
reader = r[len(r) - 1:] #read only top row
for i, row in reversed(list(enumerate(reader))): #reverse table
idd.append(str(row[0]))
az.append(float(row[2]))
y.append(float(row[6]))
x.append(float(row[7]))
print "appended"
w = shapefile.Writer(shapefile.POINT)
w.field('ID', 'N')
w.field('AZIMUTH', 'N', 12)
w.field('Y', 'F', 10, 8)
w.field('X', 'F', 10, 8)
for j, k in enumerate(x): #write shapefile
w.point(k, y[j])
w.record(idd[j],az[j],y[j], k )
print "recorded"
w.save(out_file)
这里是CSV的一个片段。您将看到右边的切碎列:http://i.stack.imgur.com/ULZOS.png
首先,我尝试在多个枚举器下面的不同地方添加if x > 0:
条件,以便在读取数据之前可能停止数字化,但每次都会给出错误min() arg is an empty sequence
。我甚至不确定这是不是正确的开始,因为它可能只会使属性之间的顺序不一致。我真的需要某种“如果X或Y字段为null,使用以前字段的数据填充字段”脚本。
我使用Python2.7和PyQt4,用QGIS2.8API开发,运行在Ubuntu14.04上,
发布于 2015-10-30 09:01:15
您可以缓存X和Y数据点的最后有效值,我假设它们在row6和row7中
with open(file_location, 'rb') as csvfile:
r = list(csv.reader(csvfile, delimiter=','))
reader = r[len(r) - 1:] #read only top row
lastX = 0.
lastY = 0.
for i, row in reversed(list(enumerate(reader))): #reverse table
idd.append(str(row[0]))
az.append(float(row[2]))
try:
y.append(float(row[6]))
lastY = float(row[6]))
except (TypeError, ValueError) as e:
if len(y) > 0:
y.append(lastY)
try:
x.append(float(row[7]))
lastX = float(row[7]))
except (TypeError, ValueError) as e:
if len(x) > 0:
x.append(lastX)
print "appended"
我假设缺失的CSV值是空字符串或空字符串。当转换为float()时,这两个值都会引发异常。如果值以0形式出现,那么请原始dev使值为空,因为0可能是一个真正的坐标,而不是缺少的坐标。
如果X和Y总是同时通过(如果有一个,则总是有另一个),那么您可以使用一个try/ all块来处理所有情况。
https://stackoverflow.com/questions/33437945
复制