Navicat Premium 不支持直接导出 PostgreSQL 表为 GeoJSON;必须在查询编辑器中用 SQL 调用 ST_AsGeoJSON() 等 PostGIS 函数生成标准 FeatureCollection,再以 Text 格式导出并手动清理标题行,确保开头为 {"type":"FeatureCollection",...}。

Navicat Premium 本身不支持直接将 PostgreSQL 表导出为 GeoJSON 格式——它没有「导出为 GeoJSON」菜单项,也不会自动识别 geometry 或 geography 字段并做空间坐标序列化。你看到的导出选项里只有 JSON、CSV、Excel 等通用格式,选了也没用。
为什么 Navicat 导出不了真正的 GeoJSON?
GeoJSON 是一种有严格结构规范的空间数据交换格式(必须含 type、features、geometry、properties),而 Navicat 的「导出向导 → JSON」只做扁平化行转对象,完全忽略 PostGIS 的空间函数和坐标系元信息。即使表里有 ST_AsGeoJSON(geom) 字段,导出时也只当普通文本处理,不保证外层包裹 {"type":"FeatureCollection","features":[...]} 结构,更不会补 crs 或 bbox。
- Navicat 不调用
ST_AsGeoJSON()、ST_Transform()等 PostGIS 函数,导出逻辑绕过空间引擎 - 导出结果若含 WKB 字段(如
\x0101000020E6100000...),会原样输出为乱码字符串,根本不可解析 - 即使手动 SELECT 出
ST_AsGeoJSON(geom),Navicat 也不合并多行结果为合法 FeatureCollection,每行仍是独立 JSON 字符串
必须用 SQL 查询生成合法 GeoJSON
真正可行的方式是:在 Navicat 的查询编辑器中写 SQL,让 PostgreSQL 自己组装标准 GeoJSON,再把结果导出为纯文本文件(后缀改为 .geojson)。
- 基础模板(单表、WGS84):
SELECT jsonb_build_object( 'type', 'FeatureCollection', 'features', jsonb_agg(features.feature) ) FROM ( SELECT jsonb_build_object( 'type', 'Feature', 'id', id, 'geometry', ST_AsGeoJSON(geom)::jsonb, 'properties', to_jsonb(row) - 'id' - 'geom' ) AS feature FROM ( SELECT id, geom, name, area FROM public.places ) row ) features; - 需要重投影(如转 Web Mercator):
ST_AsGeoJSON(ST_Transform(geom, 3857)) - 字段太多不想手动列?用
to_jsonb(t) - 'geom'动态排除空间列,但注意:PostgreSQL 14+ 才支持-操作符删 key;旧版本需显式写jsonb_build_object('name', name, 'area', area) - 导出前务必执行
SET client_encoding = 'UTF8';,否则中文属性值会变\uXXXX或乱码
导出后还要手动处理的三个关键点
Navicat 导出的文本默认带列标题、行号、分隔线,不是纯 JSON。你得清理才能被 QGIS、Leaflet 正确加载。
- 在「导出向导」中:格式选
Text(不是 JSON),勾选「导出查询结果」,取消「导出表结构」和「导出列名」 - 导出文件打开后,删除第一行(通常是
jsonb_build_object)和空行,确保开头就是{"type":"FeatureCollection",... - 若数据量大(>10 万要素),Navicat 可能内存溢出或卡死——改用
COPY (上述查询) TO '/path/out.geojson' WITH (FORMAT text);命令行方式更稳
最易被忽略的是坐标系声明:GeoJSON 规范已弃用 crs 字段,但部分老工具(如早期 Leaflet 插件)仍依赖它。如果目标系统要求显式 CRS,你得在 jsonb_build_object() 里手动加 'crs', jsonb_build_object('type', 'name', 'properties', jsonb_build_object('name', 'EPSG:4326')),但这属于非标扩展,现代系统通常默认 WGS84。











