使用Geopandas的sjoin函数返回NaN值问题求助
问题排查与修正方案
核心问题分析
你的代码存在以下关键错误,直接导致polygonExport出现NaN值:
- DataFrame结构错误:单条数据未包裹在列表中,生成的
df字段值被拆分为多行,而非单条完整记录。 - CT数据集未正确格式化:未给CT数据集指定列名,无法提取有效经纬度生成多边形。
- 点坐标顺序错误:Shapely的
Point默认按(经度, 纬度)顺序构造,原代码用反了顺序,导致点位置偏移。 - 多边形未闭合:构造多边形的首尾坐标不一致,形成无效几何,空间关联判断失效。
- 导出对象错误:最终导出的是原始
polygon,而非关联后的polygonExport。
修正后的完整代码
import pandas as pd import geopandas as gpd from shapely.geometry import Point, Polygon # 1. 正确创建单行DataFrame(单条数据需包裹在列表中) data = ['26-05-2022', '25-05-2024', 18, 'Acari', 'Ecorer', 40, -15.572136, -74.62736, 'Valid'] columns = ['Approval', 'Expiring', 'Zone', 'Project', 'Owner', 'Size(MW)', 'Latitude', 'Longitude', 'Status'] df = pd.DataFrame(data=[data], columns=columns) # 2. 按正确顺序创建点GeoDataFrame(经度在前,纬度在后) geom = [Point(xy) for xy in zip(df['Longitude'], df['Latitude'])] gdf = gpd.GeoDataFrame(df, crs='epsg:4326', geometry=geom) # 3. 格式化CT数据集为带列名的DataFrame ct_columns = ['ID', 'X', 'Y', 'Approval', 'Expiring', 'Zone', 'Project', 'Owner', 'Size(MW)', 'Latitude', 'Longitude', 'Status'] CT = pd.DataFrame(List, columns=ct_columns) # 4. 提取坐标并闭合多边形(首尾点一致) CTP = CT[['Longitude', 'Latitude']] closed_coords = CTP.values.tolist() closed_coords.append(closed_coords[0]) # 添加首坐标到末尾,闭合多边形 polygon_geom = Polygon(closed_coords) # 5. 创建多边形GeoDataFrame polygon = gpd.GeoDataFrame(index=[0], crs='epsg:4326', geometry=[polygon_geom]) # 6. 执行空间关联 polygonExport = polygon.sjoin(gdf, how='left') # 7. 导出关联后的结果 # polygonExport.to_file(filename=url + projectName + '.shp', driver="ESRI Shapefile") print(polygonExport) # 测试时可先打印验证结果
关键修正说明
- 坐标顺序:EPSG:4326坐标系下,Shapely
Point需按(经度, 纬度)传入,否则点会出现在错误位置,无法匹配多边形。 - 多边形闭合:只有首尾坐标一致的多边形才是有效几何,空间关联才能正常执行。
- DataFrame结构:单条数据必须用列表包裹,才能生成单行的有效记录。
- CT数据集列名:明确指定列名后,才能正确提取经纬度字段构造多边形。
执行修正后的代码,polygonExport将正确关联点数据,不再出现NaN值。
内容的提问来源于stack exchange,提问作者Maria Fernanda
相关产品推荐
相关产品推荐

