首页 >后端开发 >Golang >如何使用 Gorm 和 EWKB 插入和选择 PostGIS 几何类型?

如何使用 Gorm 和 EWKB 插入和选择 PostGIS 几何类型?

Barbara Streisand
Barbara Streisand原创
2024-11-05 22:43:021025浏览

How to Insert and Select PostGIS Geometry Types with Gorm and EWKB?

使用 Gorm 插入和选择 PostGIS 几何

问题:

在 Go 中,使用 Gorm 插入和检索 PostGIS 几何由于 Gorm 的自动插入和数据扫描,通过 Orb 库的类型带来了挑战。简单地将二进制数据插入到几何列中是不够的,查询会返回十六进制结果。

解决方案:

使用 @robbieperry22 答案作为灵感,一种方法不同的编码库消除了字节操作的需要。

实现:

  1. 为几何类型创建自定义 Scan() 和 Value() 方法,类似于:
<code class="go">type EWKBGeomPoint geom.Point

func (g *EWKBGeomPoint) Scan(input interface{}) error {
    gt, err := ewkb.Unmarshal(input.([]byte))
    if err != nil {
        return err
    }
    g = gt.(*EWKBGeomPoint)
    return nil
}

func (g EWKBGeomPoint) Value() (driver.Value, error) {
    b := geom.Point(g)
    bp := &b
    ewkbPt := ewkb.Point{Point: bp.SetSRID(4326)}
    return ewkbPt.Value()
}</code>
  1. 使用几何字段定义模型结构:
<code class="go">type Track struct {
    gorm.Model
    GeometryPoint EWKBGeomPoint `gorm:"column:geom"`
}</code>
  1. 自定义表创建以避免几何列的默认 Gorm 行为:
<code class="go">err = db.Exec(`CREATE TABLE IF NOT EXISTS tracks (
    id SERIAL PRIMARY KEY,
    geom geometry(POINT, 4326) NOT NULL
);`).Error
if err != nil {
    return err
}

// Create table without geom column
mig := gormigrate.New(db, gormigrate.DefaultOptions, []*gormigrate.Migration{
    {
        ID: "tracks_except_geom",
        Migrate: func(tx *gorm.DB) error {
            return tx.AutoMigrate(Track{}).Error
        },
    },
}
mig.Migrate()</code>

这种方法可以在 EWKB 字节和 PostGIS 几何类型之间无缝转换,允许插入和选择几何图形,而无需额外的自定义或手动查询生成。

以上是如何使用 Gorm 和 EWKB 插入和选择 PostGIS 几何类型?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn