Gorm を使用した PostGIS ジオメトリの挿入と選択: 総合ガイド
Golang を使用すると、Gorm を介してジオメトリ タイプを簡単に挿入および取得できます。人気のORM。このガイドでは、Orb ライブラリを利用してジオメトリの定義とエンコード/デコードを行うプロセスについて説明します。
Orb および Well-Known Binary (WKB) 形式
Orb Scan() および Value() メソッドを提供し、Gorm の Insert() および Scan() 関数がプリミティブを超えて動作できるようにします。 Orb には WKB 形式のジオメトリが必要です。したがって、クエリと挿入の際に、それぞれ PostGIS 関数 ST_AsBinary() と ST_GeomFromWKB() を使用します。
Gorm の課題
Gorm は値の挿入とデータ スキャンを自動的に処理します。そのため、カスタム関数を適用するのが困難になります。バイナリ データの直接挿入は失敗しますが、クエリの結果は 16 進形式で返されます。
考えられる解決策
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 中国語 Web サイトの他の関連記事を参照してください。