【发布时间】:2021-01-28 21:48:01
【问题描述】:
在循环操作中将 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')
【问题讨论】:
-
当前的解决方法是返回到 arcgis,使用复制工具并取消选中 z 值框。上面的代码在它自己的环境中,所以无法访问 arcpy。
-
它是什么几何形状?使用地理数据框,每一行都有一个形状良好的对象作为其几何形状
-
基本上,您需要删除此示例中处理数据库的所有代码。从具有代表性的地理数据框开始,可能有 5 行和简化的几何图形
-
@PaulH 在这种情况下它是折线数据,但它也可以是点或多边形。本质上,我有一个 gdf,比如“roads”,它有一个几何列,在 gdf geom =
MULTILINESTRING Z ((477195.399 215965.386 76.2...中。如您所见,它具有 z 几何形状,所以我不确定如何解决这个问题。 -
构建一个最小的、可重现的示例(手动使用大约 5 个非常简单的几何图形),然后我们会带您上路。但是数据库连接与您的问题无关。在这里阅读更多:stackoverflow.com/help/minimal-reproducible-example
标签: python-3.x sqlalchemy postgis psycopg2 geopandas