我正在尝试将缓冲区应用于 600,000 行的地理数据帧(作为更大过程的一部分),gdf 包含几何线串和多线串。当我运行缓冲区代码行时:
gdf['buffer_geometry'] = gdf.buffer(305)
我收到以下错误:
GEOSException:TopologyException:分配的深度与 -12250000 3700000 不匹配
我迭代了地理数据框,发现此错误是在 2 个非连续行(索引 4934 和索引 80,023)上引发的。
我不关心为这两行计算缓冲区 - 相反,我想在代码中设置逻辑来计算除引发错误的两行之外的所有行的缓冲区,并在这两行中返回None .
我知道这违背了 pandas 的设计原理——但是有没有办法在不单独迭代每一行的情况下实现这一点?我需要优先考虑让大多数行成功且快速地运行,而不是让每一行都填充缓冲区。
下面是我编写的逐行循环,是为了说明我想要实现的目标,但对于我的需求来说,这太慢了。
# To stop the loop
max = len(gdf)
# Indices
start = 0
end = 1
failed_index = []
while start <= max:
GDF_copy = GDF.copy()
GDF_copy = GDF_copy[start:end]
# Try to return buffer geometry
try:
buffer = GDF_copy['line_geom'].buffer(305)
GDF.loc[start, ['buffer_geom']] = buffer
# If buffer function fails, return None
except:
GDF.loc[start, ['buffer_geom']] = None
failed_index.append(start)
start += 1
end += 1
将
apply
方法与 lambda
函数一起使用应该可以工作,并且可以避免每行循环:
# Function to apply buffer and handle errors
def no_error_buffer(geometry, distance):
try:
return geometry.buffer(distance)
except:
return None
# Apply the buffer with the function to handle exceptions
gdf['buffer_geometry'] = gdf['geometry'].apply(lambda geom: no_error_buffer(geom, 305))