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