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 サイトの他の関連記事を参照してください。