GeoDataFrame两点距离计算出现KeyError问题求助
遍历GeoDataFrame计算相邻点距离时触发KeyError:1的问题
背景与需求
我正按索引遍历GeoDataFrame中的点,依次对比索引0和1、1和2、2和3的点:若两点位置相同则跳过,否则在两点间绘制线并汇总统计信息。原本计划通过判断两点距离是否为0来跳过重复点,数据采用投影坐标系(单位为米),做法是将包含两个点的GeoDataFrame传入一个返回距离值的函数。
初始函数代码
def getdist(pt_pair): shift_pt = pt_pair.shift() return pt_pair.distance(shift_pt)[1]
出现的错误
传入两个点时,前两组返回0.0,下一组返回NaN,随后触发如下错误:
Traceback (most recent call last): File "C:/.../PycharmProjects/.../vessel_track_builder.py", line 33, in <module> print(getdist(set_pts)) File "C:/.../PycharmProjects/.../vessel_track_builder.py", line 19, in getdist if math.isnan(mdist1.distance(shift_pt)[1]): File "C:\OSGEO4~1\apps\Python37\lib\site-packages\pandas\core\series.py", line 871, in __getitem__ result = self.index.get_value(self, key) File "C:\OSGEO4~1\apps\Python37\lib\site-packages\pandas\core\indexes\base.py", line 4405, in get_value return self._engine.get_value(s, k, tz=getattr(series.dtype, "tz", None)) File "pandas\_libs\index.pyx", line 80, in pandas._libs.index.IndexEngine.get_value File "pandas\_libs\index.pyx", line 90, in pandas._libs.index.IndexEngine.get_value File "pandas\_libs\index.pyx", line 138, in pandas._libs.index.IndexEngine.get_loc File "pandas\_libs\hashtable_class_helper.pxi", line 997, in pandas._libs.hashtable.Int64HashTable.get_item File "pandas\_libs\hashtable_class_helper.pxi", line 1004, in pandas._libs.hashtable.Int64HashTable.get_item KeyError: 1 Process finished with exit code 1
尝试的修改方案
我猜测是点几何的问题,于是在函数中添加NaN判断并返回0:
def getdist(pt_pair): shift_pt = pt_pair.shift() if math.isnan(pt_pair.distance(shift_pt)[1]): return 0 else: return pt_pair.distance(shift_pt)[1]
结果前两次返回0.0和0,之后仍触发相同的KeyError:1错误。
打印的GeoDataFrame内容
未发现异常:
index ... MMSI MONTH geometry 0 92 ... 123 4 POINT (2221098.494 1668358.870) 1 39 ... 123 4 POINT (2221098.494 1668358.870) [2 rows x 12 columns] index ... MMSI MONTH geometry 1 39 ... 456 4 POINT (2221098.494 1668358.870) 2 3231 ... 456 4 POINT (2221098.494 1668358.870) [2 rows x 12 columns] index ... MMSI MONTH geometry 2 3231 ... 789 4 POINT (2221098.494 1668358.870) 3 1032 ... 789 4 POINT (2221098.494 1668358.870)
遍历逻辑代码
for mmsi in points_gdf.MMSI.unique(): track_pts = points_gdf[(points_gdf.MMSI == mmsi)].sort_values(['POSITION_UTC_DATE']).reset_index() print(track_pts.shape[0]) for index, row in track_pts.iterrows(): if index + 1 < track_pts.shape[0]: set_pts = track_pts[(track_pts.index == index) | (track_pts.index == index + 1)] print(set_pts) print(getdist(set_pts)) else: sys.exit()
疑问点
用简单测试点测试时运行正常,因此怀疑是传入GeoDataFrame的方式有问题。由于需要按顺序对比每个点与下一个点,用索引维持顺序,会不会是这个原因导致的错误?另外,我注意到索引列在QGIS中看不到(QGIS里第一列是OBJECTID,数据存储在文件地理数据库中),会不会是索引列引发的问题?
内容的提问来源于stack exchange,提问作者MrKingsley
相关产品推荐
相关产品推荐

