SHP文件与PostGIS数据库Geom字段:WKB/EWKB高精度互转最全踩坑总结 📅 2026/6/26 2:27:00 三种几何格式通俗区分重点1、WKT人看的明文示例POINT \(107\.503611000347 35\.6885570000056\)特点可读、简单、不带坐标系。2、WKB标准二进制示例0101000000fab9a1293be05a404837c2a222d84140特点纯几何不带SRID坐标系PostGIS不原生存储这种。3、EWKBPostGIS真实存储格式⭐重点示例0101000020E6100000FCB9A1293BE05A405037C2A222D84140多出一段20E6100000SRID4326结论PostGIS库里Geom字段存的全部是EWKB不是WKB。三、最容易踩的坑你今天全部遇到过坑1小数点位数不同二进制完全不同看上去几乎一样的坐标原始高精度POINT \(107\.503611000347 35\.6885570000056\)四舍五入后POINT \(107\.503611 35\.688557\)二进制EWKB完全不一样绝对不能混用。原因浮点二进制存储极其敏感哪怕末尾0.0000000001差异Hex串完全改变。坑2QGIS导出WKT默认丢精度QGIS导出CSV时自动压缩小数位永远得不到SHP原生高精度坐标所以转出来Hex永远和数据库对不上。四、生产通用万能SQL可直接收藏1、正向生成高精度EWKB和数据库一模一样-- WKT 转 PostGIS 原生存储 EWKB 十六进制SELECT encode(ST_AsEWKB(ST_SetSRID(ST_GeomFromText(POINT (107.503611000347 35.6885570000056)),4326)),hex) AS geom_hex;2、逆向解析Hex原始Geom逆推高精度WKT解决endian报错、唯一正确写法-- EWKB十六进制 逆推 原始高精度坐标SELECT ST_AsText(ST_GeomFromEWKB(decode(0101000020E6100000A428756E7F145840C0D39D279E454440, hex))) AS wkt_point;3、批量解析库里所有Geom生产常用SELECTid,ST_AsText(ST_GeomFromEWKB(decode(geom, hex))) AS wkt_pointFROM 你的表名;五、如何拿到SHP原生高精度Hex不用计算最稳定、零误差方案超图iDesktopSHP导入UDB文件数据源不要直接进数据库打开属性表查看Shape字段该字段值 数据库真实存储EWKB✅ 无需转换、无精度丢失、完全一致。六、最终总结最简背诵版数据库存的是EWKB带4326坐标系头坐标小数少一位Hex完全不一样QGIS导出WKT会丢精度不可用于比对逆推Hex必须加decode(xxx,#39;hex#39;)否则endian报错