首頁  >  文章  >  後端開發  >  如何在 Golang 中使用 Gorm 插入和檢索 PostGIS 幾何圖形?

如何在 Golang 中使用 Gorm 插入和檢索 PostGIS 幾何圖形?

Barbara Streisand
Barbara Streisand原創
2024-11-08 22:11:02664瀏覽

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

使用Gorm 插入和選擇PostGIS 幾何:綜合指南

使用Golang,您可以輕鬆地通過Gorm 插入和檢索幾何類型,流行的ORM。本指南將引導您完成整個過程,利用 orb 函式庫來定義和編碼/解碼幾何圖形。

Orb 和眾所周知的二進位(WKB) 格式

Orb提供Scan() 和Value() 方法,使Gorm 的Insert() 和Scan() 函數能夠超越原語。 Orb 需要 WKB 格式的幾何圖形。因此,我們在查詢和插入期間分別使用 PostGIS 函數 ST_AsBinary() 和 ST_GeomFromWKB()。

Gorm 的挑戰

Gorm 自動處理值插入和資料掃描,這使得應用我們的自訂函數變得具有挑戰性。直接插入二進位資料失敗,而查詢結果為十六進位格式。

潛在解決方案

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn