修复几何没有 z 几何时的 z 列错误

在循环操作中将 geopandas 数据框写入 PostGIS 时出现以下错误(完整代码包含在末尾)

psycopg2.errors.InvalidParameterValue: Column has Z dimension but geometry does not

相关代码: gdf.to_postgis(name=tbl, con=engine, schema=gdb_name, if_exists='replace')

如何从列中删除 z 维度?一些逻辑如:

if geom has no z dimension and column has z dimension:
  alter column remove z dimension

我宁愿留在 sqlalchemy 而不是使用 psycopg2 和 sql ALTER COLUMN 语法。

当 gdf ​​为空时,我已经可以退出了。

完整代码:

from sqlalchemy import *
from sqlalchemy.schema import CreateSchema

if not engine.dialect.has_schema(engine, gdb_name):
    engine.execute(CreateSchema(gdb_name))

# loop through each layer in the layerlist
for layer in layerlist:
    # reads all layers into a dictionary
    layers[layer] = gpd.read_file(COPA_gdb, driver="FileGDB", layer=layer)
    gdf = layers[layer]
    if gdf.empty:
        print(layer + ' dataFrame is empty! Not imported')
    else:
        tbl = layer.lower()
        print(tbl)
        gdf.to_postgis(name=tbl, con=engine, schema=gdb_name, if_exists='replace')
stack overflow Fixing z column error when geometry has no z geometry
原文答案

答案:

作者头像

我也在这里处理这个问题。就我而言,我的地理数据框中有空的几何图形。要修复它,我必须删除空几何图形,如下所示:

gdf = gdf[gdf.is_empty==False]

使用它我可以解决这个问题。


实际上,前面的代码用于特定目的,我发现解决此问题的更好方法是使用以下行:

func = lambda geom: shapely.wkb.loads(shapely.wkb.dumps(geom, output_dimension=2))
gdf['geometry'] = gdf['geometry'].apply(func)