导出GIS数据时geometry字段需转为WKT或WKB:PostGIS用ST_AsText()转WKT(人工核对),ST_AsBinary()转WKB(供shapely/GeoPandas);禁用CAST(geom AS TEXT);CSV中WKT需双引号包裹。
导出时 geometry 字段变成 WKT 或 WKB?先确认目标系统要什么
gis 数据导出最常卡在字段格式不匹配:数据库里存的是 geometry 类型,但 excel、csv 或下游 api 只认文本(如 point(116.4 39.9))或字节流(0101000000...)。直接 select 会报错或显示乱码,不是数据丢了,是类型没“摊开”。
实操建议:
- 用
ST_AsText()(PostGIS)或AsText()(MySQL 8.0+)转成可读的 WKT,适合人工核对或导入非 GIS 工具 - 用
ST_AsBinary()或AsBinary()得到 WKB,适合传给 Python 的shapely.wkb.loads()或 GeoPandas - 别用
CAST(geom AS TEXT)—— 多数数据库不支持,会报cannot cast type geometry to text - 若导出到 CSV,WKT 字符串里含逗号和括号,务必用双引号包裹字段,否则 Excel 打开错列
QGIS 导出 Shapefile 时属性表缺字段?检查图层源是否为视图或带 JOIN
QGIS 界面点“导出 → 另存为 → Shapefile”,看着成功了,打开属性表却发现某些字段没了——大概率是因为原始图层是数据库视图、SQL 查询结果,或用了 JOIN,而 Shapefile 不支持复杂字段类型(比如数组、JSON、geometrycollection)和 NULL 值过多的列。
实操建议:
- 导出前,在 QGIS 层面板右键 → “属性” → “字段” 标签页,看灰色字段名是否标有
(not supported) - 用
SELECT显式列出需要的字段,把 JSON 字段用jsonb_extract_path_text()拆成字符串,把数组用array_to_string()拉平 - Shapefile 字段名不能超 10 字符、不能含空格或特殊符号,
ST_Transform(geom, 4326)后再导出,避免坐标系不一致导致几何失效 - 如果只要属性表不要几何,选“仅导出属性表”并保存为 CSV,比硬塞进 Shapefile 更稳
Python 用 GeoPandas 导出带空间信息的 Excel?得拆成两步走
GeoPandas 的 to_file() 支持 GeoJSON、Shapefile,但不支持 Excel;而 to_excel() 会直接丢掉 geometry 列——它根本不知道怎么序列化一个 Point 对象。
实操建议:
- 先用
gdf.to_crs(epsg=4326)统一坐标系,再用gdf.geometry.x和gdf.geometry.y提取经纬度(仅限点) - 对线/面,用
gdf.to_wkt()新增一列,内容是完整 WKT 字符串,Excel 能存,但没法地图渲染 - 别用
gdf.drop('geometry', axis=1).to_excel(...)就完事——漏掉投影信息,下游可能误用平面坐标当经纬度算距离 - 如果必须保留可重绘能力,改导出为
gdf.to_file("data.gpkg", driver="GPKG"),GeoPackage 是单文件、支持属性+空间+坐标系,Excel 用户装 QGIS 插件就能打开
ogr2ogr 导出时中文字段名乱码或几何变形?关键在编码和坐标系参数
用命令行导出时出现字段名变问号、多边形缩成一团、点全挤在北京原点,基本是 ogr2ogr 没说清源数据的编码和 CRS,它按默认瞎猜。
实操建议:
- PostGIS 导出加
-lco ENCODING=UTF-8(不是-encoding),否则 CSV 或 DBF 里中文字段名崩成??? - 强制指定源坐标系:
-s_srs EPSG:3857,目标坐标系:-t_srs EPSG:4326,不写就可能用错基准面,尤其国内 GCJ-02 / BD-09 偏移明显 - 导出为 GeoJSON 时加
-lco COORDINATE_PRECISION=6,避免小数位太多拖慢加载,也防止精度溢出失真 - 别省略
-f "ESRI Shapefile"参数——漏了可能默认输出为 MapInfo 格式,后缀是 .tab,但实际内容不兼容
空间字段不是普通字符串,格式化本质是「告诉上下游:这是坐标,按这个规则解」。少一层转换说明,就多一个坐标偏移或字段截断的风险。尤其跨部门交数据时,光发个 CSV 还得附上 CRS 编号和 WKT 解析方式,不然对方拿 ST_GeomFromText() 一试就报错。

















