Golang の Gorm を使用して PostGIS ジオメトリを挿入および取得するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-11-08 22:11:02
オリジナル
651 人が閲覧しました

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

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート