如何用Python将GeoJSON几何对象导入PostgreSQL数据库?
解决PostgreSQL导入GeoJSON几何对象的错误
问题根源
你传递给ST_GeomFromGeoJSON的是Python字典对象,而这个PostGIS函数需要的是JSON格式的字符串;另外代码里(geometry)不是合法的Python元组(单元素元组必须加逗号),导致参数解析错误,触发了函数不匹配的提示。
方法一:修正callproc调用方式
将几何字典转为JSON字符串,同时修正元组传递的格式问题:
import json ... cursor = conn.cursor() data = json.load(json_file) for row in data['features']: # 补全原代码遗漏的冒号 geometry = row['geometry'] # 把Python字典转为标准JSON字符串 geom_json_str = json.dumps(geometry) # 单元素参数必须加逗号,确保是元组类型 params = (geom_json_str,) cursor.callproc('ST_GeomFromGeoJSON', params) wkb_geometry = cursor.fetchone()[0] sql = "INSERT INTO tbl(wkb_geometry) VALUES (%s)" val = (wkb_geometry,) # 同样修正元组格式 cursor.execute(sql, val) conn.commit() ...
方法二:直接在INSERT语句中处理(更简洁)
无需额外调用callproc,直接在SQL语句里完成GeoJSON转几何对象的操作:
import json ... cursor = conn.cursor() data = json.load(json_file) for row in data['features']: geometry = row['geometry'] geom_json_str = json.dumps(geometry) # 直接在INSERT中调用PostGIS函数,省略中间步骤 sql = "INSERT INTO tbl(wkb_geometry) VALUES (ST_GeomFromGeoJSON(%s))" val = (geom_json_str,) cursor.execute(sql, val) conn.commit() ...
额外注意事项
- 确保你的PostgreSQL数据库已安装并启用PostGIS扩展,且目标表的
wkb_geometry字段类型为GEOMETRY或GEOGRAPHY。 - 如果需要指定空间参考(比如WGS84坐标系EPSG:4326),可以修改SQL为:
INSERT INTO tbl(wkb_geometry) VALUES (ST_SetSRID(ST_GeomFromGeoJSON(%s), 4326))
内容的提问来源于stack exchange,提问作者kiks73
相关产品推荐
相关产品推荐

