如何使用append/extend累积几何对象并保存为GeoDataFrame的geometry字段
问题原因&解决方法
你的报错核心是pointlist和polylist中混入了大量非Shapely合法几何对象的内容,GeoPandas构造GeoDataFrame的geometry列只接受由*Shapely几何实例(Point/Polygon/LineString等)*组成的列表,你的代码里三类错误操作导致列表内容不符合要求:
- 多余的
append(list(Point(...).geometry))操作:这一步把Shapely几何对象转成了坐标列表,列表不属于合法几何类型,直接触发类型错误 - 错误对单个几何对象使用
extend方法:extend会将可迭代对象的元素逐个拆解插入列表,单个Shapely几何迭代时会返回坐标分量(比如Point会拆成x、y两个浮点数,Polygon会拆成外边界坐标元组),拆解后插入的内容都不是几何对象 - 代码缩进出错:
poly = Polygon(poly)这行缩进错误,只会保留循环最后一次的Polygon构造结果
修正后代码
import geopandas as gpd from shapely.geometry import Point, Polygon pointlist = [] polylist = [] # 此处默认你的lon、lat、land变量已提前正确定义 for j, i in land: # 仅插入Point实例本身即可 pointlist.append(Point(lon[i], lat[j])) # 构造Polygon后直接插入实例 poly_coord = [(lon[i], lat[j+1]), (lon[i+1], lat[j+1]), (lon[i+1], lat[j]), (lon[i], lat[j])] polylist.append(Polygon(poly_coord)) # 构造GeoDataFrame时可直接指定crs,无需额外调用set_crs shp_1 = gpd.GeoDataFrame(geometry=polylist, crs="EPSG:4326") shp_2 = gpd.GeoDataFrame(geometry=pointlist, crs="EPSG:4326")
append与extend的正确使用场景
- 插入单个几何对象:用
append,比如pointlist.append(Point(120, 30)) - 插入另一个几何列表的所有元素:用
extend,比如你有另一个存Point的列表extra_points,要把这些点全部加到pointlist里,就写pointlist.extend(extra_points)
内容的提问来源于stack exchange,提问作者user16708120
相关产品推荐
相关产品推荐

