使用Go的orb与wkb读取PostGIS Geometry失败,如何修复?
解决Go读取PostGIS几何数据时WKB解析失败的问题
问题核心是PostGIS返回的是十六进制编码的WKB字符串,而github.com/paulmach/orb的wkb.Unmarshal需要的是原始二进制字节,直接传入十六进制字符串的字节会触发"wkb: invalid data"错误。
修改你的Scan方法,先把十六进制字符串解码为原始二进制,再传给wkb.Unmarshal即可。以下是完整实现示例:
import ( "encoding/hex" "fmt" "github.com/paulmach/orb" "github.com/paulmach/orb/wkb" ) // 自定义Geometry类型,包装orb.Geometry type Geometry struct { orb.Geometry } // 实现sql.Scanner接口 func (g *Geometry) Scan(value interface{}) error { var hexStr string // 兼容数据库返回的[]byte或string类型 switch v := value.(type) { case []byte: hexStr = string(v) case string: hexStr = v default: return fmt.Errorf("unsupported data type for Geometry: %T", value) } // 将十六进制字符串解码为WKB原始二进制字节 wkbBytes, err := hex.DecodeString(hexStr) if err != nil { return fmt.Errorf("failed to decode hex WKB: %w", err) } // 解析二进制WKB到orb.Geometry return wkb.Unmarshal(wkbBytes, &g.Geometry) }
关键注意点
- PostGIS默认输出十六进制格式的WKB(而非原始二进制),这是导致解析失败的直接原因
hex.DecodeString会把类似01030000...的十六进制字符串转换成符合WKB规范的原始字节流- 处理
value时要兼容[]byte和string两种类型,不同PostgreSQL驱动返回的几何数据类型可能存在差异
修改完成后,你的自定义Geometry类型就能正确读取PostGIS中的Polygon等几何对象了。
内容的提问来源于stack exchange,提问作者배상일
相关产品推荐
相关产品推荐

