创建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
相关产品推荐
相关产品推荐

