You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 20:50:54