問題:
Go で Gorm を使用して PostGIS ジオメトリを挿入および取得するOrb ライブラリを介した型の挿入には、Gorm の自動挿入とデータ スキャンが原因で課題が生じます。バイナリ データをジオメトリ列に挿入するだけでは十分ではなく、クエリを実行すると 16 進数の結果が返されます。
解決策:
@robbieperry22 の回答をインスピレーションとして使用し、エンコード ライブラリが異なるため、バイト操作の必要がなくなります。
<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>
<code class="go">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 } // 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 中国語 Web サイトの他の関連記事を参照してください。