我正在尝试将缓冲区应用于 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
方法和
try-except
块在 GeoDataFrame 上应用缓冲区函数,同时处理引发错误的特定行。这将允许为大多数行计算缓冲区,同时在遇到错误时在相应行中插入
None
。
这是一个示例:
import geopandas as gpd
def calculate_buffer(geom):
try:
return geom.buffer(305)
except Exception as e:
print(f"Error encountered while buffering geometry at index {geom.name}: {e}")
return None
# 从现有 GeoDataFrame 创建示例 GeoDataFrame
gdf = gpd.GeoDataFrame({
'id': [1, 2, 3, 4, 5],
'geometry': [
Point(1, 1),
Point(2, 2),
# 创建一个无效的几何图形以引发错误
LineString([(0, 0), (1, 1), (1, nan)]),
Point(3, 3),
Point(4, 4)
]
})
# 使用 apply 应用缓冲区函数,处理错误
gdf['buffer_geometry'] = gdf['geometry'].apply(calculate_buffer)
print(gdf)
此代码首先定义了一个名为
calculate_buffer
的函数,该函数包含计算缓冲区的逻辑。在
try-except
块内,它尝试计算给定几何图形的缓冲区。如果遇到任何错误,它将打印一条错误消息(包括索引以供调试)并返回
None
。否则,它将返回计算出的缓冲区几何图形。
然后,代码使用
apply
方法将
calculate_buffer
函数应用于 GeoDataFrame 的
geometry
列。这将为每一行执行函数,并将结果存储在新列
buffer_geometry
中。
通过这种方法,应该能够有效地处理大型 GeoDataFrame,同时在遇到问题几何图形时保持代码的弹性。
标签:python,pandas,error-handling,geopandas,geos From: 78818424