首页  >  文章  >  后端开发  >  如何在 Golang 中使用 Gorm 插入和检索 PostGIS 几何图形?

如何在 Golang 中使用 Gorm 插入和检索 PostGIS 几何图形?

Barbara Streisand
Barbara Streisand原创
2024-11-08 22:11:02662浏览

How Can I Insert and Retrieve PostGIS Geometries with Gorm in Golang?

使用 Gorm 插入和选择 PostGIS 几何:综合指南

使用 Golang,您可以轻松地通过 Gorm 插入和检索几何类型,流行的 ORM。本指南将引导您完成整个过程,利用 orb 库来定义和编码/解码几何图形。

Orb 和众所周知的二进制 (WKB) 格式

Orb提供 Scan() 和 Value() 方法,使 Gorm 的 Insert() 和 Scan() 函数能够超越原语。 Orb 需要 WKB 格式的几何图形。因此,我们在查询和插入期间分别使用 PostGIS 函数 ST_AsBinary() 和 ST_GeomFromWKB()。

Gorm 的挑战

Gorm 自动处理值插入和数据扫描,这使得应用我们的自定义函数变得具有挑战性。直接插入二进制数据失败,而查询结果为十六进制格式。

潜在解决方案

a.视图: 创建自动应用所需功能的视图可以方便查询,但不利于插入。

b.触发器或规则:通过触发器或规则对传入/传出数据进行自动函数调用可以提供解决方案,但并不普遍适用。

c。自定义数据模型扫描:扫描整个数据模型并以编程方式生成查询是一种可能的方法,但不是最佳方法。

使用 GeoJSON 编码的解决方案

有效的替代方案Orb 是使用 geojson 编码库。这种方法消除了手动字节操作的需要:

代码:

<code class="go">import "github.com/twpayne/go-geom/encoding/geojson"

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()
}

type Track struct {
    gorm.Model

    GeometryPoint EWKBGeomPoint `gorm:"column:geom"`
}</code>

表设置自定义:

<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
}

err = gormigrate.New(db, gormigrate.DefaultOptions, []*gormigrate.Migration{
{
    ID: "init",
    Migrate: func(tx *gorm.DB) error {
        return tx.CreateTable(
            Tables...,
        ).Error
    },
},
{
    ID: "tracks_except_geom",
    Migrate: func(tx *gorm.DB) error {
        return db.AutoMigrate(Track{}).Error
    },
},
}).Migrate()</code>

通过这些修改,您可以使用 Gorm 无缝插入和提取几何类型,为您的 Go 应用程序提供地理空间支持能力。

以上是如何在 Golang 中使用 Gorm 插入和检索 PostGIS 几何图形?的详细内容。更多信息请关注PHP中文网其他相关文章!

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