如何使用 Gorm 和 EWKB 插入和選擇 PostGIS 幾何類型?

使用Gorm 插入和選擇PostGIS 幾何
問題:
在GoGIS 中,使用Gorm 插入和擷取Post 幾何幾何由於Gorm 的自動插入和資料掃描,透過Orb 庫的類型帶來了挑戰。簡單地將二進位資料插入幾何列是不夠的,查詢會傳回十六進位結果。
解決方案:
使用 @robbieperry22 答案作為靈感,一種方法不同的編碼庫消除了位元組操作的需要。
實作:
- 為幾何型別建立自訂Scan() 與Value() 方法,類似:
<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>
- 自訂表格建立以避免幾何列的預設Gorm 行為:
<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中文網其他相關文章!
熱AI工具
Undress AI Tool
免費脫衣圖片
Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片
AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。
Clothoff.io
AI脫衣器
Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!
熱門文章
熱工具
記事本++7.3.1
好用且免費的程式碼編輯器
SublimeText3漢化版
中文版,非常好用
禪工作室 13.0.1
強大的PHP整合開發環境
Dreamweaver CS6
視覺化網頁開發工具
SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)
如何在GO中的結構實例上調用方法?
Jun 24, 2025 pm 03:17 PM
在Go語言中,調用結構體方法需先定義結構體和綁定接收者的方法,使用點號訪問。定義結構體Rectangle後,可通過值接收者或指針接收者聲明方法;1.使用值接收者如func(rRectangle)Area()int,通過rect.Area()直接調用;2.若需修改結構體,應使用指針接收者如func(r*Rectangle)SetWidth(...),Go會自動處理指針與值的轉換;3.嵌入結構體時,內嵌結構體的方法會被提升,可直接通過外層結構體調用;4.Go無需強制使用getter/setter,字
GO中的接口是什麼?如何定義它們?
Jun 22, 2025 pm 03:41 PM
在Go語言中,接口是一種定義行為而不指定實現方式的類型。接口由方法簽名組成,任何實現這些方法的類型都自動滿足該接口。例如,定義一個Speaker接口包含Speak()方法,則所有實現該方法的類型均可視為Speaker。接口適用於編寫通用函數、抽象實現細節和測試中使用mock對象。定義接口使用interface關鍵字並列出方法簽名,無需顯式聲明類型實現了接口。常見用例包括日誌、格式化、不同數據庫或服務的抽象,以及通知系統等。例如,Dog和Robot類型均可實現Speak方法,並傳遞給同一個Anno
將Golang服務與現有Python基礎架構集成的策略
Jul 02, 2025 pm 04:39 PM
TOIntegrategolangServicesWithExistingPypythoninFrasture,userestapisorgrpcForinter-serviceCommunication,允許GoandGoandPyThonAppStoStoInteractSeamlessSeamLlyThroughlyThroughStandArdArdAdrotized Protoccols.1.usererestapis(ViaFrameWorkslikeSlikeSlikeGiningOandFlaskInpyThon)Orgrococo(wirs Propococo)
我如何使用時間軟件包來處理GO的時間和持續時間?
Jun 23, 2025 pm 11:21 PM
Go的time包提供了處理時間和持續時間的功能,包括獲取當前時間、格式化日期、計算時間差、處理時區、調度和休眠等操作。要獲取當前時間,使用time.Now()獲取Time結構體,並可通過Year()、Month()、Day()等方法提取具體時間信息;通過Format("2006-01-0215:04:05")可將時間格式化為字符串;計算時間差時,用Sub()或Since()獲取Duration對象,再通過Seconds()、Minutes()、Hours()轉換為對應單位;添
我如何根據語句使用語句執行代碼?
Jun 23, 2025 pm 07:02 PM
Ingo,ifstatementSexecuteCodeBasedonConconditions.1.BasicsStructurerunsablockifaconditionistrue,例如IFX> 10 {...}。 2.Elseclausehan dlesfalseconditions,例如,else {...}。 3。 elseifchainsmultipleconditions,例如,elseifx == 10 {...}。 4.variableInitializationInsideIndifif,l
了解Web API的Golang和Python之間的性能差異
Jul 03, 2025 am 02:40 AM
Golangofferssuperiorperformance,nativeconcurrencyviagoroutines,andefficientresourceusage,makingitidealforhigh-traffic,low-latencyAPIs;2.Python,whileslowerduetointerpretationandtheGIL,provideseasierdevelopment,arichecosystem,andisbettersuitedforI/O-bo
去支持並發如何?
Jun 23, 2025 pm 12:37 PM
Gohandlesconcurrencyusinggoroutinesandchannels.1.GoroutinesarelightweightfunctionsmanagedbytheGoruntime,enablingthousandstorunconcurrentlywithminimalresourceuse.2.Channelsprovidesafecommunicationbetweengoroutines,allowingvaluestobesentandreceivedinas
如何使用lock()和unlock()方法來保護GO中的重要代碼部分?
Jun 23, 2025 pm 08:37 PM
在Go中保護臨界區的標準方法是使用sync.Mutex的Lock()和Unlock()方法。 1.聲明一個mutex並將其與要保護的數據一起使用;2.在進入臨界區前調用Lock(),確保只有一個goroutine能訪問共享資源;3.使用deferUnlock()確保鎖始終被釋放,避免死鎖;4.盡量縮短臨界區內的操作以提高性能;5.對於讀多寫少的場景,應使用sync.RWMutex,通過RLock()/RUnlock()進行讀操作,通過Lock()/Unlock()進行寫操作,從而提升並發效率。


