Shapely计算地理数据时首次触发RuntimeWarning但结果正常问题咨询
处理Shapely首次计算距离/最短线时触发RuntimeWarning但结果正确的问题
处理大量地理数据时,偶尔会触发RuntimeWarning: invalid value encountered in distance和RuntimeWarning: invalid value encountered in shortest_line警告,但计算结果完全正确。经测试发现,特定地理数据仅首次计算时会弹出该警告,重复计算则不再触发。
复现代码
from shapely.geometry import Point, LineString, Polygon p = Point([444037.45235923684, 4432768.940062214]) l = LineString([ (444133.53324426746, 4432805.31270424), (444133.53324426746, 4432805.31270424), (444135.7614419243, 4432805.378952727), (444137.778475223, 4432805.432100361), (444139.7896194984, 4432805.446620431), (444141.81370974134, 4432805.440795805), (444143.84810851346, 4432805.423914926), (444145.8848029126, 4432805.401874071), (444147.92289024906, 4432805.380664571), (444149.96274860646, 4432805.363180846), (444152.0036369841, 4432805.350817922), (444154.0447198316, 4432805.344272887), (444156.08543010475, 4432805.343888665), (444158.1252506391, 4432805.349884151), (444160.1636512014, 4432805.362450611), (444162.2002235288, 4432805.381747374), (444164.23434018274, 4432805.408150714), (444166.2654926669, 4432805.442302018), (444168.292792287, 4432805.485611625), (444170.31557974376, 4432805.540908249), (444172.3342188634, 4432805.61411673), (444174.35935487103, 4432805.717899431) ]) # 首次计算触发警告 d = p.distance(l) # 输出:C:\Users\XXX\AppData\Local\Programs\Python\Python39\lib\site-packages\shapely\measurement.py:74: RuntimeWarning: invalid value encountered in distance # return lib.distance(a, b, **kwargs) print(d) # 102.73512328429545 # 重复计算无警告 d = p.distance(l) print(d) # 102.73512328429545
原因分析
这种现象是因为Shapely底层库在首次处理特定几何对象时,内部计算流程中出现了临时的无效值(比如除以零、NaN等),但后续的容错逻辑自动修正了该问题,最终返回正确结果;同时首次计算后,几何对象会被预处理或缓存,重复计算时跳过了触发警告的步骤。
解决方案
1. 临时屏蔽警告
如果不想看到警告,可以在首次计算时用warnings模块临时屏蔽RuntimeWarning,计算完成后恢复默认设置:
import warnings from shapely.geometry import Point, LineString p = Point([444037.45235923684, 4432768.940062214]) l = LineString([...]) # 省略几何数据 # 临时屏蔽RuntimeWarning with warnings.catch_warnings(): warnings.filterwarnings("ignore", category=RuntimeWarning) d = p.distance(l) print(d) # 后续计算无需再屏蔽,不会触发警告 d = p.distance(l) print(d)
2. 提前触发预处理
可以在正式计算前先调用一次计算,触发Shapely的预处理/缓存机制,后续计算就不会再弹出警告:
from shapely.geometry import Point, LineString p = Point([444037.45235923684, 4432768.940062214]) l = LineString([...]) # 省略几何数据 # 首次计算触发预处理(可忽略结果) _ = p.distance(l) # 后续正式计算无警告 d = p.distance(l) print(d)
内容的提问来源于stack exchange,提问作者Orange9921
相关产品推荐
相关产品推荐

