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