ホームページ >バックエンド開発 >Golang >Gorm を使用して PostGIS ジオメトリ タイプを挿入および選択するにはどうすればよいですか?

Gorm を使用して PostGIS ジオメトリ タイプを挿入および選択するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-05 10:50:02336ブラウズ

How can I insert and select PostGIS geometry types with Gorm?

Gorm を使用した PostGIS ジオメトリの挿入と選択

Orb とカスタム値のスキャンとマーシャリングの使用

PostGIS ジオメトリの挿入と取得Gorm を使用するタイプは難しい場合があります。この問題に対処するために、ユーザーは Orb ライブラリを利用し、カスタムの Scan() メソッドと Value() メソッドを実装して、Go タイプと Gorm が期待する既知のバイナリ (WKB) 形式の間で変換することができます。以下に例を示します。

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

これらのメソッドを構造体に実装すると、Gorm の自動スキャンおよび挿入機能がジオメトリ タイプでシームレスに動作します。

カスタム移行によるテーブル セットアップ

必要なジオメトリ列を含むテーブルを作成するには、カスタム移行手順を使用して列タイプを構成できます。

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

この移行により、ジオメトリ列が残りの列よりも前に作成されます。テーブル構造のセットアップが完了しました。

使用例

カスタムの Scan()、Value()、および移行ステップが実装されたら、次のジオメトリ タイプを使用します。 Gorm モデルは簡単になります:

type Track struct {
    gorm.Model

    GeometryPoint EWKBGeomPoint `gorm:"column:geom"`
}

この設定により、Gorm は PostGIS ジオメトリ タイプを簡単に挿入および選択できるため、Go アプリケーションでジオメトリ データをシームレスに使用できるようになります。

以上がGorm を使用して PostGIS ジオメトリ タイプを挿入および選択するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。