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

创建GeoDataFrame时报错:unhashable type: 'Point' 求解

问题解决:TypeError: unhashable type: 'Point'

先纠正一个误解

shapely的reverse()方法仅适用于LineString、Polygon这类有方向的几何对象,Point是无方向的单点,根本没有这个方法,不用在这上面浪费时间。

错误原因

TypeError: unhashable type: 'Point'本质是因为你把shapely Point对象用到了需要哈希值的场景里——比如作为字典的键、集合的元素、pandas分组(groupby)的键,或者创建DataFrame时不小心把它当成了可哈希的列来处理。Point是可变对象,本身就不可哈希,和拷贝(包括deepcopy)没关系,拷贝多少次它还是不可哈希的Point类型。

解决方案

根据你的需求分两种情况处理:

1. 把Point作为GeoDataFrame的几何列

这是GeoDataFrame的标准用法,必须通过geometry参数指定,不要把几何对象丢到普通列里:

from shapely.geometry import Point
import geopandas as gpd
import pandas as pd

# 循环内创建临时数据
temp_data = {'id': [1], 'value': [20]}
temp_point = Point(116.397, 39.908)  # 单个Point对象
temp_gdf = gpd.GeoDataFrame(temp_data, geometry=[temp_point], crs='EPSG:4326')

# 循环外初始化空列表,每次循环追加临时GDF
all_gdfs = []
all_gdfs.append(temp_gdf)
# 循环结束后拼接所有GDF
final_gdf = gpd.GeoDataFrame(pd.concat(all_gdfs, ignore_index=True), crs='EPSG:4326')

2. 把Point作为普通属性列(非几何)

如果确实需要把Point的信息存在普通列里,不要直接存Point对象,转成可哈希的格式:

  • 转成坐标元组:(x, y)
  • 拆分成单独的x、y列
  • 转成字符串格式(比如"116.397,39.908")

示例代码:

# 方式1:存坐标元组
temp_data = {'id': [1], 'point_coord': [(116.397, 39.908)]}
# 方式2:拆分x、y列
temp_data = {'id': [1], 'pt_x': [116.397], 'pt_y': [39.908]}

# 结合几何列(如果需要)
temp_point = Point(116.397, 39.908)
temp_gdf = gpd.GeoDataFrame(temp_data, geometry=[temp_point], crs='EPSG:4326')

循环拼接注意事项

每次循环创建的临时GeoDataFrame要确保:

  • 几何列通过geometry参数正确指定
  • 普通列没有直接存储Point对象
  • 拼接时用pd.concat,并加上ignore_index=True避免索引冲突

内容的提问来源于stack exchange,提问作者Drömbüddel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 22:13:37